xref: /inferno-os/utils/lib/yaccpar (revision 6e425a9de8c003b5a733621a6b6730ec3cc902b8)
174a4d8c2SCharles.Forsyth#define YYFLAG 		-1000
274a4d8c2SCharles.Forsyth#define	yyclearin	yychar = -1
374a4d8c2SCharles.Forsyth#define	yyerrok		yyerrflag = 0
474a4d8c2SCharles.Forsyth
574a4d8c2SCharles.Forsyth#ifdef	yydebug
674a4d8c2SCharles.Forsyth#include	"y.debug"
774a4d8c2SCharles.Forsyth#else
874a4d8c2SCharles.Forsyth#define	yydebug		0
974a4d8c2SCharles.Forsythchar*	yytoknames[1];		/* for debugging */
1074a4d8c2SCharles.Forsythchar*	yystates[1];		/* for debugging */
1174a4d8c2SCharles.Forsyth#endif
1274a4d8c2SCharles.Forsyth
1374a4d8c2SCharles.Forsyth/*	parser for yacc output	*/
1474a4d8c2SCharles.Forsyth
1574a4d8c2SCharles.Forsythint	yynerrs = 0;		/* number of errors */
1674a4d8c2SCharles.Forsythint	yyerrflag = 0;		/* error recovery flag */
1774a4d8c2SCharles.Forsyth
1874a4d8c2SCharles.Forsythextern	int	fprint(int, char*, ...);
1974a4d8c2SCharles.Forsythextern	int	sprint(char*, char*, ...);
2074a4d8c2SCharles.Forsyth
2174a4d8c2SCharles.Forsythchar*
2274a4d8c2SCharles.Forsythyytokname(int yyc)
2374a4d8c2SCharles.Forsyth{
24*6e425a9dSCharles.Forsyth	static char x[16];
2574a4d8c2SCharles.Forsyth
2674a4d8c2SCharles.Forsyth	if(yyc > 0 && yyc <= sizeof(yytoknames)/sizeof(yytoknames[0]))
2774a4d8c2SCharles.Forsyth	if(yytoknames[yyc-1])
2874a4d8c2SCharles.Forsyth		return yytoknames[yyc-1];
2974a4d8c2SCharles.Forsyth	sprint(x, "<%d>", yyc);
3074a4d8c2SCharles.Forsyth	return x;
3174a4d8c2SCharles.Forsyth}
3274a4d8c2SCharles.Forsyth
3374a4d8c2SCharles.Forsythchar*
3474a4d8c2SCharles.Forsythyystatname(int yys)
3574a4d8c2SCharles.Forsyth{
36*6e425a9dSCharles.Forsyth	static char x[16];
3774a4d8c2SCharles.Forsyth
3874a4d8c2SCharles.Forsyth	if(yys >= 0 && yys < sizeof(yystates)/sizeof(yystates[0]))
3974a4d8c2SCharles.Forsyth	if(yystates[yys])
4074a4d8c2SCharles.Forsyth		return yystates[yys];
4174a4d8c2SCharles.Forsyth	sprint(x, "<%d>\n", yys);
4274a4d8c2SCharles.Forsyth	return x;
4374a4d8c2SCharles.Forsyth}
4474a4d8c2SCharles.Forsyth
4574a4d8c2SCharles.Forsythlong
4674a4d8c2SCharles.Forsythyylex1(void)
4774a4d8c2SCharles.Forsyth{
4874a4d8c2SCharles.Forsyth	long yychar;
4974a4d8c2SCharles.Forsyth	long *t3p;
5074a4d8c2SCharles.Forsyth	int c;
5174a4d8c2SCharles.Forsyth
5274a4d8c2SCharles.Forsyth	yychar = yylex();
5374a4d8c2SCharles.Forsyth	if(yychar <= 0) {
5474a4d8c2SCharles.Forsyth		c = yytok1[0];
5574a4d8c2SCharles.Forsyth		goto out;
5674a4d8c2SCharles.Forsyth	}
5774a4d8c2SCharles.Forsyth	if(yychar < sizeof(yytok1)/sizeof(yytok1[0])) {
5874a4d8c2SCharles.Forsyth		c = yytok1[yychar];
5974a4d8c2SCharles.Forsyth		goto out;
6074a4d8c2SCharles.Forsyth	}
6174a4d8c2SCharles.Forsyth	if(yychar >= YYPRIVATE)
6274a4d8c2SCharles.Forsyth		if(yychar < YYPRIVATE+sizeof(yytok2)/sizeof(yytok2[0])) {
6374a4d8c2SCharles.Forsyth			c = yytok2[yychar-YYPRIVATE];
6474a4d8c2SCharles.Forsyth			goto out;
6574a4d8c2SCharles.Forsyth		}
6674a4d8c2SCharles.Forsyth	for(t3p=yytok3;; t3p+=2) {
6774a4d8c2SCharles.Forsyth		c = t3p[0];
6874a4d8c2SCharles.Forsyth		if(c == yychar) {
6974a4d8c2SCharles.Forsyth			c = t3p[1];
7074a4d8c2SCharles.Forsyth			goto out;
7174a4d8c2SCharles.Forsyth		}
7274a4d8c2SCharles.Forsyth		if(c == 0)
7374a4d8c2SCharles.Forsyth			break;
7474a4d8c2SCharles.Forsyth	}
7574a4d8c2SCharles.Forsyth	c = 0;
7674a4d8c2SCharles.Forsyth
7774a4d8c2SCharles.Forsythout:
7874a4d8c2SCharles.Forsyth	if(c == 0)
7974a4d8c2SCharles.Forsyth		c = yytok2[1];	/* unknown char */
8074a4d8c2SCharles.Forsyth	if(yydebug >= 3)
8174a4d8c2SCharles.Forsyth		fprint(2, "lex %.4lux %s\n", yychar, yytokname(c));
8274a4d8c2SCharles.Forsyth	return c;
8374a4d8c2SCharles.Forsyth}
8474a4d8c2SCharles.Forsyth
8574a4d8c2SCharles.Forsythint
8674a4d8c2SCharles.Forsythyyparse(void)
8774a4d8c2SCharles.Forsyth{
8874a4d8c2SCharles.Forsyth	struct
8974a4d8c2SCharles.Forsyth	{
9074a4d8c2SCharles.Forsyth		YYSTYPE	yyv;
9174a4d8c2SCharles.Forsyth		int	yys;
9274a4d8c2SCharles.Forsyth	} yys[YYMAXDEPTH], *yyp, *yypt;
9374a4d8c2SCharles.Forsyth	short *yyxi;
9474a4d8c2SCharles.Forsyth	int yyj, yym, yystate, yyn, yyg;
9574a4d8c2SCharles.Forsyth	long yychar;
9674a4d8c2SCharles.Forsyth	YYSTYPE save1, save2;
9774a4d8c2SCharles.Forsyth	int save3, save4;
9874a4d8c2SCharles.Forsyth
9974a4d8c2SCharles.Forsyth	save1 = yylval;
10074a4d8c2SCharles.Forsyth	save2 = yyval;
10174a4d8c2SCharles.Forsyth	save3 = yynerrs;
10274a4d8c2SCharles.Forsyth	save4 = yyerrflag;
10374a4d8c2SCharles.Forsyth
10474a4d8c2SCharles.Forsyth	yystate = 0;
10574a4d8c2SCharles.Forsyth	yychar = -1;
10674a4d8c2SCharles.Forsyth	yynerrs = 0;
10774a4d8c2SCharles.Forsyth	yyerrflag = 0;
10874a4d8c2SCharles.Forsyth	yyp = &yys[-1];
10974a4d8c2SCharles.Forsyth	goto yystack;
11074a4d8c2SCharles.Forsyth
11174a4d8c2SCharles.Forsythret0:
11274a4d8c2SCharles.Forsyth	yyn = 0;
11374a4d8c2SCharles.Forsyth	goto ret;
11474a4d8c2SCharles.Forsyth
11574a4d8c2SCharles.Forsythret1:
11674a4d8c2SCharles.Forsyth	yyn = 1;
11774a4d8c2SCharles.Forsyth	goto ret;
11874a4d8c2SCharles.Forsyth
11974a4d8c2SCharles.Forsythret:
12074a4d8c2SCharles.Forsyth	yylval = save1;
12174a4d8c2SCharles.Forsyth	yyval = save2;
12274a4d8c2SCharles.Forsyth	yynerrs = save3;
12374a4d8c2SCharles.Forsyth	yyerrflag = save4;
12474a4d8c2SCharles.Forsyth	return yyn;
12574a4d8c2SCharles.Forsyth
12674a4d8c2SCharles.Forsythyystack:
12774a4d8c2SCharles.Forsyth	/* put a state and value onto the stack */
12874a4d8c2SCharles.Forsyth	if(yydebug >= 4)
12974a4d8c2SCharles.Forsyth		fprint(2, "char %s in %s", yytokname(yychar), yystatname(yystate));
13074a4d8c2SCharles.Forsyth
13174a4d8c2SCharles.Forsyth	yyp++;
13274a4d8c2SCharles.Forsyth	if(yyp >= &yys[YYMAXDEPTH]) {
13374a4d8c2SCharles.Forsyth		yyerror("yacc stack overflow");
13474a4d8c2SCharles.Forsyth		goto ret1;
13574a4d8c2SCharles.Forsyth	}
13674a4d8c2SCharles.Forsyth	yyp->yys = yystate;
13774a4d8c2SCharles.Forsyth	yyp->yyv = yyval;
13874a4d8c2SCharles.Forsyth
13974a4d8c2SCharles.Forsythyynewstate:
14074a4d8c2SCharles.Forsyth	yyn = yypact[yystate];
14174a4d8c2SCharles.Forsyth	if(yyn <= YYFLAG)
14274a4d8c2SCharles.Forsyth		goto yydefault; /* simple state */
14374a4d8c2SCharles.Forsyth	if(yychar < 0)
14474a4d8c2SCharles.Forsyth		yychar = yylex1();
14574a4d8c2SCharles.Forsyth	yyn += yychar;
14674a4d8c2SCharles.Forsyth	if(yyn < 0 || yyn >= YYLAST)
14774a4d8c2SCharles.Forsyth		goto yydefault;
14874a4d8c2SCharles.Forsyth	yyn = yyact[yyn];
14974a4d8c2SCharles.Forsyth	if(yychk[yyn] == yychar) { /* valid shift */
15074a4d8c2SCharles.Forsyth		yychar = -1;
15174a4d8c2SCharles.Forsyth		yyval = yylval;
15274a4d8c2SCharles.Forsyth		yystate = yyn;
15374a4d8c2SCharles.Forsyth		if(yyerrflag > 0)
15474a4d8c2SCharles.Forsyth			yyerrflag--;
15574a4d8c2SCharles.Forsyth		goto yystack;
15674a4d8c2SCharles.Forsyth	}
15774a4d8c2SCharles.Forsyth
15874a4d8c2SCharles.Forsythyydefault:
15974a4d8c2SCharles.Forsyth	/* default state action */
16074a4d8c2SCharles.Forsyth	yyn = yydef[yystate];
16174a4d8c2SCharles.Forsyth	if(yyn == -2) {
16274a4d8c2SCharles.Forsyth		if(yychar < 0)
16374a4d8c2SCharles.Forsyth			yychar = yylex1();
16474a4d8c2SCharles.Forsyth
16574a4d8c2SCharles.Forsyth		/* look through exception table */
16674a4d8c2SCharles.Forsyth		for(yyxi=yyexca;; yyxi+=2)
16774a4d8c2SCharles.Forsyth			if(yyxi[0] == -1 && yyxi[1] == yystate)
16874a4d8c2SCharles.Forsyth				break;
16974a4d8c2SCharles.Forsyth		for(yyxi += 2;; yyxi += 2) {
17074a4d8c2SCharles.Forsyth			yyn = yyxi[0];
17174a4d8c2SCharles.Forsyth			if(yyn < 0 || yyn == yychar)
17274a4d8c2SCharles.Forsyth				break;
17374a4d8c2SCharles.Forsyth		}
17474a4d8c2SCharles.Forsyth		yyn = yyxi[1];
17574a4d8c2SCharles.Forsyth		if(yyn < 0)
17674a4d8c2SCharles.Forsyth			goto ret0;
17774a4d8c2SCharles.Forsyth	}
17874a4d8c2SCharles.Forsyth	if(yyn == 0) {
17974a4d8c2SCharles.Forsyth		/* error ... attempt to resume parsing */
18074a4d8c2SCharles.Forsyth		switch(yyerrflag) {
18174a4d8c2SCharles.Forsyth		case 0:   /* brand new error */
18274a4d8c2SCharles.Forsyth			yyerror("syntax error");
18374a4d8c2SCharles.Forsyth			yynerrs++;
18474a4d8c2SCharles.Forsyth			if(yydebug >= 1) {
18574a4d8c2SCharles.Forsyth				fprint(2, "%s", yystatname(yystate));
18674a4d8c2SCharles.Forsyth				fprint(2, "saw %s\n", yytokname(yychar));
18774a4d8c2SCharles.Forsyth			}
18874a4d8c2SCharles.Forsyth
18974a4d8c2SCharles.Forsyth		case 1:
19074a4d8c2SCharles.Forsyth		case 2: /* incompletely recovered error ... try again */
19174a4d8c2SCharles.Forsyth			yyerrflag = 3;
19274a4d8c2SCharles.Forsyth
19374a4d8c2SCharles.Forsyth			/* find a state where "error" is a legal shift action */
19474a4d8c2SCharles.Forsyth			while(yyp >= yys) {
19574a4d8c2SCharles.Forsyth				yyn = yypact[yyp->yys] + YYERRCODE;
19674a4d8c2SCharles.Forsyth				if(yyn >= 0 && yyn < YYLAST) {
19774a4d8c2SCharles.Forsyth					yystate = yyact[yyn];  /* simulate a shift of "error" */
19874a4d8c2SCharles.Forsyth					if(yychk[yystate] == YYERRCODE)
19974a4d8c2SCharles.Forsyth						goto yystack;
20074a4d8c2SCharles.Forsyth				}
20174a4d8c2SCharles.Forsyth
20274a4d8c2SCharles.Forsyth				/* the current yyp has no shift onn "error", pop stack */
20374a4d8c2SCharles.Forsyth				if(yydebug >= 2)
20474a4d8c2SCharles.Forsyth					fprint(2, "error recovery pops state %d, uncovers %d\n",
20574a4d8c2SCharles.Forsyth						yyp->yys, (yyp-1)->yys );
20674a4d8c2SCharles.Forsyth				yyp--;
20774a4d8c2SCharles.Forsyth			}
20874a4d8c2SCharles.Forsyth			/* there is no state on the stack with an error shift ... abort */
20974a4d8c2SCharles.Forsyth			goto ret1;
21074a4d8c2SCharles.Forsyth
21174a4d8c2SCharles.Forsyth		case 3:  /* no shift yet; clobber input char */
21274a4d8c2SCharles.Forsyth			if(yydebug >= 2)
21374a4d8c2SCharles.Forsyth				fprint(2, "error recovery discards %s\n", yytokname(yychar));
21474a4d8c2SCharles.Forsyth			if(yychar == YYEOFCODE)
21574a4d8c2SCharles.Forsyth				goto ret1;
21674a4d8c2SCharles.Forsyth			yychar = -1;
21774a4d8c2SCharles.Forsyth			goto yynewstate;   /* try again in the same state */
21874a4d8c2SCharles.Forsyth		}
21974a4d8c2SCharles.Forsyth	}
22074a4d8c2SCharles.Forsyth
22174a4d8c2SCharles.Forsyth	/* reduction by production yyn */
22274a4d8c2SCharles.Forsyth	if(yydebug >= 2)
22374a4d8c2SCharles.Forsyth		fprint(2, "reduce %d in:\n\t%s", yyn, yystatname(yystate));
22474a4d8c2SCharles.Forsyth
22574a4d8c2SCharles.Forsyth	yypt = yyp;
22674a4d8c2SCharles.Forsyth	yyp -= yyr2[yyn];
22774a4d8c2SCharles.Forsyth	yyval = (yyp+1)->yyv;
22874a4d8c2SCharles.Forsyth	yym = yyn;
22974a4d8c2SCharles.Forsyth
23074a4d8c2SCharles.Forsyth	/* consult goto table to find next state */
23174a4d8c2SCharles.Forsyth	yyn = yyr1[yyn];
23274a4d8c2SCharles.Forsyth	yyg = yypgo[yyn];
23374a4d8c2SCharles.Forsyth	yyj = yyg + yyp->yys + 1;
23474a4d8c2SCharles.Forsyth
23574a4d8c2SCharles.Forsyth	if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn)
23674a4d8c2SCharles.Forsyth		yystate = yyact[yyg];
23774a4d8c2SCharles.Forsyth	switch(yym) {
23874a4d8c2SCharles.Forsyth		$A
23974a4d8c2SCharles.Forsyth	}
24074a4d8c2SCharles.Forsyth	goto yystack;  /* stack new state and value */
24174a4d8c2SCharles.Forsyth}
242