diff --git a/ChangeLog b/ChangeLog index 5e13d5a9..bfe0b48c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2006-05-21 Joel E. Denny + + * data/glr.c (yyresolveLocations): Remove bogus YYASSERT that the + state before an empty RHS is always resolved here. Only the location + of that state is guaranteed to be resolved, and that's enough. This + fixes the remaining bug reported by Derek M. Jones in + . + * tests/glr-regression.at (Uninitialized location when reporting + ambiguity): Test the above case. + Also, the embedded comments in this test case claim it checks the case + of an empty RHS that has inherited the initial location. However, the + corresponding LHS was already resolved, so yyresolveLocations didn't + actually have reason to modify it. Fix this by forcing + nondeterministic operation at the beginning of the parse. + 2006-05-20 Paul Eggert * data/c.m4 (b4_yy_symbol_print_generate): diff --git a/data/glr.c b/data/glr.c index d01122a1..7c9443ea 100644 --- a/data/glr.c +++ b/data/glr.c @@ -201,7 +201,7 @@ typedef struct YYLTYPE ]]) b4_defines_if([#include @output_header_name@], - [b4_shared_declarations])[ + [b4_shared_declarations])[ /* Enabling traces. */ #ifndef YYDEBUG @@ -1836,8 +1836,14 @@ yyresolveLocations (yyGLRState* yys1, int yyn1, } else { + /* Both yyresolveAction and yyresolveLocations traverse the GSS + in reverse rightmost order. It is only necessary to invoke + yyresolveLocations on a subforest for which yyresolveAction + would have been invoked next had an ambiguity not been + detected. Thus the location of the previous state (but not + necessarily the previous state itself) is guaranteed to be + resolved already. */ yyGLRState *yyprevious = yyoption->yystate; - YYASSERT (yyprevious->yyresolved); yyrhsloc[0].yystate.yyloc = yyprevious->yyloc; } yychar_current = yychar; diff --git a/tests/glr-regression.at b/tests/glr-regression.at index 54424656..9e3cec79 100644 --- a/tests/glr-regression.at +++ b/tests/glr-regression.at @@ -1606,17 +1606,22 @@ AT_DATA_GRAMMAR([glr-regr17.y], %% +/* Tests the case of an empty RHS that has inherited the location of the + previous nonterminal, which is unresolved. That location is reported as the + last position of the ambiguity. */ +start: ambig1 empty1 | ambig2 empty2 ; + /* Tests multiple levels of yyresolveLocations recursion. */ -start: ambig1 | ambig2 ; ambig1: sub_ambig1 | sub_ambig2 ; ambig2: sub_ambig1 | sub_ambig2 ; -/* Tests non-empty RHS as well as empty RHS with either initial location or - location of previous token. Both empty RHS locations are printed in the - error message. */ -sub_ambig1: empty 'a' 'b' empty ; -sub_ambig2: empty 'a' 'b' empty ; -empty: ; +/* Tests the case of a non-empty RHS as well as the case of an empty RHS that + has inherited the initial location. The empty RHS's location is reported as + the first position in the ambiguity. */ +sub_ambig1: empty1 'a' 'b' ; +sub_ambig2: empty2 'a' 'b' ; +empty1: ; +empty2: ; %%