yaccpar - 9base - revived minimalist port of Plan 9 userland to Unix | |
git clone git://git.suckless.org/9base | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
yaccpar (5229B) | |
--- | |
1 #define YYFLAG -1000 | |
2 #define YYERROR goto yyerrlab | |
3 #define YYACCEPT return(0) | |
4 #define YYABORT return(1) | |
5 #define yyclearin yychar = -1 | |
6 #define yyerrok yyerrflag = 0 | |
7 | |
8 #ifdef yydebug | |
9 #include "y.debug" | |
10 #else | |
11 #define yydebug 0 | |
12 static const char* yytoknames[1]; /*… | |
13 static const char* yystates[1]; /* f… | |
14 #endif | |
15 | |
16 /* parser for yacc output */ | |
17 #ifdef YYARG | |
18 #define yynerrs yyarg->yynerrs | |
19 #define yyerrflag yyarg->yyerrflag | |
20 #define yyval yyarg->yyval | |
21 #define yylval yyarg->yylval | |
22 #else | |
23 int yynerrs = 0; /* number of errors */ | |
24 int yyerrflag = 0; /* error recovery flag */ | |
25 #endif | |
26 | |
27 extern int fprint(int, char*, ...); | |
28 extern int sprint(char*, char*, ...); | |
29 | |
30 static const char* | |
31 yytokname(int yyc) | |
32 { | |
33 static char x[10]; | |
34 | |
35 if(yyc > 0 && yyc <= sizeof(yytoknames)/sizeof(yytoknames[0])) | |
36 if(yytoknames[yyc-1]) | |
37 return yytoknames[yyc-1]; | |
38 sprint(x, "<%d>", yyc); | |
39 return x; | |
40 } | |
41 | |
42 static const char* | |
43 yystatname(int yys) | |
44 { | |
45 static char x[10]; | |
46 | |
47 if(yys >= 0 && yys < sizeof(yystates)/sizeof(yystates[0])) | |
48 if(yystates[yys]) | |
49 return yystates[yys]; | |
50 sprint(x, "<%d>\n", yys); | |
51 return x; | |
52 } | |
53 | |
54 static long | |
55 #ifdef YYARG | |
56 yylex1(struct Yyarg *yyarg) | |
57 #else | |
58 yylex1(void) | |
59 #endif | |
60 { | |
61 long yychar; | |
62 const long *t3p; | |
63 int c; | |
64 | |
65 #ifdef YYARG | |
66 yychar = yylex(yyarg); | |
67 #else | |
68 yychar = yylex(); | |
69 #endif | |
70 if(yychar <= 0) { | |
71 c = yytok1[0]; | |
72 goto out; | |
73 } | |
74 if(yychar < sizeof(yytok1)/sizeof(yytok1[0])) { | |
75 c = yytok1[yychar]; | |
76 goto out; | |
77 } | |
78 if(yychar >= YYPRIVATE) | |
79 if(yychar < YYPRIVATE+sizeof(yytok2)/sizeof(yytok2[0])) { | |
80 c = yytok2[yychar-YYPRIVATE]; | |
81 goto out; | |
82 } | |
83 for(t3p=yytok3;; t3p+=2) { | |
84 c = t3p[0]; | |
85 if(c == yychar) { | |
86 c = t3p[1]; | |
87 goto out; | |
88 } | |
89 if(c == 0) | |
90 break; | |
91 } | |
92 c = 0; | |
93 | |
94 out: | |
95 if(c == 0) | |
96 c = yytok2[1]; /* unknown char */ | |
97 if(yydebug >= 3) | |
98 fprint(2, "lex %.4lux %s\n", yychar, yytokname(c)); | |
99 return c; | |
100 } | |
101 | |
102 int | |
103 #ifdef YYARG | |
104 yyparse(struct Yyarg *yyarg) | |
105 #else | |
106 yyparse(void) | |
107 #endif | |
108 { | |
109 struct | |
110 { | |
111 YYSTYPE yyv; | |
112 int yys; | |
113 } yys[YYMAXDEPTH], *yyp, *yypt; | |
114 const short *yyxi; | |
115 int yyj, yym, yystate, yyn, yyg; | |
116 long yychar; | |
117 #ifndef YYARG | |
118 YYSTYPE save1, save2; | |
119 int save3, save4; | |
120 | |
121 save1 = yylval; | |
122 save2 = yyval; | |
123 save3 = yynerrs; | |
124 save4 = yyerrflag; | |
125 #endif | |
126 | |
127 yystate = 0; | |
128 yychar = -1; | |
129 yynerrs = 0; | |
130 yyerrflag = 0; | |
131 yyp = &yys[-1]; | |
132 goto yystack; | |
133 | |
134 ret0: | |
135 yyn = 0; | |
136 goto ret; | |
137 | |
138 ret1: | |
139 yyn = 1; | |
140 goto ret; | |
141 | |
142 ret: | |
143 #ifndef YYARG | |
144 yylval = save1; | |
145 yyval = save2; | |
146 yynerrs = save3; | |
147 yyerrflag = save4; | |
148 #endif | |
149 return yyn; | |
150 | |
151 yystack: | |
152 /* put a state and value onto the stack */ | |
153 if(yydebug >= 4) | |
154 fprint(2, "char %s in %s", yytokname(yychar), yystatname… | |
155 | |
156 yyp++; | |
157 if(yyp >= &yys[YYMAXDEPTH]) { | |
158 yyerror("yacc stack overflow"); | |
159 goto ret1; | |
160 } | |
161 yyp->yys = yystate; | |
162 yyp->yyv = yyval; | |
163 | |
164 yynewstate: | |
165 yyn = yypact[yystate]; | |
166 if(yyn <= YYFLAG) | |
167 goto yydefault; /* simple state */ | |
168 if(yychar < 0) | |
169 #ifdef YYARG | |
170 yychar = yylex1(yyarg); | |
171 #else | |
172 yychar = yylex1(); | |
173 #endif | |
174 yyn += yychar; | |
175 if(yyn < 0 || yyn >= YYLAST) | |
176 goto yydefault; | |
177 yyn = yyact[yyn]; | |
178 if(yychk[yyn] == yychar) { /* valid shift */ | |
179 yychar = -1; | |
180 yyval = yylval; | |
181 yystate = yyn; | |
182 if(yyerrflag > 0) | |
183 yyerrflag--; | |
184 goto yystack; | |
185 } | |
186 | |
187 yydefault: | |
188 /* default state action */ | |
189 yyn = yydef[yystate]; | |
190 if(yyn == -2) { | |
191 if(yychar < 0) | |
192 #ifdef YYARG | |
193 yychar = yylex1(yyarg); | |
194 #else | |
195 yychar = yylex1(); | |
196 #endif | |
197 | |
198 /* look through exception table */ | |
199 for(yyxi=yyexca;; yyxi+=2) | |
200 if(yyxi[0] == -1 && yyxi[1] == yystate) | |
201 break; | |
202 for(yyxi += 2;; yyxi += 2) { | |
203 yyn = yyxi[0]; | |
204 if(yyn < 0 || yyn == yychar) | |
205 break; | |
206 } | |
207 yyn = yyxi[1]; | |
208 if(yyn < 0) | |
209 goto ret0; | |
210 } | |
211 if(yyn == 0) { | |
212 /* error ... attempt to resume parsing */ | |
213 switch(yyerrflag) { | |
214 case 0: /* brand new error */ | |
215 yyerror("syntax error"); | |
216 if(yydebug >= 1) { | |
217 fprint(2, "%s", yystatname(yystate)); | |
218 fprint(2, "saw %s\n", yytokname(yychar)); | |
219 } | |
220 goto yyerrlab; | |
221 yyerrlab: | |
222 yynerrs++; | |
223 | |
224 case 1: | |
225 case 2: /* incompletely recovered error ... try again */ | |
226 yyerrflag = 3; | |
227 | |
228 /* find a state where "error" is a legal shift a… | |
229 while(yyp >= yys) { | |
230 yyn = yypact[yyp->yys] + YYERRCODE; | |
231 if(yyn >= 0 && yyn < YYLAST) { | |
232 yystate = yyact[yyn]; /* simula… | |
233 if(yychk[yystate] == YYERRCODE) | |
234 goto yystack; | |
235 } | |
236 | |
237 /* the current yyp has no shift onn "err… | |
238 if(yydebug >= 2) | |
239 fprint(2, "error recovery pops s… | |
240 yyp->yys, (yyp-1)->yys ); | |
241 yyp--; | |
242 } | |
243 /* there is no state on the stack with an error … | |
244 goto ret1; | |
245 | |
246 case 3: /* no shift yet; clobber input char */ | |
247 if(yydebug >= 2) | |
248 fprint(2, "error recovery discards %s\n"… | |
249 if(yychar == YYEOFCODE) | |
250 goto ret1; | |
251 yychar = -1; | |
252 goto yynewstate; /* try again in the same stat… | |
253 } | |
254 } | |
255 | |
256 /* reduction by production yyn */ | |
257 if(yydebug >= 2) | |
258 fprint(2, "reduce %d in:\n\t%s", yyn, yystatname(yystate… | |
259 | |
260 yypt = yyp; | |
261 yyp -= yyr2[yyn]; | |
262 yyval = (yyp+1)->yyv; | |
263 yym = yyn; | |
264 | |
265 /* consult goto table to find next state */ | |
266 yyn = yyr1[yyn]; | |
267 yyg = yypgo[yyn]; | |
268 yyj = yyg + yyp->yys + 1; | |
269 | |
270 if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn) | |
271 yystate = yyact[yyg]; | |
272 switch(yym) { | |
273 $A | |
274 } | |
275 goto yystack; /* stack new state and value */ | |
276 } |