]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Other/Maintained/Tools/Pccts/sorcerer/h/sorcerer.h
Add in the 1st version of ECP.
[mirror_edk2.git] / EdkCompatibilityPkg / Other / Maintained / Tools / Pccts / sorcerer / h / sorcerer.h
1 #ifndef sorcerer_h
2 #define sorcerer_h
3
4 /*
5 * sorcerer.h -- header for all sorcerer files
6 *
7 * SOFTWARE RIGHTS
8 *
9 * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public
10 * domain. An individual or company may do whatever they wish with
11 * source code distributed with SORCERER or the code generated by
12 * SORCERER, including the incorporation of SORCERER, or its output, into
13 * commerical software.
14 *
15 * We encourage users to develop software with SORCERER. However, we do
16 * ask that credit is given to us for developing SORCERER. By "credit",
17 * we mean that if you incorporate our source code into one of your
18 * programs (commercial product, research project, or otherwise) that you
19 * acknowledge this fact somewhere in the documentation, research report,
20 * etc... If you like SORCERER and have developed a nice tool with the
21 * output, please mention that you developed it using SORCERER. In
22 * addition, we ask that this header remain intact in our source code.
23 * As long as these guidelines are kept, we expect to continue enhancing
24 * this system and expect to make other tools available as they are
25 * completed.
26 *
27 * SORCERER 1.00B
28 * Terence Parr
29 * AHPCRC, University of Minnesota
30 * 1992-1994
31 */
32
33 #include "pcctscfg.h"
34
35 #ifdef __USE_PROTOS
36 #include <stdlib.h>
37 #else
38 #include <malloc.h>
39 #endif
40
41 #include <setjmp.h>
42
43 /* SUPERCLASS SORAST (your tree must look at minimum like this)
44 typedef struct _node {
45 struct _node *right, *down;
46 int token;
47 -- user-defined stuff goes here
48 } SORAST;
49 */
50
51 /* Can be used sort of like inheritance to get the desired struct def */
52 #define AST_REQD_FIELDS \
53 struct _node *right, *down; \
54 int token;
55
56 /* C MATCH */ /* MR21 Short circuit on null pointer */
57 #define _MATCH(tok) if (! _t || _t->token!=tok ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_token(_parser, tok, _t)
58 #define _MATCHRANGE(tok,tok2) \
59 if (! _t || _t->token<tok || _t->token>tok2 ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_range(_parser, tok, tok2, _t)
60
61 /* C++ MATCH */
62 #define _CPPMATCH(tok) if ( _t->token()!=tok ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_token(_parser, tok, _t)
63 #define _CPPMATCHRANGE(tok,tok2) \
64 if ( _t->token()<tok || _t->token()>tok2 ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_range(_parser, tok, tok2, _t)
65
66 /* Normal DOWN and RIGHT */
67 #define _DOWN _t=_t->down
68 #define _RIGHT _t=_t->right
69
70 /* C++ DOWN and RIGHT */
71 #define _CPPDOWN _t=(SORAST *) _t->down()
72 #define _CPPRIGHT _t=(SORAST *) _t->right()
73
74 #define _SAVE SORAST *_save=_t
75 #define _RESTORE _t = _save
76 #define _SETLABEL(u) u=_t
77 #define _WILDCARD if ( _t==NULL ) if ( _parser->guessing ) _GUESS_FAIL; else missing_wildcard(_parser)
78 #define _GUESS_BLOCK STreeParser _st; int _gv; SORAST *_savet=NULL;
79 #define _GUESS {_st = *_parser; \
80 _savet = _t; \
81 _parser->guessing = 1; \
82 _gv = setjmp(_parser->startofguess.state);}
83 #define _GUESS_FAIL longjmp(_parser->startofguess.state, 1)
84 #define _GUESS_DONE {*_parser = _st; _t = _savet;}
85
86 /* These are used mainly by the C output */
87 #ifndef ast_down
88 #define ast_down down
89 #endif
90 #ifndef ast_right
91 #define ast_right right
92 #endif
93
94 #define STreeTry(r,p,t) \
95 (p)->try_result = NULL; \
96 (p)->sjrv = setjmp((p)->startofguess); \
97 if ( !(p)->sjrv ) { \
98 rule(p,t,&try_result); \
99 (p)->try_ok = 1; \
100 } \
101 else { \
102 (p)->try_ok = 0; \
103 } \
104 if ( (p)->try_ok )
105
106
107 /* Used only during TRANSFORM mode */
108 #define TREE_CONSTR_PTRS SORAST *_r=NULL,*_s=NULL,*_e=NULL
109
110 typedef struct _Sjmp_buf {
111 jmp_buf state;
112 } Sjmp_buf;
113
114 #ifndef _PARSER_VARS
115 #define _PARSER_VARS
116 #endif
117
118 #ifndef _REFVARS
119 #define _REFVARS
120 #endif
121
122 typedef struct _STreeParser {
123 int try_ok, sjrv; /* used by STreeTry macro */
124 SORAST *try_result; /* tree coming back from try */
125 int guessing;
126 Sjmp_buf startofguess;
127 SORAST *t;
128 _REFVARS
129 _PARSER_VARS
130 } STreeParser;
131
132 #define STreeParserInit(_p) { (_p)->guessing = 0; _refvar_inits(_p); }
133
134
135 /* S a n i t y C h e c k i n g */
136
137 #ifndef require
138 #define require(expr, err) {if ( !(expr) ) sorcerer_panic(err);}
139 #endif
140
141
142 /* T r a n s f o r m M a c r o s */
143 #define ast_return(_t) *_result = _t
144
145
146 #ifdef __USE_PROTOS
147 extern void mismatched_range(STreeParser *_parser, int looking_for, int upper_token, SORAST *found);
148 extern void missing_wildcard(STreeParser *_parser);
149 extern void mismatched_token(STreeParser *_parser, int looking_for, SORAST *found);
150 extern void no_viable_alt(STreeParser *_parser, char *rulename, SORAST *root);
151 extern void sorcerer_panic(char *err);
152 extern void _refvar_inits(STreeParser *); /* MR15 Kevin J. Cummings */
153 extern void _mkroot(SORAST **, SORAST **, SORAST **, SORAST *);
154 extern void _mkchild(SORAST **, SORAST **, SORAST **, SORAST *);
155 extern SORAST *ast_alloc(void);
156 extern SORAST *ast_dup(SORAST *t);
157 extern SORAST *ast_dup_node(SORAST *t);
158 #else
159 extern void mismatched_range();
160 extern void missing_wildcard();
161 extern void mismatched_token();
162 extern void no_viable_alt();
163 extern void sorcerer_panic();
164 extern void _refvar_inits(); /* MR15 Kevin J. Cummings */
165 extern void _mkroot();
166 extern void _mkchild();
167 extern SORAST *ast_alloc();
168 extern SORAST *ast_dup();
169 extern SORAST *ast_dup_node();
170 #endif
171
172 #endif