On Fri, 28 Oct 2005, Paul Hilfinger wrote:
YYLLOC_DEFAULT is supposed to copy the location for an empty non-terminal
from the location of the previous symbol, but the current implementation
loses that location during a split GLR parse.
The following patch works for me, and passes make check. However, I
haven't really had time to properly test it.
Thanks.
@@ -1290,7 +1289,10 @@ yydoAction (yyGLRStack* yystack, size_t
yyGLRState* yys;
yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1];
yys = yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred
- = yystack->yytops.yystates[yyk];
+ = yystack->yytops.yystates[yyk];]b4_location_if([[
+ if (yynrhs == 0)
+ /* Set default location. */
+ yyrhsVals[YYMAXRHS + YYMAXLEFT - 1].yystate.yyloc = yys->yyloc;]])[
for (yyi = 0; yyi < yynrhs; yyi += 1)
{
yys = yys->yypred;
This code appears inside the else block within yydoAction(). Is it really
possible for the else block to ever execute? It seems to me that
yydoAction() is only called during deterministic operation, but the else
block is for a split stack. I added a print to that else block, ran the
test suite and a few of my own programs, and could never get the print to
execute.
Perhaps a better question is, within yyglrReduce(), is it ever true that
yyforceEval && yystack->yysplitPoint != NULL?
Joel