glr.cc, yacc.c: initialize yylloc properly
authorAkim Demaille <akim@lrde.epita.fr>
Tue, 6 Nov 2012 14:34:51 +0000 (15:34 +0100)
committerAkim Demaille <akim@lrde.epita.fr>
Tue, 6 Nov 2012 16:35:38 +0000 (17:35 +0100)
commita1d1ab50a00a4d28d6ba7b227ddc6628d5734ce3
treecd86ef5b2d08974e00e7b07d87cf9dec095e8eda
parent3237f570964d5f6cccad349f946dd301448e206e
glr.cc, yacc.c: initialize yylloc properly

There are several issues to address here.  One is that yylloc should
be initialized when possible.  Another is that the push parser needs
to update yypushed_loc when the user modified it.  And if the parser
starts by a reduction of an empty, it uses the first location on the
stack, which, therefore, must also be initialized to this initial
location.

This is getting complex, especially since because initializing a
global (impure interface) is different from initializing a local
variable.  To simplify, the local yylloc is not initialized during its
definition.

* data/c.m4 (b4_yyloc_default_define): Replace by...
(b4_yyloc_default): this.
Adjust dependencies.
* data/glr.cc: Initialize yylloc.
* data/yacc.c (b4_declare_scanner_communication_variables):
Initialize yylloc during its definition.
Don't define yyloc_default.
(yypush_parse): The location formal is not const, as we might
initialize it.
(yyparse): Define yyloc_default.
Use it before running the user initial action.
Possibly update the first location on the stack, and the pushed
location after the user initial action.
* tests/actions.at (Initial locations): Check that the initial
location is correct.
NEWS
data/c.m4
data/glr.c
data/glr.cc
data/yacc.c
tests/actions.at