/* -*- C -*- */ /* YYERROR and YYCOST are set by guards. If yyerror is set to a nonzero value by a guard, the reduction with which the guard is associated is not performed, and the error recovery mechanism is invoked. Yycost indicates the cost of performing the reduction given the attributes of the symbols. */ static int yyerror; static int yycost; /* YYMAXDEPTH indicates the size of the parser's state and value stacks. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 500 #endif /* YYMAXRULES must be at least as large as the number of rules that could be placed in the rule queue. That number could be determined from the grammar and the size of the stack, but, as yet, it is not. */ #ifndef YYMAXRULES # define YYMAXRULES 100 #endif #ifndef YYMAXBACKUP # define YYMAXBACKUP 100 #endif /* The state stack. */ static short yyss[YYMAXDEPTH]; /* The semantic value stack. */ static YYSTYPE yyvs[YYMAXDEPTH]; /* The location stack. */ static YYLTYPE yyls[YYMAXDEPTH]; /* The rule queue. */ static short yyrq[YYMAXRULES]; /* The lookahead symbol. */ static int yychar; /* the semantic value of the lookahead symbol. */ static YYSTYPE yylval; /* the semantic value for the state at the top of the state stack. */ static YYSTYPE yytval; /* the variable used to return semantic values from the action routines. */ static YYSTYPE yyval; /* location data for the lookahead symbol. */ static YYLTYPE yylloc; /* location data for the state at the top of the state stack. */ static YYLTYPE yytloc; static int yynunlexed; static short yyunchar[YYMAXBACKUP]; static YYSTYPE yyunval[YYMAXBACKUP]; static YYLTYPE yyunloc[YYMAXBACKUP]; /* a pointer to the top of the state stack; only set during error recovery. */ static short *yygssp; /* a pointer to the top of the value stack; only set during error recovery. */ static YYSTYPE *yygvsp; /* a pointer to the top of the location stack; only set during error recovery. */ static YYLTYPE *yyglsp; /*--------------------------------------------------------------------. | Yyget is an interface between the parser and the lexical analyzer. | | It is costly to provide such an interface, but it avoids requiring | | the lexical analyzer to be able to back up the scan. | `--------------------------------------------------------------------*/ static inline void yyget (void) { if (yynunlexed > 0) { yynunlexed--; yychar = yyunchar[yynunlexed]; yylval = yyunval[yynunlexed]; yylloc = yyunloc[yynunlexed]; } else if (yychar <= 0) yychar = 0; else { yychar = yylex (); if (yychar < 0) yychar = 0; else yychar = YYTRANSLATE (yychar); } } static inline void yyunlex (int chr, YYSTYPE val, YYLTYPE loc) { yyunchar[yynunlexed] = chr; yyunval[yynunlexed] = val; yyunloc[yynunlexed] = loc; yynunlexed++; } static inline void yyrestore (short *first, short *last) { short *ssp; short *rp; int symbol; int state; int tvalsaved; ssp = yygssp; yyunlex (yychar, yylval, yylloc); tvalsaved = 0; while (first != last) { symbol = yystos[*ssp]; if (symbol < YYNTBASE) { yyunlex (symbol, yytval, yytloc); tvalsaved = 1; ssp--; } ssp--; if (first == yyrq) first = yyrq + YYMAXRULES; first--; for (rp = yyrhs + yyprhs[*first]; symbol = *rp; rp++) { if (symbol < YYNTBASE) state = yytable[yypact[*ssp] + symbol]; else { state = yypgoto[symbol - YYNTBASE] + *ssp; if (state >= 0 && state <= YYLAST && yycheck[state] == *ssp) state = yytable[state]; else state = yydefgoto[symbol - YYNTBASE]; } *++ssp = state; } } if (!tvalsaved && ssp > yyss) { yyunlex (yystos[*ssp], yytval, yytloc); ssp--; } yygssp = ssp; } int yyparse (void) { int yystate; int yyn; short *yyssp; short *yyrq0; short *yyptr; YYSTYPE *yyvsp; int yylen; YYLTYPE *yylsp; short *yyrq1; short *yyrq2; yystate = 0; yyssp = yyss - 1; yyvsp = yyvs - 1; yylsp = yyls - 1; yyrq0 = yyrq; yyrq1 = yyrq0; yyrq2 = yyrq0; yychar = yylex (); if (yychar < 0) yychar = 0; else yychar = YYTRANSLATE (yychar); yynewstate: if (yyssp >= yyss + YYMAXDEPTH - 1) { yyabort ("Parser Stack Overflow"); YYABORT; } *++yyssp = yystate; yyresume: yyn = yypact[yystate]; if (yyn == YYFLAG) goto yydefault; yyn += yychar; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar) goto yydefault; yyn = yytable[yyn]; if (yyn < 0) { yyn = -yyn; goto yyreduce; } else if (yyn == 0) goto yyerrlab; yystate = yyn; yyptr = yyrq2; while (yyptr != yyrq1) { yyn = *yyptr++; yylen = yyr2[yyn]; yyvsp -= yylen; yylsp -= yylen; yyguard (yyn, yyvsp, yylsp); if (yyerror) goto yysemerr; yyaction (yyn, yyvsp, yylsp); *++yyvsp = yyval; yylsp++; if (yylen == 0) { yylsp->first_line = yytloc.first_line; yylsp->first_column = yytloc.first_column; yylsp->last_line = (yylsp - 1)->last_line; yylsp->last_column = (yylsp - 1)->last_column; yylsp->text = 0; } else { yylsp->last_line = (yylsp + yylen - 1)->last_line; yylsp->last_column = (yylsp + yylen - 1)->last_column; } if (yyptr == yyrq + YYMAXRULES) yyptr = yyrq; } if (yystate == YYFINAL) YYACCEPT; yyrq2 = yyptr; yyrq1 = yyrq0; *++yyvsp = yytval; *++yylsp = yytloc; yytval = yylval; yytloc = yylloc; yyget (); goto yynewstate; yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; yyreduce: *yyrq0++ = yyn; if (yyrq0 == yyrq + YYMAXRULES) yyrq0 = yyrq; if (yyrq0 == yyrq2) { yyabort ("Parser Rule Queue Overflow"); YYABORT; } yyssp -= yyr2[yyn]; yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTBASE] + *yyssp; if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTBASE]; goto yynewstate; yysemerr: *--yyptr = yyn; yyrq2 = yyptr; yyvsp += yyr2[yyn]; yyerrlab: yygssp = yyssp; yygvsp = yyvsp; yyglsp = yylsp; yyrestore (yyrq0, yyrq2); yyrecover (); yystate = *yygssp; yyssp = yygssp; yyvsp = yygvsp; yyrq0 = yyrq; yyrq1 = yyrq0; yyrq2 = yyrq0; goto yyresume; } %%actions