| /* Abstract syntax tree |
| * |
| * SOFTWARE RIGHTS |
| * |
| * We reserve no LEGAL rights to the Purdue Compiler Construction Tool |
| * Set (PCCTS) -- PCCTS is in the public domain. An individual or |
| * company may do whatever they wish with source code distributed with |
| * PCCTS or the code generated by PCCTS, including the incorporation of |
| * PCCTS, or its output, into commerical software. |
| * |
| * We encourage users to develop software with PCCTS. However, we do ask |
| * that credit is given to us for developing PCCTS. By "credit", |
| * we mean that if you incorporate our source code into one of your |
| * programs (commercial product, research project, or otherwise) that you |
| * acknowledge this fact somewhere in the documentation, research report, |
| * etc... If you like PCCTS and have developed a nice tool with the |
| * output, please mention that you developed it using PCCTS. In |
| * addition, we ask that this header remain intact in our source code. |
| * As long as these guidelines are kept, we expect to continue enhancing |
| * this system and expect to make other tools available as they are |
| * completed. |
| * |
| * ANTLR 1.33 |
| * Terence Parr |
| * Parr Research Corporation |
| * with Purdue University and AHPCRC, University of Minnesota |
| * 1989-1995 |
| */ |
| |
| #ifndef PCCTSAST_H |
| #define PCCTSAST_H |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include "config.h" |
| //class SList; |
| |
| #define StringScanMaxText 50 |
| #define MaxTreeStackDepth 400 |
| |
| // |
| // 7-Apr-97 133MR1 signed int not accepted by AT&T cfront |
| // |
| typedef struct stringlexer { |
| int c; // MR1 |
| char *input; |
| char *p; |
| char text[StringScanMaxText]; |
| } StringLexer; |
| |
| /* Define the structures needed for ast_scan() */ |
| typedef struct stringparser { |
| int token; |
| StringLexer *lexer; |
| int num_labels; |
| } StringParser; |
| |
| typedef struct _scanast { |
| struct _scanast *_right, *_down; |
| int _token; |
| int label_num; |
| int type() { return _token; } |
| struct _scanast *right() { return _right; } |
| struct _scanast *down() { return _down; } |
| } ScanAST; |
| |
| #define VALID_SCAN_TOKEN(t) (t>=__LPAREN && t<=__PERIOD) |
| |
| class PCCTS_AST { |
| protected: |
| static char *scan_token_tbl[]; |
| enum { |
| __LPAREN=1, |
| __RPAREN=2, |
| __PERCENT=3, |
| __INT=4, |
| __COLON=5, |
| __POUND=6, |
| __PERIOD=7, |
| __StringScanEOF=-1}; |
| |
| protected: |
| char *scan_token_str(int t); |
| void stringlexer_init(StringLexer *scanner, char *input); |
| void stringparser_init(StringParser *, StringLexer *); |
| ScanAST *stringparser_parse_scanast(char *templ, int *n); |
| ScanAST *stringparser_parse_tree(StringParser *parser); |
| ScanAST *stringparser_parse_element(StringParser *parser); |
| void stringscan_advance(StringLexer *scanner); |
| int stringscan_gettok(StringLexer *scanner); |
| void _push(PCCTS_AST **st, int *sp, PCCTS_AST *e); |
| PCCTS_AST *_pop(PCCTS_AST **st, int *sp); |
| int match_partial(PCCTS_AST *t, PCCTS_AST *u); |
| int scanmatch(ScanAST *t, PCCTS_AST **labels[], int *n); |
| void scanast_free(ScanAST *t); |
| ScanAST *new_scanast(int tok); |
| void stringparser_match(StringParser *parser, int type); |
| virtual PCCTS_AST *deepCopyBushy(); |
| |
| public: |
| PCCTS_AST() {;} |
| virtual ~PCCTS_AST() {;} |
| |
| /* This group must be defined for SORCERER to work correctly */ |
| virtual PCCTS_AST *right() = 0; |
| virtual PCCTS_AST *down() = 0; |
| virtual void setRight(PCCTS_AST *t) = 0; |
| virtual void setDown(PCCTS_AST *t) = 0; |
| // we define these so ANTLR doesn't have to |
| virtual int type() { return 0; } |
| virtual void setType(int) {;} |
| virtual PCCTS_AST *shallowCopy() {panic("no shallowCopy() defined"); return NULL;} |
| |
| /* These are not needed by ANTLR, but are support functions */ |
| virtual PCCTS_AST *deepCopy(); // used by SORCERER in transform mode |
| virtual void addChild(PCCTS_AST *t); |
| virtual void lisp_action(FILE *) {;} |
| virtual void lisp(FILE *f); |
| static PCCTS_AST *make(PCCTS_AST *rt, ...); |
| virtual PCCTS_AST *ast_find_all(PCCTS_AST *u, PCCTS_AST **cursor); |
| virtual int match(PCCTS_AST *u); |
| virtual void insert_after(PCCTS_AST *b); |
| virtual void append(PCCTS_AST *b); |
| virtual PCCTS_AST *tail(); |
| virtual PCCTS_AST *bottom(); |
| static PCCTS_AST *cut_between(PCCTS_AST *a, PCCTS_AST *b); |
| // virtual SList *to_slist(); |
| virtual void tfree(); |
| int ast_scan(char *templ, ...); |
| virtual int nsiblings(); |
| virtual PCCTS_AST *sibling_index(int i); |
| |
| void require(int e,char *err){ if ( !e ) panic(err); } |
| virtual void panic(char *err) |
| { fprintf(stderr, "PCCTS_AST: %s\n", err); exit(PCCTS_EXIT_FAILURE); } |
| }; |
| |
| #endif /* PCCTSAST_H */ |