From: Akim Demaille Date: Mon, 25 Oct 2004 10:37:35 +0000 (+0000) Subject: * data/glr.c (YYRHSLOC): Move its definition next to its uses. X-Git-Tag: BISON-2_0~78 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/e342c3beaf9d73616e8ff6fe005b97f3a72c0476 * data/glr.c (YYRHSLOC): Move its definition next to its uses. Introduce another definition to address simple location arrays. (yyGLRStack): New member: yyerror_range. (yyrecoverSyntaxError, yyparse): Update it. (yyrecoverSyntaxError): Use it when shifting the error token to have an accurate range, equivalent to the one computed by both yacc.c and lalr1.cc. * tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Change its yylex so that column numbers start at column 0, as per GNU Coding Standards, the others tests, and the doc. (_AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_AMBIG_GLR_OUTPUT_WITH_LOC): Adjust to the above change (first column is 0). And adjust the location of the "", now covering the whole line. --- diff --git a/ChangeLog b/ChangeLog index be0344ba..1c82ae20 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2004-10-25 Akim Demaille + + * data/glr.c (YYRHSLOC): Move its definition next to its uses. + Introduce another definition to address simple location arrays. + (yyGLRStack): New member: yyerror_range. + (yyrecoverSyntaxError, yyparse): Update it. + (yyrecoverSyntaxError): Use it when shifting the error token to + have an accurate range, equivalent to the one computed by both + yacc.c and lalr1.cc. + * tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Change its yylex so + that column numbers start at column 0, as per GNU Coding + Standards, the others tests, and the doc. + (_AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_AMBIG_GLR_OUTPUT_WITH_LOC): + Adjust to the above change (first column is 0). + And adjust the location of the "", now covering the whole + line. + 2004-10-22 Akim Demaille and Paul Eggert diff --git a/NEWS b/NEWS index 36c20426..ddf58473 100644 --- a/NEWS +++ b/NEWS @@ -8,7 +8,14 @@ Changes in version 1.875e: initializing @$) from yyparse before parsing starts. * The option `--report=lookahead' was changed to `--report=look-ahead'. - The old spelling still works, but is not documented and will be removed. + The old spelling still works, but is not documented and will be + removed. + +* Error token location. + During error recovery, the location of the syntax error is updated + to cover the whole sequence covered by the error token: it includes + the shifted symbols thrown away during the first part of the error + recovery, and the lookahead rejected during the second part. Changes in version 1.875d, 2004-05-21: diff --git a/data/glr.c b/data/glr.c index 7f4c9216..6c2f3b12 100644 --- a/data/glr.c +++ b/data/glr.c @@ -425,8 +425,6 @@ 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) - #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \ do { \ @@ -614,6 +612,8 @@ union yyGLRStackItem { struct yyGLRStack { int yyerrflag; int yyerrState; +]b4_location_if([[ /* To compute the location of the error token, */ + YYLTYPE yyerror_range[2];]])[ ]b4_pure_if( [ int yyerrcnt; @@ -735,8 +735,9 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, *yyvalp = yyval_default; else *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval; +# define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK].yystate.yyloc) YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen); - +# undef YYRHSLOC ] switch (yyn) { @@ -1719,6 +1720,7 @@ yyrecoverSyntaxError (yyGLRStack* yystack, while (yystack->yytops.yystates[0] != NULL) { yyGLRState *yys = yystack->yytops.yystates[0]; +]b4_location_if([[ yystack->yyerror_range[0] = yys->yyloc;]])[ yydestruct ("Error: popping", yystos[yys->yylrState], &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[); @@ -1729,8 +1731,15 @@ 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]; + yys->yyloc.last_line = yyllocp->last_line; + yys->yyloc.last_column = yyllocp->last_column;]])[ + yydestruct ("Error: discarding", + *yytokenp, yylvalp]b4_location_if([, yyllocp])[); + } YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; *yytokenp = YYTRANSLATE (yychar); @@ -1771,13 +1780,21 @@ 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[1] = *yyllocp; +# define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK]) + YYLLOC_DEFAULT (yyerrloc, yystack->yyerror_range - 1, 2); +# undef YYRHSLOC]])[ 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[0] = yys->yyloc;]])[ yydestruct ("Error: popping", yystos[yys->yylrState], &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[); @@ -1876,6 +1893,7 @@ b4_syncline([@oline@], [@ofile@])])dnl yyrule = yydefaultAction (yystate); if (yyrule == 0) { +]b4_location_if([[ yystack.yyerror_range[0] = *yyllocp;]])[ yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); goto yyuser_error; } @@ -1906,6 +1924,8 @@ b4_syncline([@oline@], [@ofile@])])dnl } else if (yyisErrorAction (yyaction)) { + yyGLRState *yys = yystack.yytops.yystates[0]; +]b4_location_if([[ yystack.yyerror_range[0] = *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[0] = *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;]) ]) ]) diff --git a/tests/cxx-type.at b/tests/cxx-type.at index 89afc58a..057a4eed 100644 --- a/tests/cxx-type.at +++ b/tests/cxx-type.at @@ -1,5 +1,5 @@ # Checking GLR Parsing. -*- Autotest -*- -# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -123,8 +123,7 @@ yylex (LEX_PARAMETERS) int c; unsigned int i; static int lineNum = 1; - static int colNum = 1; - + static int colNum = 0; #if YYPURE # define yylloc (*llocp) @@ -139,14 +138,14 @@ yylex (LEX_PARAMETERS) case EOF: return 0; case '\t': - colNum = 1 + ((colNum + 7) & ~7); + colNum = (colNum + 7) & ~7; break; case ' ': case '\f': colNum += 1; break; case '\n': lineNum += 1; - colNum = 1; + colNum = 0; break; default: { @@ -267,15 +266,15 @@ m4_define([_AT_RESOLVED_GLR_OUTPUT], ]]) m4_define([_AT_RESOLVED_GLR_OUTPUT_WITH_LOC], -[[3.1-3.6: +(z,q) -5.1-5.4: (T,x) -7.1-7.8: (T,x,y) -9.1-9.6: =(x,y) -11.1-11.10: +((x,T),y) -13.1-13.6: (T,x) -15.1-15.14: (T,y,+(z,q)) -17.6-17.16: -19.1-19.6: +(z,q) +[[3.0-3.5: +(z,q) +5.0-5.3: (T,x) +7.0-7.7: (T,x,y) +9.0-9.5: =(x,y) +11.0-11.9: +((x,T),y) +13.0-13.5: (T,x) +15.0-15.13: (T,y,+(z,q)) +17.0-17.15: +19.0-19.5: +(z,q) ]]) m4_define([_AT_AMBIG_GLR_OUTPUT], @@ -291,15 +290,15 @@ m4_define([_AT_AMBIG_GLR_OUTPUT], ]]) m4_define([_AT_AMBIG_GLR_OUTPUT_WITH_LOC], -[[3.1-3.6: +(z,q) -5.1-5.4: (T,x) -7.1-7.8: (T,x,y) -9.1-9.6: =(x,y) -11.1-11.10: +((x,T),y) -13.1-13.6: ((T,x),(x,T)) -15.1-15.14: ((T,y,+(z,q)),=((y,T),+(z,q))) -17.6-17.16: -19.1-19.6: +(z,q) +[[3.0-3.5: +(z,q) +5.0-5.3: (T,x) +7.0-7.7: (T,x,y) +9.0-9.5: =(x,y) +11.0-11.9: +((x,T),y) +13.0-13.5: ((T,x),(x,T)) +15.0-15.13: ((T,y,+(z,q)),=((y,T),+(z,q))) +17.0-17.15: +19.0-19.5: +(z,q) ]]) m4_define([_AT_GLR_STDERR],