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