13eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* Abstract syntax tree 23eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * 33eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * SOFTWARE RIGHTS 43eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * 53eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * We reserve no LEGAL rights to the Purdue Compiler Construction Tool 63eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Set (PCCTS) -- PCCTS is in the public domain. An individual or 73eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * company may do whatever they wish with source code distributed with 83eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * PCCTS or the code generated by PCCTS, including the incorporation of 93eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * PCCTS, or its output, into commerical software. 103eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * 113eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * We encourage users to develop software with PCCTS. However, we do ask 123eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * that credit is given to us for developing PCCTS. By "credit", 133eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * we mean that if you incorporate our source code into one of your 143eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * programs (commercial product, research project, or otherwise) that you 153eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * acknowledge this fact somewhere in the documentation, research report, 163eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * etc... If you like PCCTS and have developed a nice tool with the 173eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * output, please mention that you developed it using PCCTS. In 183eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * addition, we ask that this header remain intact in our source code. 193eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * As long as these guidelines are kept, we expect to continue enhancing 203eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * this system and expect to make other tools available as they are 213eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * completed. 223eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * 233eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * ANTLR 1.33 243eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Terence Parr 253eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Parr Research Corporation 263eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * with Purdue University and AHPCRC, University of Minnesota 273eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * 1989-1998 283eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang */ 293eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 303eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#ifndef PCCTSAST_H 313eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define PCCTSAST_H 323eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 333eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "pcctscfg.h" 343eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 353eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "pccts_stdio.h" 363eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "pccts_stdlib.h" 373eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 383eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangPCCTS_NAMESPACE_STD 393eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 403eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//class SList; 413eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 423eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define StringScanMaxText 50 433eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define MaxTreeStackDepth 400 443eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 453eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// 463eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// 7-Apr-97 133MR1 signed int not accepted by AT&T cfront 473eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// 483eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangtypedef struct stringlexer { 493eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int c; // MR1 503eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang char *input; 513eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang char *p; 523eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang char text[StringScanMaxText]; 533eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang } StringLexer; 543eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 553eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* Define the structures needed for ast_scan() */ 563eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangtypedef struct stringparser { 573eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int token; 583eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang StringLexer *lexer; 593eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int num_labels; 603eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang } StringParser; 613eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 623eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangtypedef struct _scanast { 633eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang struct _scanast *_right, *_down; 643eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int _token; 653eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int label_num; 663eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int type() { return _token; } 673eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang struct _scanast *right() { return _right; } 683eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang struct _scanast *down() { return _down; } 693eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang } ScanAST; 703eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 713eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define VALID_SCAN_TOKEN(t) (t>=__LPAREN && t<=__PERIOD) 723eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 733eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangclass DllExportPCCTS PCCTS_AST { 743eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangprotected: 753eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang static const char *scan_token_tbl[]; /* MR20 const */ 763eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang enum { 773eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang __LPAREN=1, 783eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang __RPAREN=2, 793eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang __PERCENT=3, 803eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang __INT=4, 813eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang __COLON=5, 823eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang __POUND=6, 833eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang __PERIOD=7, 843eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang __StringScanEOF=-1}; 853eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 863eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangprotected: 873eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang const char *scan_token_str(int t); /* MR20 const */ 883eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void stringlexer_init(StringLexer *scanner, char *input); 893eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void stringparser_init(StringParser *, StringLexer *); 903eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang ScanAST *stringparser_parse_scanast(char *templ, int *n); 913eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang ScanAST *stringparser_parse_tree(StringParser *parser); 923eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang ScanAST *stringparser_parse_element(StringParser *parser); 933eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void stringscan_advance(StringLexer *scanner); 943eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int stringscan_gettok(StringLexer *scanner); 953eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void _push(PCCTS_AST **st, int *sp, PCCTS_AST *e); 963eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang PCCTS_AST *_pop(PCCTS_AST **st, int *sp); 973eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int match_partial(PCCTS_AST *t, PCCTS_AST *u); 983eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int scanmatch(ScanAST *t, PCCTS_AST **labels[], int *n); 993eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void scanast_free(ScanAST *t); 1003eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang ScanAST *new_scanast(int tok); 1013eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void stringparser_match(StringParser *parser, int type); 1023eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual PCCTS_AST *deepCopyBushy(); 1033eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 1043eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangpublic: 1053eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang PCCTS_AST() {;} 1063eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual ~PCCTS_AST() {;} 1073eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 1083eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang /* This group must be defined for SORCERER to work correctly */ 1093eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual PCCTS_AST *right() = 0; 1103eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual PCCTS_AST *down() = 0; 1113eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual void setRight(PCCTS_AST *t) = 0; 1123eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual void setDown(PCCTS_AST *t) = 0; 1133eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// we define these so ANTLR doesn't have to 1143eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual int type() { return 0; } 1153eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual void setType(int t) {;} 1163eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual PCCTS_AST *shallowCopy() {panic("no shallowCopy() defined"); return NULL;} 1173eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 1183eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang /* These are not needed by ANTLR, but are support functions */ 1193eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual PCCTS_AST *deepCopy(); // used by SORCERER in transform mode 1203eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual void addChild(PCCTS_AST *t); 1213eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual void lisp_action(FILE *f) {;} 1223eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual void lisp(FILE *f); 1233eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang static PCCTS_AST *make(PCCTS_AST *rt, ...); 1243eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual PCCTS_AST *ast_find_all(PCCTS_AST *u, PCCTS_AST **cursor); 1253eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual int match(PCCTS_AST *u); 1263eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual void insert_after(PCCTS_AST *b); 1273eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual void append(PCCTS_AST *b); 1283eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual PCCTS_AST *tail(); 1293eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual PCCTS_AST *bottom(); 1303eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang static PCCTS_AST *cut_between(PCCTS_AST *a, PCCTS_AST *b); 1313eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// virtual SList *to_slist(); 1323eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual void tfree(); 1333eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int ast_scan(char *templ, ...); 1343eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual int nsiblings(); 1353eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual PCCTS_AST *sibling_index(int i); 1363eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 1373eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void require(int e,const char *err){ if ( !e ) panic(err); } /* MR20 const */ 1383eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual void panic(const char *err) // MR20 const 1393eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang { fprintf(stderr, "PCCTS_AST: %s\n", err); exit(PCCTS_EXIT_FAILURE); } 1403eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}; 1413eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 1423eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#endif /* PCCTSAST_H */ 143