#define YYFLAG -1000
#define YYERROR goto yyerrlab
#define YYACCEPT return(0)
#define YYABORT return(1)
#define yydebug 0
/* parser for yacc output */
YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
int yychar = -1; /* current input token number */
int yynerrs = 0; /* number of errors */
short yyerrflag = 0; /* error recovery flag */
char *yytoknames[1]; /* for debugging */
char *yystates[1]; /* for debugging */
int
yyparse(void)
{
short yys[YYMAXDEPTH], *yyps, *yyxi;
int yyj, yym, yystate, yyn;
YYSTYPE *yypvt, *yypv;
yystate = 0;
yychar = -1;
yynerrs = 0;
yyerrflag = 0;
yyps = &yys[-1];
yypv = &yyv[-1];
yystack:
/* put a state and value onto the stack */
if(yydebug >= 3)
if(yychar < 0 || yytoknames[yychar] == 0)
printf("char %d in %s", yychar, yystates[yystate]);
else
printf("%s in %s", yytoknames[yychar], yystates[yystate]);
if(++yyps >= &yys[YYMAXDEPTH]) {
yyerror("yacc stack overflow");
return 1;
}
*yyps = yystate;
++yypv;
*yypv = yyval;
yynewstate:
yyn = yypact[yystate];
if(yyn <= YYFLAG)
goto yydefault; /* simple state */
if(yychar < 0) {
yychar = yylex();
if(yydebug >= 2) {
if(yychar <= 0)
printf("lex EOF\n");
else
if(yytoknames[yychar])
printf("lex %s\n", yytoknames[yychar]);
else
printf("lex (%c)\n", yychar);
}
if(yychar < 0)
yychar = 0;
}
if((yyn += yychar) < 0 || yyn >= YYLAST)
goto yydefault;
if(yychk[yyn=yyact[yyn]] == yychar) { /* valid shift */
yychar = -1;
yyval = yylval;
yystate = yyn;
if(yyerrflag > 0)
--yyerrflag;
goto yystack;
}
yydefault:
/* default state action */
if((yyn=yydef[yystate]) == -2) {
if(yychar < 0) {
yychar = yylex();
if(yydebug >= 2)
if(yychar < 0)
printf("lex EOF\n");
else
printf("lex %s\n", yytoknames[yychar]);
if(yychar < 0)
yychar = 0;
}
/* look through exception table */
for(yyxi = yyexca; *yyxi != -1 || yyxi[1] != yystate; yyxi += 2)
;
while(*(yyxi+=2) >= 0)
if(*yyxi == yychar)
break;
if((yyn = yyxi[1]) < 0)
return 0; /* accept */
}
if(yyn == 0) {
/* error ... attempt to resume parsing */
switch(yyerrflag) {
case 0: /* brand new error */
yyerror("syntax error");
if(yydebug) {
printf("%s", yystates[yystate]);
if(yytoknames[yychar])
printf("saw %s\n", yytoknames[yychar]);
else
if(yychar >= ' ' && yychar < 0177)
printf("saw `%c'\n", yychar);
else
if(yychar == 0)
printf("saw EOF\n");
else
printf("saw char 0%o\n", yychar);
}
++yynerrs;
case 1:
case 2: /* incompletely recovered error ... try again */
yyerrflag = 3;
/* find a state where "error" is a legal shift action */
while(yyps >= yys) {
yyn = yypact[*yyps] + YYERRCODE;
if(yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE) {
yystate = yyact[yyn]; /* simulate a shift of "error" */
goto yystack;
}
/* the current yyps has no shift onn "error", pop stack */
if(yydebug)
printf("error recovery pops state %d, uncovers %d\n",
*yyps, yyps[-1] );
--yyps;
--yypv;
}
/* there is no state on the stack with an error shift ... abort */
return 1;
case 3: /* no shift yet; clobber input char */
if(yydebug) {
printf("error recovery discards ");
if(yytoknames[yychar])
printf("%s\n", yytoknames[yychar]);
else
if(yychar >= ' ' && yychar < 0177)
printf("`%c'\n", yychar);
else
if(yychar == 0)
printf("EOF\n");
else
printf("char 0%o\n", yychar);
}
if(yychar == 0)
return 1; /* don't discard EOF, quit */
yychar = -1;
goto yynewstate; /* try again in the same state */
}
}
/* reduction by production yyn */
if(yydebug) {
char *s;
printf("reduce %d in:\n\t", yyn);
for(s = yystates[yystate]; *s; s++) {
printf("%c", *s);
if(*s == '\n' && *(s+1))
printf("\t");
}
}
yyps -= yyr2[yyn];
yypvt = yypv;
yypv -= yyr2[yyn];
yyval = yypv[1];
yym = yyn;
/* consult goto table to find next state */
yyn = yyr1[yyn];
yyj = yypgo[yyn] + *yyps + 1;
if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn)
yystate = yyact[yypgo[yyn]];
switch(yym) {
$A
}
goto yystack; /* stack new state and value */
}
|