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