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