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

编译器/解释器

开发平台:

Others

  1. /* Abstract syntax tree
  2.  *
  3.  * Macros, definitions
  4.  *
  5.  * SOFTWARE RIGHTS
  6.  *
  7.  * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
  8.  * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
  9.  * company may do whatever they wish with source code distributed with
  10.  * PCCTS or the code generated by PCCTS, including the incorporation of
  11.  * PCCTS, or its output, into commerical software.
  12.  *
  13.  * We encourage users to develop software with PCCTS.  However, we do ask
  14.  * that credit is given to us for developing PCCTS.  By "credit",
  15.  * we mean that if you incorporate our source code into one of your
  16.  * programs (commercial product, research project, or otherwise) that you
  17.  * acknowledge this fact somewhere in the documentation, research report,
  18.  * etc...  If you like PCCTS and have developed a nice tool with the
  19.  * output, please mention that you developed it using PCCTS.  In
  20.  * addition, we ask that this header remain intact in our source code.
  21.  * As long as these guidelines are kept, we expect to continue enhancing
  22.  * this system and expect to make other tools available as they are
  23.  * completed.
  24.  *
  25.  * ANTLR 1.33
  26.  * Terence Parr
  27.  * Parr Research Corporation
  28.  * with Purdue University and AHPCRC, University of Minnesota
  29.  * 1989-1998
  30.  */
  31. #ifndef ZZAST_H
  32. #define ZZAST_H
  33. #define zzastOvfChk
  34. if ( zzast_sp <= 0 )                                        
  35.             {                                                           
  36.                 fprintf(stderr, zzStackOvfMsg, __FILE__, __LINE__);    
  37.                 exit(PCCTS_EXIT_FAILURE);                                               
  38.             }
  39. #ifndef USER_DEFINED_AST
  40. #ifndef AST_FIELDS
  41. #define AST_FIELDS
  42. #endif
  43. typedef struct _ast {
  44.             struct _ast *right, *down;
  45. #ifdef zzAST_DOUBLE
  46.             struct _ast *left, *up;
  47. #endif
  48.             AST_FIELDS
  49. } AST;
  50. #else
  51. #ifdef zzAST_DOUBLE
  52. #define AST_REQUIRED_FIELDS   struct _ast *right, *down, *left, *up;
  53. #else
  54. #define AST_REQUIRED_FIELDS   struct _ast *right, *down;
  55. #endif
  56. #endif
  57. /* N o d e  a c c e s s  m a c r o s */
  58. #define zzchild(t) (((t)==NULL)?NULL:(t->down))
  59. #define zzsibling(t) (((t)==NULL)?NULL:(t->right))
  60. /* define global variables needed by #i stack */
  61. #define zzASTgvars
  62. AST *zzastStack[ZZAST_STACKSIZE];
  63. int zzast_sp = ZZAST_STACKSIZE;
  64. #define zzASTVars AST *_ast = NULL, *_sibling = NULL, *_tail = NULL
  65. #define zzSTR ( (_tail==NULL)?(&_sibling):(&(_tail->right)) )
  66. #define zzastCur (zzastStack[zzast_sp])
  67. #define zzastArg(i) (zzastStack[zztsp-i])
  68. #define zzastPush(p) zzastOvfChk; zzastStack[--zzast_sp] = p;
  69. #define zzastDPush --zzast_sp
  70. #define zzastMARK zztsp=zzast_sp; /* Save state of stack */
  71. #define zzastREL zzast_sp=zztsp; /* Return state of stack */
  72. #define zzrm_ast {zzfree_ast(*_root); _tail = _sibling = (*_root)=NULL;}
  73. extern int zzast_sp;
  74. extern AST *zzastStack[];
  75. #ifdef __STDC__
  76. void zzlink(AST **, AST **, AST **);
  77. void zzsubchild(AST **, AST **, AST **);
  78. void zzsubroot(AST **, AST **, AST **);
  79. void zzpre_ast(AST *, void (*)(), void (*)(), void (*)());
  80. void zzfree_ast(AST *);
  81. AST *zztmake(AST *, ...);
  82. AST *zzdup_ast(AST *);
  83. void zztfree(AST *);
  84. void zzdouble_link(AST *, AST *, AST *);
  85. AST *zzastnew(void);
  86. #else
  87. void zzlink();
  88. AST *zzastnew();
  89. void zzsubchild();
  90. void zzsubroot();
  91. void zzpre_ast();
  92. void zzfree_ast();
  93. AST *zztmake();
  94. AST *zzdup_ast();
  95. void zztfree();
  96. void zzdouble_link();
  97. #endif
  98. #endif