]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Other/Maintained/Tools/Pccts/sorcerer/lib/STreeParser.cpp
Add in the 1st version of ECP.
[mirror_edk2.git] / EdkCompatibilityPkg / Other / Maintained / Tools / Pccts / sorcerer / lib / STreeParser.cpp
1 #include <stdio.h>
2 #include "STreeParser.h"
3
4 void STreeParser::
5 MATCH(SORASTBase *_t,int tok)
6 {
7 if ( _t->type()!=tok )
8 {
9 if ( guessing ) _GUESS_FAIL;
10 else mismatched_token(tok, _t);
11 }
12 }
13
14 void STreeParser::
15 MATCHRANGE(SORASTBase *_t,int tok,int tok2)
16 {
17 if ( _t->type()<tok || _t->type()>tok2 )
18 {
19 if ( guessing ) _GUESS_FAIL;
20 else mismatched_range(tok, tok2, _t);
21 }
22 }
23
24 void STreeParser::
25 WILDCARD(SORASTBase *_t)
26 {
27 if ( _t==NULL )
28 {
29 if ( guessing ) _GUESS_FAIL;
30 else missing_wildcard();
31 }
32 }
33
34 void STreeParser::
35 mismatched_range(int looking_for, int upper_token, SORASTBase *found)
36 {
37 if ( found!=NULL ) {
38 fprintf(stderr,
39 "parse error: expected token range %d..%d found token %d\n",
40 looking_for, upper_token,
41 found->type());
42 }
43 else {
44 fprintf(stderr,
45 "parse error: expected token range %d..%d found NULL tree\n",
46 looking_for, upper_token);
47 }
48 }
49
50 void STreeParser::
51 missing_wildcard()
52 {
53 fprintf(stderr, "parse error: expected any token/tree found found NULL tree\n");
54 }
55
56 void STreeParser::
57 mismatched_token(int looking_for, SORASTBase *found)
58 {
59 if ( found!=NULL ) {
60 fprintf(stderr,
61 "parse error: expected token %d found token %d\n",
62 looking_for,
63 found->type());
64 }
65 else {
66 fprintf(stderr,
67 "parse error: expected token %d found NULL tree\n",
68 looking_for);
69 }
70 }
71
72 void STreeParser::
73 no_viable_alt(char *rulename, SORASTBase *root)
74 {
75 if ( root==NULL )
76 fprintf(stderr,
77 "parse error: in rule %s, no viable alternative for NULL tree\n",
78 rulename);
79 else
80 fprintf(stderr,
81 "parse error: in rule %s, no viable alternative for tree\n",
82 rulename);
83 }
84
85 void STreeParser::
86 panic(char *err)
87 {
88 fprintf(stderr, "panic: %s\n", err);
89 exit(-1);
90 }
91
92 void STreeParser::
93 save_state(STreeParser *buf)
94 {
95 buf->try_ok = this->try_ok;
96 buf->sjrv = this->sjrv;
97 buf->guessing = this->guessing;
98 buf->startofguess = this->startofguess;
99 }
100
101 void STreeParser::
102 restore_state(STreeParser *buf)
103 {
104 this->try_ok = buf->try_ok;
105 this->sjrv = buf->sjrv;
106 this->guessing = buf->guessing;
107 this->startofguess = buf->startofguess;
108 }
109
110 void STreeParser::
111 _mkroot(SORASTBase **r, SORASTBase **s, SORASTBase **e, SORASTBase *t)
112 {
113 *r = t;
114 }
115
116 void STreeParser::
117 _mkchild(SORASTBase **r, SORASTBase **s, SORASTBase **e, SORASTBase *t)
118 {
119 #ifdef BEFORE_GARYS_FIX
120 /* if no sibling list, must attach to any existing root */
121 if ( *s==NULL )
122 {
123 *s = *e = t;
124 /* If r is NULL, then there was no root defined--must be sibling list */
125 if ( *r==NULL ) *r = *s;
126 else (*r)->setDown(t);
127 }
128 else { (*e)->setRight(t); *e = t; }
129 #endif
130 /*
131 should do nothing if asked to add a NULL argument. NULL's come up
132 when a rule wants to return "nothing".
133 */
134 /* if no sibling list, must attach to any existing root */
135 if (*s == NULL)
136 {
137 *s = *e = t;
138 // If r is NULL then there was no root defined--must be sibling list
139 if (*r == NULL) *r = *s;
140 else (*r)->setDown(t);
141 }
142 else if (*e != NULL)
143 {
144 (*e)->setRight(t);
145 *e = t;
146 }
147 if (*e != NULL) {
148 while ((*e)->right() != NULL) *e = (SORASTBase *)(*e)->right();
149 }
150 }
151