PCCTSAST.h
上传用户:itx_2006
上传日期:2007-01-06
资源大小:493k
文件大小:4k
源码类别:

编译器/解释器

开发平台:

Others

  1. /* Abstract syntax tree
  2.  *
  3.  * SOFTWARE RIGHTS
  4.  *
  5.  * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
  6.  * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
  7.  * company may do whatever they wish with source code distributed with
  8.  * PCCTS or the code generated by PCCTS, including the incorporation of
  9.  * PCCTS, or its output, into commerical software.
  10.  *
  11.  * We encourage users to develop software with PCCTS.  However, we do ask
  12.  * that credit is given to us for developing PCCTS.  By "credit",
  13.  * we mean that if you incorporate our source code into one of your
  14.  * programs (commercial product, research project, or otherwise) that you
  15.  * acknowledge this fact somewhere in the documentation, research report,
  16.  * etc...  If you like PCCTS and have developed a nice tool with the
  17.  * output, please mention that you developed it using PCCTS.  In
  18.  * addition, we ask that this header remain intact in our source code.
  19.  * As long as these guidelines are kept, we expect to continue enhancing
  20.  * this system and expect to make other tools available as they are
  21.  * completed.
  22.  *
  23.  * ANTLR 1.33
  24.  * Terence Parr
  25.  * Parr Research Corporation
  26.  * with Purdue University and AHPCRC, University of Minnesota
  27.  * 1989-1998
  28.  */
  29. #ifndef PCCTSAST_H
  30. #define PCCTSAST_H
  31. #include "pcctscfg.h"
  32. #include PCCTS_STDIO_H
  33. #include PCCTS_STDLIB_H
  34. PCCTS_NAMESPACE_STD
  35. //class SList;
  36. #define StringScanMaxText 50
  37. #define MaxTreeStackDepth 400
  38. //
  39. //  7-Apr-97 133MR1 signed int not accepted by AT&T cfront
  40. //
  41. typedef struct stringlexer {
  42. int c; // MR1
  43. char *input;
  44. char *p;
  45. char text[StringScanMaxText];
  46. } StringLexer;
  47. /* Define the structures needed for ast_scan() */
  48. typedef struct stringparser {
  49. int token;
  50. StringLexer *lexer;
  51. int num_labels;
  52. } StringParser;
  53. typedef struct _scanast {
  54.             struct _scanast *_right, *_down;
  55.             int _token;
  56. int label_num;
  57. int type() { return _token; }
  58. struct _scanast *right() { return _right; }
  59. struct _scanast *down() { return _down; }
  60.         } ScanAST;
  61. #define VALID_SCAN_TOKEN(t) (t>=__LPAREN && t<=__PERIOD)
  62. class DllExportPCCTS PCCTS_AST {
  63. protected:
  64. static char *scan_token_tbl[];
  65. enum {
  66. __LPAREN=1,
  67. __RPAREN=2,
  68. __PERCENT=3,
  69. __INT=4,
  70. __COLON=5,
  71. __POUND=6,
  72. __PERIOD=7,
  73. __StringScanEOF=-1};
  74. protected:
  75. char *scan_token_str(int t);
  76. void stringlexer_init(StringLexer *scanner, char *input);
  77. void stringparser_init(StringParser *, StringLexer *);
  78. ScanAST *stringparser_parse_scanast(char *templ, int *n);
  79. ScanAST *stringparser_parse_tree(StringParser *parser);
  80. ScanAST *stringparser_parse_element(StringParser *parser);
  81. void stringscan_advance(StringLexer *scanner);
  82. int stringscan_gettok(StringLexer *scanner);
  83. void _push(PCCTS_AST **st, int *sp, PCCTS_AST *e);
  84. PCCTS_AST *_pop(PCCTS_AST **st, int *sp);
  85. int match_partial(PCCTS_AST *t, PCCTS_AST *u);
  86. int scanmatch(ScanAST *t, PCCTS_AST **labels[], int *n);
  87. void scanast_free(ScanAST *t);
  88. ScanAST *new_scanast(int tok);
  89. void stringparser_match(StringParser *parser, int type);
  90. virtual PCCTS_AST *deepCopyBushy();
  91. public:
  92. PCCTS_AST() {;}
  93. virtual ~PCCTS_AST() {;}
  94. /* This group must be defined for SORCERER to work correctly */
  95. virtual PCCTS_AST *right() = 0;
  96. virtual PCCTS_AST *down() = 0;
  97. virtual void setRight(PCCTS_AST *t) = 0;
  98. virtual void setDown(PCCTS_AST *t) = 0;
  99. // we define these so ANTLR doesn't have to
  100. virtual int type() { return 0; }
  101. virtual void setType(int t) {;}
  102. virtual PCCTS_AST *shallowCopy() {panic("no shallowCopy() defined"); return NULL;}
  103. /* These are not needed by ANTLR, but are support functions */
  104. virtual PCCTS_AST *deepCopy(); // used by SORCERER in transform mode
  105. virtual void addChild(PCCTS_AST *t);
  106. virtual void lisp_action(FILE *f) {;}
  107. virtual void lisp(FILE *f);
  108. static PCCTS_AST *make(PCCTS_AST *rt, ...);
  109. virtual PCCTS_AST *ast_find_all(PCCTS_AST *u, PCCTS_AST **cursor);
  110. virtual int match(PCCTS_AST *u);
  111. virtual void insert_after(PCCTS_AST *b);
  112. virtual void append(PCCTS_AST *b);
  113. virtual PCCTS_AST *tail();
  114. virtual PCCTS_AST *bottom();
  115. static  PCCTS_AST *cut_between(PCCTS_AST *a, PCCTS_AST *b);
  116. // virtual SList *to_slist();
  117. virtual void tfree();
  118. int ast_scan(char *templ, ...);
  119. virtual int nsiblings();
  120. virtual PCCTS_AST *sibling_index(int i);
  121. void require(int e,char *err){ if ( !e ) panic(err); }
  122. virtual void panic(char *err)
  123. { fprintf(stderr, "PCCTS_AST: %sn", err); exit(PCCTS_EXIT_FAILURE); }
  124. };
  125. #endif /* PCCTSAST_H */