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