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