X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/b4a2033855c7d7838f8e079c0656d4e91bbb6361..e019c2477959aac474358ae74502fd96a60dfb89:/data/glr.c diff --git a/data/glr.c b/data/glr.c index 7f4c9216..97c43bc7 100644 --- a/data/glr.c +++ b/data/glr.c @@ -103,7 +103,7 @@ m4_define([b4_lpure_formals], # -------------------- # Expansion of $$. m4_define([b4_lhs_value], -[(*yyvalp)[]m4_ifval([$1], [.$1])]) +[((*yyvalp)[]m4_ifval([$1], [.$1]))]) # b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) @@ -111,7 +111,7 @@ m4_define([b4_lhs_value], # Expansion of $NUM, where the current rule has RULE-LENGTH # symbols on RHS. m4_define([b4_rhs_value], -[((yyGLRStackItem const *)yyvsp)@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3])]) +[(((yyGLRStackItem const *)yyvsp)@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3]))]) @@ -131,7 +131,7 @@ m4_define([b4_lhs_location], # Expansion of @NUM, where the current rule has RULE-LENGTH symbols # on RHS. m4_define([b4_rhs_location], -[((yyGLRStackItem const *)yyvsp)@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yyloc]) +[(((yyGLRStackItem const *)yyvsp)@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yyloc)]) # We do want M4 expansion after # for CPP macros. m4_changecom() @@ -149,8 +149,7 @@ b4_copyright([Skeleton parser for GLR parsing with Bison], [2002, 2003, 2004]) ]b4_identification m4_if(b4_prefix[], [yy], [], -[/* If NAME_PREFIX is specified substitute the variables and functions - names. */ +[/* Substitute the variable and function names. */ #define yyparse b4_prefix[]parse #define yylex b4_prefix[]lex #define yyerror b4_prefix[]error @@ -205,13 +204,12 @@ typedef struct YYLTYPE # define YYLTYPE_IS_TRIVIAL 1 #endif -/* Default (constant) values used for initialization for null +/* Default (constant) value used for initialization for null right-hand sides. Unlike the standard yacc.c template, - here we set the default values of $$ and $@@ to zeroed-out - values. Since the default value of these quantities is undefined, - this behavior is technically correct. */ + here we set the default value of $$ to a zeroed-out value. + Since the default value is undefined, this behavior is + technically correct. */ static YYSTYPE yyval_default; -static YYLTYPE yyloc_default; /* Copy the second part of user declarations. */ ]b4_post_prologue[ @@ -425,26 +423,25 @@ static const ]b4_int_type_for([b4_stos])[ yystos[] = the previous symbol: RHS[0] (always defined). */ ]b4_location_if([[ -#define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK].yystate.yyloc) - +#define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc) #ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \ -do { \ - if (YYN) \ - { \ - (yyCurrent).first_line = YYRHSLOC(yyRhs, 1).first_line; \ - (yyCurrent).first_column = YYRHSLOC(yyRhs, 1).first_column; \ - (yyCurrent).last_line = YYRHSLOC(yyRhs, YYN).last_line; \ - (yyCurrent).last_column = YYRHSLOC(yyRhs, YYN).last_column; \ - } \ - else \ - { \ - (yyCurrent).first_line = YYRHSLOC(yyRhs, 0).last_line; \ - (yyCurrent).first_column = YYRHSLOC(yyRhs, 0).last_column; \ - (yyCurrent).last_line = YYRHSLOC(yyRhs, 0).last_line; \ - (yyCurrent).last_column = YYRHSLOC(yyRhs, 0).last_column; \ - } \ -} while(0) +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (0) /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know @@ -457,7 +454,7 @@ do { \ #endif ]],[ #ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) ((void) 0) +# define YYLLOC_DEFAULT(Current, Rhs, N) ((void) 0) #endif ])[ @@ -614,6 +611,8 @@ union yyGLRStackItem { struct yyGLRStack { int yyerrflag; int yyerrState; +]b4_location_if([[ /* To compute the location of the error token. */ + yyGLRStackItem yyerror_range[3];]])[ ]b4_pure_if( [ int yyerrcnt; @@ -705,7 +704,9 @@ yyfill (yyGLRStackItem *yyvsp, int *yylow, int yylow1, yybool yynormal) * yyerr for YYERROR, yyabort for YYABORT. */ static YYRESULTTAG yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, - YYSTYPE* yyvalp, YYLTYPE* yylocp, yyGLRStack* yystack + YYSTYPE* yyvalp, + YYLTYPE* yylocp]b4_location_if(, [ ATTRIBUTE_UNUSED])[, + yyGLRStack* yystack ]b4_user_formals[) { yybool yynormal ATTRIBUTE_UNUSED = (yystack->yysplitPoint == NULL); @@ -736,7 +737,6 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, else *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval; YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen); - ] switch (yyn) { @@ -1702,7 +1702,9 @@ yyreportSyntaxError (yyGLRStack* yystack, value, and location of the look-ahead. */ static void yyrecoverSyntaxError (yyGLRStack* yystack, - YYSTYPE* yylvalp, YYLTYPE* yyllocp]b4_user_formals[) + YYSTYPE* yylvalp, + YYLTYPE* yyllocp]b4_location_if(, [ ATTRIBUTE_UNUSED])[ + ]b4_user_formals[) { yySymbol* const yytokenp = yystack->yytokenp; size_t yyk; @@ -1719,6 +1721,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack, while (yystack->yytops.yystates[0] != NULL) { yyGLRState *yys = yystack->yytops.yystates[0]; +]b4_location_if([[ yystack->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[ yydestruct ("Error: popping", yystos[yys->yylrState], &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[); @@ -1729,8 +1732,17 @@ yyrecoverSyntaxError (yyGLRStack* yystack, yyFail (yystack][]b4_lpure_args[, NULL); } if (*yytokenp != YYEMPTY) - yydestruct ("Error: discarding", - *yytokenp, yylvalp]b4_location_if([, yyllocp])[); + {]b4_location_if([[ + /* We throw away the lookahead, but the error range + of the shifted error token must take it into account. */ + yyGLRState *yys = yystack->yytops.yystates[0]; + yyGLRStackItem yyerror_range[3]; + yyerror_range[1].yystate.yyloc = yys->yyloc; + yyerror_range[2].yystate.yyloc = *yyllocp; + YYLLOC_DEFAULT (yys->yyloc, yyerror_range, 2);]])[ + yydestruct ("Error: discarding", + *yytokenp, yylvalp]b4_location_if([, yyllocp])[); + } YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; *yytokenp = YYTRANSLATE (yychar); @@ -1771,13 +1783,19 @@ yyrecoverSyntaxError (yyGLRStack* yystack, if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR && yyisShiftAction (yytable[yyj])) { + /* Shift the error token having adjusted its location. */ + YYLTYPE yyerrloc;]b4_location_if([[ + yystack->yyerror_range[2].yystate.yyloc = *yyllocp; + YYLLOC_DEFAULT (yyerrloc, yystack->yyerror_range, 2);]])[ YY_SYMBOL_PRINT ("Shifting", yystos[yytable[yyj]], - yylvalp, yyllocp); + yylvalp, &yyerrloc); yyglrShift (yystack, 0, yytable[yyj], - yys->yyposn, *yylvalp, yyllocp]b4_user_args[); + yys->yyposn, *yylvalp, &yyerrloc]b4_user_args[); + yys = yystack->yytops.yystates[0]; break; } } +]b4_location_if([[ yystack->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[ yydestruct ("Error: popping", yystos[yys->yylrState], &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[); @@ -1876,6 +1894,7 @@ b4_syncline([@oline@], [@ofile@])])dnl yyrule = yydefaultAction (yystate); if (yyrule == 0) { +]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = *yyllocp;]])[ yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); goto yyuser_error; } @@ -1906,6 +1925,7 @@ b4_syncline([@oline@], [@ofile@])])dnl } else if (yyisErrorAction (yyaction)) { +]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = *yyllocp;]])[ yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); goto yyuser_error; } @@ -1931,6 +1951,7 @@ b4_syncline([@oline@], [@ofile@])])dnl yyFail (&yystack][]b4_lpure_args[, "syntax error"); YYCHK1 (yyresolveStack (&yystack]b4_user_args[)); YYDPRINTF ((stderr, "Returning to deterministic operation.\n")); +]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = *yyllocp;]])[ yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); goto yyuser_error; } @@ -2066,7 +2087,7 @@ b4_location_if([ # define YYLTYPE_IS_TRIVIAL 1 #endif -b4_location_if([m4_if(b4_pure, [0], +b4_location_if([b4_pure_if([], [extern YYLTYPE b4_prefix[]lloc;]) ]) ])