X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/f868dc04e4f89a1f4086a983b79f28ec2890f7cf..1d2d7eddf73d4244900ea00fe1949c56db07a2f7:/data/glr.c diff --git a/data/glr.c b/data/glr.c index 04842893..d04edbd0 100644 --- a/data/glr.c +++ b/data/glr.c @@ -297,8 +297,6 @@ static const char *const yytname[] = { ]b4_tname[ }; - -#define yytname_size ((int) (sizeof (yytname) / sizeof (yytname[0]))) #endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ @@ -615,14 +613,14 @@ yytokenName (yySymbol yytoken) /** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting * at YYVSP[YYLOW0].yystate.yypred. Leaves YYVSP[YYLOW1].yystate.yypred - * containing the pointer to the next state in the chain. Assumes + * containing the pointer to the next state in the chain. Assumes * YYLOW1 < YYLOW0. For convenience, returns YYLOW1. */ static int -yyfill (yyGLRStackItem* yyvsp, int yylow0, int yylow1) +yyfill (yyGLRStackItem* yyvsp, int yylow0, int yylow1) { yyGLRState* s; int i; - s = yyvsp[yylow0].yystate.yypred; + s = yyvsp[yylow0].yystate.yypred; for (i = yylow0-1; i >= yylow1; i -= 1) { if (! s->yyresolved) @@ -928,7 +926,7 @@ yyexpandGLRStack (yyGLRStack* yystack]b4_pure_formals[) #else - yyFail (yystack][]b4_lpure_args[, "parser stack overflow"); + yyFail (yystack][]b4_pure_args[, "parser stack overflow"); #endif } @@ -1024,7 +1022,7 @@ yyglrShift (yyGLRStack* yystack, int yyk, yyStateNum yylrState, size_t yyposn, } /** Shift stack #K of YYSTACK, to a new state corresponding to LR - * state YYLRSTATE, at input position YYPOSN, with the (unresolved) + * state YYLRSTATE, at input position YYPOSN, with the (unresolved) * semantic value of YYRHS under the action for YYRULE. */ static inline void yyglrShiftDefer (yyGLRStack* yystack, int yyk, yyStateNum yylrState, @@ -1125,9 +1123,9 @@ static inline void yy_reduce_print (size_t yyk, yyRuleNum yyrule) { int yyi; - unsigned int yylineno = yyrline[yyrule]; + unsigned int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack %d by rule %d (line %u), ", - yyk, yyrule - 1, yylineno); + yyk, yyrule - 1, yylno); /* Print the symbols being reduced, and their result. */ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) YYFPRINTF (stderr, "%s ", yytokenName (yyrhs[yyi])); @@ -1598,45 +1596,65 @@ yyreportSyntaxError (yyGLRStack* yystack, { #if YYERROR_VERBOSE yySymbol* const yytokenp = yystack->yytokenp; - int yyn, yyx, yycount; - size_t yysize; - const char* yyprefix; - char* yyp; - char* yymsg; + int yyn; yyn = yypact[yystack->yytops.yystates[0]->yylrState]; if (YYPACT_NINF < yyn && yyn < YYLAST) { - yycount = 0; + size_t yysize = 0; + const char* yyprefix; + char* yymsg; + int yyx; + /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ - yysize = sizeof ("syntax error, unexpected ") - + strlen (yytokenName (*yytokenp)); + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 0; + yyprefix = ", expecting "; - for (yyx = yyn < 0 ? -yyn : 0; yyx < yytname_size && yycount <= 5; - yyx += 1) + for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - yysize += strlen (yytokenName (yyx)) + strlen (yyprefix), - yycount += 1, yyprefix = " or "; - yymsg = yyp = (char*) malloc (yysize); - sprintf (yyp, "syntax error, unexpected %s", - yytokenName (*yytokenp)); - yyp += strlen (yyp); - if (yycount < 5) - { - yyprefix = ", expecting "; - for (yyx = yyn < 0 ? -yyn : 0; yyx < yytname_size; yyx += 1) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yysize += strlen (yyprefix) + strlen (yytokenName (yyx)); + yycount += 1; + if (yycount == 5) { - sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx)); - yyp += strlen (yyp); - yyprefix = " or "; + yysize = 0; + break; } + yyprefix = " or "; + } + yysize += (sizeof ("syntax error, unexpected ") + + strlen (yytokenName (*yytokenp))); + yymsg = (char*) malloc (yysize); + if (yymsg != 0) + { + char* yyp = yymsg; + sprintf (yyp, "syntax error, unexpected %s", + yytokenName (*yytokenp)); + yyp += strlen (yyp); + if (yycount < 5) + { + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx)); + yyp += strlen (yyp); + yyprefix = " or "; + } + } + yyerror (]b4_lyyerror_args[yymsg); + free (yymsg); } - yyerror (]b4_lyyerror_args[yymsg); - free (yymsg); + else + yyerror (]b4_lyyerror_args["syntax error; also virtual memory exhausted"); } else -#endif +#endif /* YYERROR_VERBOSE */ yyerror (]b4_lyyerror_args["syntax error"); yynerrs += 1; }