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