xref: /plan9/sys/lib/yaccpars (revision 2db064f5c36d74af0dfabf89298236aef9e1b979)
13e12c5d1SDavid du Colombier#define YYFLAG 		-1000
23e12c5d1SDavid du Colombier#define YYERROR		goto yyerrlab
33e12c5d1SDavid du Colombier#define YYACCEPT	return(0)
43e12c5d1SDavid du Colombier#define YYABORT		return(1)
53e12c5d1SDavid du Colombier#define	yyclearin	yychar = -1
63e12c5d1SDavid du Colombier#define	yyerrok		yyerrflag = 0
73e12c5d1SDavid du Colombier
83e12c5d1SDavid du Colombier#ifdef	yydebug
93e12c5d1SDavid du Colombier#include	"y.debug"
103e12c5d1SDavid du Colombier#else
113e12c5d1SDavid du Colombier#define	yydebug		0
127dd7cddfSDavid du Colombierchar*	yytoknames[1];		/* for debugging */
137dd7cddfSDavid du Colombierchar*	yystates[1];		/* for debugging */
143e12c5d1SDavid du Colombier#endif
153e12c5d1SDavid du Colombier
163e12c5d1SDavid du Colombier/*	parser for yacc output	*/
173e12c5d1SDavid du Colombier
183e12c5d1SDavid du Colombierint	yynerrs = 0;		/* number of errors */
193e12c5d1SDavid du Colombierint	yyerrflag = 0;		/* error recovery flag */
203e12c5d1SDavid du Colombier
213e12c5d1SDavid du Colombierchar*
223e12c5d1SDavid du Colombieryytokname(int yyc)
233e12c5d1SDavid du Colombier{
24*2db064f5SDavid du Colombier	static char x[16];
253e12c5d1SDavid du Colombier
263e12c5d1SDavid du Colombier	if(yyc > 0 && yyc <= sizeof(yytoknames)/sizeof(yytoknames[0]))
273e12c5d1SDavid du Colombier	if(yytoknames[yyc-1])
283e12c5d1SDavid du Colombier		return yytoknames[yyc-1];
293e12c5d1SDavid du Colombier	sprintf(x, "<%d>", yyc);
303e12c5d1SDavid du Colombier	return x;
313e12c5d1SDavid du Colombier}
323e12c5d1SDavid du Colombier
333e12c5d1SDavid du Colombierchar*
343e12c5d1SDavid du Colombieryystatname(int yys)
353e12c5d1SDavid du Colombier{
36*2db064f5SDavid du Colombier	static char x[16];
373e12c5d1SDavid du Colombier
383e12c5d1SDavid du Colombier	if(yys >= 0 && yys < sizeof(yystates)/sizeof(yystates[0]))
393e12c5d1SDavid du Colombier	if(yystates[yys])
403e12c5d1SDavid du Colombier		return yystates[yys];
413e12c5d1SDavid du Colombier	sprintf(x, "<%d>\n", yys);
423e12c5d1SDavid du Colombier	return x;
433e12c5d1SDavid du Colombier}
443e12c5d1SDavid du Colombier
453e12c5d1SDavid du Colombierlong
463e12c5d1SDavid du Colombieryylex1(void)
473e12c5d1SDavid du Colombier{
483e12c5d1SDavid du Colombier	long yychar;
493e12c5d1SDavid du Colombier	long *t3p;
503e12c5d1SDavid du Colombier	int c;
513e12c5d1SDavid du Colombier
523e12c5d1SDavid du Colombier	yychar = yylex();
533e12c5d1SDavid du Colombier	if(yychar <= 0) {
543e12c5d1SDavid du Colombier		c = yytok1[0];
553e12c5d1SDavid du Colombier		goto out;
563e12c5d1SDavid du Colombier	}
57219b2ee8SDavid du Colombier	if(yychar < sizeof(yytok1)/sizeof(yytok1[0])) {
583e12c5d1SDavid du Colombier		c = yytok1[yychar];
593e12c5d1SDavid du Colombier		goto out;
603e12c5d1SDavid du Colombier	}
613e12c5d1SDavid du Colombier	if(yychar >= YYPRIVATE)
623e12c5d1SDavid du Colombier		if(yychar < YYPRIVATE+sizeof(yytok2)/sizeof(yytok2[0])) {
633e12c5d1SDavid du Colombier			c = yytok2[yychar-YYPRIVATE];
643e12c5d1SDavid du Colombier			goto out;
653e12c5d1SDavid du Colombier		}
663e12c5d1SDavid du Colombier	for(t3p=yytok3;; t3p+=2) {
673e12c5d1SDavid du Colombier		c = t3p[0];
683e12c5d1SDavid du Colombier		if(c == yychar) {
693e12c5d1SDavid du Colombier			c = t3p[1];
703e12c5d1SDavid du Colombier			goto out;
713e12c5d1SDavid du Colombier		}
723e12c5d1SDavid du Colombier		if(c == 0)
733e12c5d1SDavid du Colombier			break;
743e12c5d1SDavid du Colombier	}
75bd389b36SDavid du Colombier	c = 0;
763e12c5d1SDavid du Colombier
773e12c5d1SDavid du Colombierout:
78bd389b36SDavid du Colombier	if(c == 0)
79bd389b36SDavid du Colombier		c = yytok2[1];	/* unknown char */
803e12c5d1SDavid du Colombier	if(yydebug >= 3)
815fab9909SDavid du Colombier		printf("lex %.4lX %s\n", yychar, yytokname(c));
823e12c5d1SDavid du Colombier	return c;
833e12c5d1SDavid du Colombier}
843e12c5d1SDavid du Colombier
853e12c5d1SDavid du Colombierint
863e12c5d1SDavid du Colombieryyparse(void)
873e12c5d1SDavid du Colombier{
883e12c5d1SDavid du Colombier	struct
893e12c5d1SDavid du Colombier	{
903e12c5d1SDavid du Colombier		YYSTYPE	yyv;
913e12c5d1SDavid du Colombier		int	yys;
923e12c5d1SDavid du Colombier	} yys[YYMAXDEPTH], *yyp, *yypt;
933e12c5d1SDavid du Colombier	short *yyxi;
943e12c5d1SDavid du Colombier	int yyj, yym, yystate, yyn, yyg;
95219b2ee8SDavid du Colombier	YYSTYPE save1, save2;
96219b2ee8SDavid du Colombier	int save3, save4;
977dd7cddfSDavid du Colombier	long yychar;
98219b2ee8SDavid du Colombier
99219b2ee8SDavid du Colombier	save1 = yylval;
100219b2ee8SDavid du Colombier	save2 = yyval;
101219b2ee8SDavid du Colombier	save3 = yynerrs;
102219b2ee8SDavid du Colombier	save4 = yyerrflag;
1033e12c5d1SDavid du Colombier
1043e12c5d1SDavid du Colombier	yystate = 0;
1053e12c5d1SDavid du Colombier	yychar = -1;
1063e12c5d1SDavid du Colombier	yynerrs = 0;
1073e12c5d1SDavid du Colombier	yyerrflag = 0;
1083e12c5d1SDavid du Colombier	yyp = &yys[-1];
109219b2ee8SDavid du Colombier	goto yystack;
110219b2ee8SDavid du Colombier
111219b2ee8SDavid du Colombierret0:
112219b2ee8SDavid du Colombier	yyn = 0;
113219b2ee8SDavid du Colombier	goto ret;
114219b2ee8SDavid du Colombier
115219b2ee8SDavid du Colombierret1:
116219b2ee8SDavid du Colombier	yyn = 1;
117219b2ee8SDavid du Colombier	goto ret;
118219b2ee8SDavid du Colombier
119219b2ee8SDavid du Colombierret:
120219b2ee8SDavid du Colombier	yylval = save1;
121219b2ee8SDavid du Colombier	yyval = save2;
122219b2ee8SDavid du Colombier	yynerrs = save3;
123219b2ee8SDavid du Colombier	yyerrflag = save4;
124219b2ee8SDavid du Colombier	return yyn;
1253e12c5d1SDavid du Colombier
1263e12c5d1SDavid du Colombieryystack:
1273e12c5d1SDavid du Colombier	/* put a state and value onto the stack */
1283e12c5d1SDavid du Colombier	if(yydebug >= 4)
1293e12c5d1SDavid du Colombier		printf("char %s in %s", yytokname(yychar), yystatname(yystate));
1303e12c5d1SDavid du Colombier
1313e12c5d1SDavid du Colombier	yyp++;
1323e12c5d1SDavid du Colombier	if(yyp >= &yys[YYMAXDEPTH]) {
1333e12c5d1SDavid du Colombier		yyerror("yacc stack overflow");
134219b2ee8SDavid du Colombier		goto ret1;
1353e12c5d1SDavid du Colombier	}
1363e12c5d1SDavid du Colombier	yyp->yys = yystate;
1373e12c5d1SDavid du Colombier	yyp->yyv = yyval;
1383e12c5d1SDavid du Colombier
1393e12c5d1SDavid du Colombieryynewstate:
1403e12c5d1SDavid du Colombier	yyn = yypact[yystate];
1413e12c5d1SDavid du Colombier	if(yyn <= YYFLAG)
1423e12c5d1SDavid du Colombier		goto yydefault; /* simple state */
1433e12c5d1SDavid du Colombier	if(yychar < 0)
1443e12c5d1SDavid du Colombier		yychar = yylex1();
1453e12c5d1SDavid du Colombier	yyn += yychar;
1463e12c5d1SDavid du Colombier	if(yyn < 0 || yyn >= YYLAST)
1473e12c5d1SDavid du Colombier		goto yydefault;
1483e12c5d1SDavid du Colombier	yyn = yyact[yyn];
1493e12c5d1SDavid du Colombier	if(yychk[yyn] == yychar) { /* valid shift */
1503e12c5d1SDavid du Colombier		yychar = -1;
1513e12c5d1SDavid du Colombier		yyval = yylval;
1523e12c5d1SDavid du Colombier		yystate = yyn;
1533e12c5d1SDavid du Colombier		if(yyerrflag > 0)
1543e12c5d1SDavid du Colombier			yyerrflag--;
1553e12c5d1SDavid du Colombier		goto yystack;
1563e12c5d1SDavid du Colombier	}
1573e12c5d1SDavid du Colombier
1583e12c5d1SDavid du Colombieryydefault:
1593e12c5d1SDavid du Colombier	/* default state action */
1603e12c5d1SDavid du Colombier	yyn = yydef[yystate];
1613e12c5d1SDavid du Colombier	if(yyn == -2) {
1623e12c5d1SDavid du Colombier		if(yychar < 0)
1633e12c5d1SDavid du Colombier			yychar = yylex1();
1643e12c5d1SDavid du Colombier
1653e12c5d1SDavid du Colombier		/* look through exception table */
1663e12c5d1SDavid du Colombier		for(yyxi=yyexca;; yyxi+=2)
1673e12c5d1SDavid du Colombier			if(yyxi[0] == -1 && yyxi[1] == yystate)
1683e12c5d1SDavid du Colombier				break;
1693e12c5d1SDavid du Colombier		for(yyxi += 2;; yyxi += 2) {
1703e12c5d1SDavid du Colombier			yyn = yyxi[0];
1713e12c5d1SDavid du Colombier			if(yyn < 0 || yyn == yychar)
1723e12c5d1SDavid du Colombier				break;
1733e12c5d1SDavid du Colombier		}
1743e12c5d1SDavid du Colombier		yyn = yyxi[1];
1753e12c5d1SDavid du Colombier		if(yyn < 0)
176219b2ee8SDavid du Colombier			goto ret0;
1773e12c5d1SDavid du Colombier	}
1783e12c5d1SDavid du Colombier	if(yyn == 0) {
1793e12c5d1SDavid du Colombier		/* error ... attempt to resume parsing */
1803e12c5d1SDavid du Colombier		switch(yyerrflag) {
1813e12c5d1SDavid du Colombier		case 0:   /* brand new error */
1823e12c5d1SDavid du Colombier			yyerror("syntax error");
1833e12c5d1SDavid du Colombier			if(yydebug >= 1) {
1843e12c5d1SDavid du Colombier				printf("%s", yystatname(yystate));
1853e12c5d1SDavid du Colombier				printf("saw %s\n", yytokname(yychar));
1863e12c5d1SDavid du Colombier			}
187bd389b36SDavid du Colombieryyerrlab:
1883e12c5d1SDavid du Colombier			yynerrs++;
1893e12c5d1SDavid du Colombier
1903e12c5d1SDavid du Colombier		case 1:
1913e12c5d1SDavid du Colombier		case 2: /* incompletely recovered error ... try again */
1923e12c5d1SDavid du Colombier			yyerrflag = 3;
1933e12c5d1SDavid du Colombier
1943e12c5d1SDavid du Colombier			/* find a state where "error" is a legal shift action */
1953e12c5d1SDavid du Colombier			while(yyp >= yys) {
1963e12c5d1SDavid du Colombier				yyn = yypact[yyp->yys] + YYERRCODE;
1973e12c5d1SDavid du Colombier				if(yyn >= 0 && yyn < YYLAST) {
1983e12c5d1SDavid du Colombier					yystate = yyact[yyn];  /* simulate a shift of "error" */
1993e12c5d1SDavid du Colombier					if(yychk[yystate] == YYERRCODE)
2003e12c5d1SDavid du Colombier						goto yystack;
2013e12c5d1SDavid du Colombier				}
2023e12c5d1SDavid du Colombier
2033e12c5d1SDavid du Colombier				/* the current yyp has no shift onn "error", pop stack */
2043e12c5d1SDavid du Colombier				if(yydebug >= 2)
2053e12c5d1SDavid du Colombier					printf("error recovery pops state %d, uncovers %d\n",
2063e12c5d1SDavid du Colombier						yyp->yys, (yyp-1)->yys );
2073e12c5d1SDavid du Colombier				yyp--;
2083e12c5d1SDavid du Colombier			}
2093e12c5d1SDavid du Colombier			/* there is no state on the stack with an error shift ... abort */
210219b2ee8SDavid du Colombier			goto ret1;
2113e12c5d1SDavid du Colombier
2123e12c5d1SDavid du Colombier		case 3:  /* no shift yet; clobber input char */
213bd389b36SDavid du Colombier			if(yydebug >= YYEOFCODE)
2143e12c5d1SDavid du Colombier				printf("error recovery discards %s\n", yytokname(yychar));
2157dd7cddfSDavid du Colombier			if(yychar == YYEOFCODE)
216219b2ee8SDavid du Colombier				goto ret1;
2173e12c5d1SDavid du Colombier			yychar = -1;
2183e12c5d1SDavid du Colombier			goto yynewstate;   /* try again in the same state */
2193e12c5d1SDavid du Colombier		}
2203e12c5d1SDavid du Colombier	}
2213e12c5d1SDavid du Colombier
2223e12c5d1SDavid du Colombier	/* reduction by production yyn */
2233e12c5d1SDavid du Colombier	if(yydebug >= 2)
2243e12c5d1SDavid du Colombier		printf("reduce %d in:\n\t%s", yyn, yystatname(yystate));
2253e12c5d1SDavid du Colombier
2263e12c5d1SDavid du Colombier	yypt = yyp;
2273e12c5d1SDavid du Colombier	yyp -= yyr2[yyn];
2283e12c5d1SDavid du Colombier	yyval = (yyp+1)->yyv;
2293e12c5d1SDavid du Colombier	yym = yyn;
2303e12c5d1SDavid du Colombier
2313e12c5d1SDavid du Colombier	/* consult goto table to find next state */
2323e12c5d1SDavid du Colombier	yyn = yyr1[yyn];
2333e12c5d1SDavid du Colombier	yyg = yypgo[yyn];
2343e12c5d1SDavid du Colombier	yyj = yyg + yyp->yys + 1;
2353e12c5d1SDavid du Colombier
2363e12c5d1SDavid du Colombier	if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn)
2373e12c5d1SDavid du Colombier		yystate = yyact[yyg];
2383e12c5d1SDavid du Colombier	switch(yym) {
2393e12c5d1SDavid du Colombier		$A
2403e12c5d1SDavid du Colombier	}
2413e12c5d1SDavid du Colombier	goto yystack;  /* stack new state and value */
2423e12c5d1SDavid du Colombier}
243