]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Other/Maintained/Tools/Pccts/sorcerer/h/STreeParser.h
Add in the 1st version of ECP.
[mirror_edk2.git] / EdkCompatibilityPkg / Other / Maintained / Tools / Pccts / sorcerer / h / STreeParser.h
1 #ifndef STreeParser_h
2 #define STreeParser_h
3
4 /*
5 * STreeParser.h
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 * Parr Research Corporation
29 * with Purdue University and AHPCRC, University of Minnesota
30 * 1992-1994
31 */
32
33 /* The programmer should derive a class from SORASTBase; SORASTBase defines
34 * the minimum public interface that a tree node must follow for SORCERER to
35 * be able to walk the trees.
36 */
37
38 /* The @-vars are added by the subclass created by SORCERER; the constructor
39 * is used to init the @-vars.
40 */
41
42 #include <stdio.h>
43 #include <setjmp.h>
44 #include <stdlib.h>
45 #include "SASTBase.h"
46
47 #define _DOWN _t=(SORASTBase *)_t->down()
48 #define _RIGHT _t=(SORASTBase *)_t->right()
49
50 #define _SAVE SORASTBase *_save=_t
51 #define _RESTORE _t = _save
52 #define _GUESS_BLOCK STreeParser _st; int _gv; SORASTBase *_savet=NULL;
53 #define _GUESS {save_state(&_st); \
54 _savet = _t; \
55 guessing = 1; \
56 _gv = setjmp(startofguess.state);}
57 #define _GUESS_FAIL longjmp(startofguess.state, 1)
58 #define _GUESS_DONE {restore_state(&_st); _t = _savet;}
59 #define _MATCH(tok) MATCH(_t,tok)
60 #define _MATCHRANGE(t1,t2) MATCHRANGE(_t,t1,t2)
61 #define _WILDCARD WILDCARD(_t)
62
63 #define ast_return(t) *_result = (SORASTBase *)t;
64
65 #define STreeTry(r,p,t) \
66 (p)->try_result = NULL; \
67 (p)->sjrv = setjmp((p)->startofguess); \
68 if ( !(p)->sjrv ) { \
69 rule(p,t,&try_result); \
70 (p)->try_ok = 1; \
71 } \
72 else { \
73 (p)->try_ok = 0; \
74 } \
75 if ( (p)->try_ok )
76
77
78 /* Used only during TRANSFORM mode */
79 #define TREE_CONSTR_PTRS SORASTBase *_r=NULL,*_s=NULL,*_e=NULL
80
81 typedef struct _Sjmp_buf {
82 jmp_buf state;
83 } Sjmp_buf;
84
85 class STreeParser {
86 protected:
87 int try_ok, sjrv; /* used by STreeTry macro */
88 SORASTBase *try_result; /* tree coming back from try */
89 int guessing;
90 Sjmp_buf startofguess;
91 // SORASTBase *t;
92
93 void _mkroot(SORASTBase **, SORASTBase **, SORASTBase **, SORASTBase *);
94 void _mkchild(SORASTBase **, SORASTBase **, SORASTBase **, SORASTBase *);
95 virtual void mismatched_range(int looking_for, int upper_token, SORASTBase *found);
96 virtual void missing_wildcard();
97 virtual void mismatched_token(int looking_for, SORASTBase *found);
98 virtual void no_viable_alt(char *rulename, SORASTBase *root);
99 virtual void MATCH(SORASTBase *_t, int tok);
100 virtual void MATCHRANGE(SORASTBase *_t, int tok, int tok2);
101 virtual void WILDCARD(SORASTBase *_t);
102
103 public:
104 STreeParser() { guessing = 0; }
105 virtual void panic(char *err);
106 void save_state(STreeParser *);
107 void restore_state(STreeParser *);
108 };
109
110 #endif