Introduction
Introduction Statistics Contact Development Disclaimer Help
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 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.