Home | History | Annotate | Download | only in h
      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-2000
     30  */
     31 
     32 #ifndef ZZAST_H
     33 #define ZZAST_H
     34 
     35 #define zzastOvfChk														\
     36 			if ( zzast_sp <= 0 )                                        \
     37             {                                                           \
     38                 fprintf(stderr, zzStackOvfMsg, __FILE__, __LINE__);    	\
     39                 exit(PCCTS_EXIT_FAILURE);                                               \
     40             }
     41 
     42 #ifndef USER_DEFINED_AST
     43 #ifndef AST_FIELDS
     44 #define AST_FIELDS
     45 #endif
     46 
     47 typedef struct _ast {
     48             struct _ast *right, *down;
     49 #ifdef zzAST_DOUBLE
     50             struct _ast *left, *up;
     51 #endif
     52             AST_FIELDS
     53 } AST;
     54 
     55 #else
     56 
     57 #ifdef zzAST_DOUBLE
     58 #define AST_REQUIRED_FIELDS   struct _ast *right, *down, *left, *up;
     59 #else
     60 #define AST_REQUIRED_FIELDS   struct _ast *right, *down;
     61 #endif
     62 
     63 #endif
     64 
     65 
     66 /* N o d e  a c c e s s  m a c r o s */
     67 #define zzchild(t)		(((t)==NULL)? (AST *) NULL:(t->down))   /* MR19 */
     68 #define zzsibling(t)	(((t)==NULL)? (AST *) NULL:(t->right))  /* MR19 */
     69 
     70 
     71 /* define global variables needed by #i stack */
     72 #define zzASTgvars												\
     73 	AST *zzastStack[ZZAST_STACKSIZE];							\
     74 	int zzast_sp = ZZAST_STACKSIZE;
     75 
     76 #define zzASTVars	AST *_ast = NULL, *_sibling = NULL, *_tail = NULL
     77 #define zzSTR		( (_tail==NULL)?(&_sibling):(&(_tail->right)) )
     78 #define zzastCur	(zzastStack[zzast_sp])
     79 #define zzastArg(i)	(zzastStack[zztsp-i])
     80 #define zzastPush(p) zzastOvfChk; zzastStack[--zzast_sp] = p;
     81 #define zzastDPush	--zzast_sp
     82 #define zzastMARK	zztsp=zzast_sp;		/* Save state of stack */
     83 #define zzastREL	zzast_sp=zztsp;		/* Return state of stack */
     84 #define zzrm_ast	{zzfree_ast(*_root); _tail = _sibling = (*_root)=NULL;}
     85 
     86 extern int zzast_sp;
     87 extern AST *zzastStack[];
     88 
     89 /* MR26 */
     90 
     91 #ifdef PCCTS_USE_STDARG
     92 AST *zztmake(AST *, ...);
     93 #else
     94 AST *zztmake();
     95 #endif
     96 
     97 #ifdef __USE_PROTOS
     98 void zzlink(AST **, AST **, AST **);
     99 void zzsubchild(AST **, AST **, AST **);
    100 void zzsubroot(AST **, AST **, AST **);
    101 void zzpre_ast(AST *, void (*)(AST *), void (*)(AST *), void (*)(AST *));
    102 void zzfree_ast(AST *);
    103 AST *zzdup_ast(AST *);
    104 void zztfree(AST *);
    105 void zzdouble_link(AST *, AST *, AST *);
    106 AST *zzastnew(void);
    107 
    108 #else
    109 
    110 void zzlink();
    111 AST *zzastnew();
    112 void zzsubchild();
    113 void zzsubroot();
    114 void zzpre_ast();
    115 void zzfree_ast();
    116 AST *zzdup_ast();
    117 void zztfree();
    118 void zzdouble_link();
    119 #endif
    120 
    121 #endif
    122