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