mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-10 12:53:03 +00:00
Let the initial-action act on the look-ahead, and use it for the
"initial push" (corresponding to an hypothetical beginning-of-file). And let lalr1.cc honor %initial-action. * doc/bison.texinfo (Initial Action Decl): Clarify, and add an example. * data/lalr1.cc (Parser::initlocation_): Remove, bad experiment. (Parser::Parser): Remove the ctor that used to initialize it. (Parser::parse): Like in the other skeletons, issue the "starting parse" message before any action. Honor %initial-action. Initialize the stacks with the lookahead. * data/yacc.c: Let $$ and @$ in %initial-action designate the look-ahead. Push them in the stacks. * tests/actions.at, tests/calc.at: Adjust the C++ ctor invocations.
This commit is contained in:
@@ -218,17 +218,9 @@ namespace yy
|
||||
typedef Stack< SemanticType > SemanticStack;
|
||||
typedef Stack< LocationType > LocationStack;
|
||||
|
||||
#if YYLSP_NEEDED
|
||||
]b4_parser_class_name[ (bool debug,
|
||||
LocationType initlocation][]b4_param[]b4_parse_param_decl[) :
|
||||
]b4_constructor[][debug_ (debug),
|
||||
cdebug_ (std::cerr),
|
||||
initlocation_ (initlocation)]b4_parse_param_cons[
|
||||
#else
|
||||
]b4_parser_class_name[ (bool debug][]b4_param[]b4_parse_param_decl[) :
|
||||
]b4_constructor[][debug_ (debug),
|
||||
cdebug_ (std::cerr)]b4_parse_param_cons[
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
@@ -325,18 +317,17 @@ namespace yy
|
||||
/* Message. */
|
||||
std::string message;
|
||||
|
||||
/* Semantic value and location of look-ahead token. */
|
||||
/// Semantic value of the look-ahead.
|
||||
SemanticType value;
|
||||
/// Location of the look-ahead.
|
||||
LocationType location;
|
||||
/// The locations where the error started and ended.
|
||||
Location error_range_[2];
|
||||
|
||||
/* @@$ and $$. */
|
||||
/// $$.
|
||||
SemanticType yyval;
|
||||
/// @@$.
|
||||
LocationType yyloc;
|
||||
|
||||
/* Initial location. */
|
||||
LocationType initlocation_;
|
||||
]b4_parse_param_vars[
|
||||
};
|
||||
}
|
||||
@@ -446,24 +437,34 @@ yy::]b4_parser_class_name[::pop (unsigned int n)
|
||||
int
|
||||
yy::]b4_parser_class_name[::parse ()
|
||||
{
|
||||
YYCDEBUG << "Starting parse" << std::endl;
|
||||
|
||||
nerrs_ = 0;
|
||||
errstatus_ = 0;
|
||||
|
||||
/* Initialize the stacks. The initial state will be pushed in
|
||||
yynewstate, since the latter expects the semantical and the
|
||||
location values to have been already stored, initialize these
|
||||
stacks with a primary value. */
|
||||
state_stack_ = StateStack (0);
|
||||
semantic_stack_ = SemanticStack (1);
|
||||
location_stack_ = LocationStack (1);
|
||||
|
||||
/* Start. */
|
||||
state_ = 0;
|
||||
looka_ = empty_;
|
||||
#if YYLSP_NEEDED
|
||||
location = initlocation_;
|
||||
#endif
|
||||
YYCDEBUG << "Starting parse" << std::endl;
|
||||
|
||||
]m4_ifdef([b4_initial_action], [
|
||||
m4_pushdef([b4_at_dollar], [location])dnl
|
||||
m4_pushdef([b4_dollar_dollar], [value])dnl
|
||||
/* User initialization code. */
|
||||
b4_initial_action
|
||||
m4_popdef([b4_dollar_dollar])dnl
|
||||
m4_popdef([b4_at_dollar])dnl
|
||||
/* Line __line__ of yacc.c. */
|
||||
b4_syncline([@oline@], [@ofile@])])dnl
|
||||
|
||||
[ /* Initialize the stacks. The initial state will be pushed in
|
||||
yynewstate, since the latter expects the semantical and the
|
||||
location values to have been already stored, initialize these
|
||||
stacks with a primary value. */
|
||||
state_stack_ = StateStack (0);
|
||||
semantic_stack_ = SemanticStack (0);
|
||||
location_stack_ = LocationStack (0);
|
||||
semantic_stack_.push (value);
|
||||
location_stack_.push (location);
|
||||
|
||||
/* New state. */
|
||||
yynewstate:
|
||||
|
||||
13
data/yacc.c
13
data/yacc.c
@@ -821,20 +821,23 @@ b4_c_function_def([yyparse], [int], b4_parse_param)
|
||||
]b4_location_if([[ yylsp = yyls;
|
||||
#if YYLTYPE_IS_TRIVIAL
|
||||
/* Initialize the default location before parsing starts. */
|
||||
yyls[0].first_line = yyls[0].last_line = 1;
|
||||
yyls[0].first_column = yyls[0].last_column = 0;
|
||||
yylloc.first_line = yylloc.last_line = 1;
|
||||
yylloc.first_column = yylloc.last_column = 0;
|
||||
#endif
|
||||
]])
|
||||
m4_ifdef([b4_initial_action], [
|
||||
m4_pushdef([b4_at_dollar], [(*yylsp)])dnl
|
||||
m4_pushdef([b4_dollar_dollar], [(*yyvsp)])dnl
|
||||
m4_pushdef([b4_at_dollar], [(yylloc)])dnl
|
||||
m4_pushdef([b4_dollar_dollar], [(yylval)])dnl
|
||||
/* User initialization code. */
|
||||
b4_initial_action
|
||||
m4_popdef([b4_dollar_dollar])dnl
|
||||
m4_popdef([b4_at_dollar])dnl
|
||||
/* Line __line__ of yacc.c. */
|
||||
b4_syncline([@oline@], [@ofile@])])dnl
|
||||
|
||||
[
|
||||
yyvsp[0] = yylval;
|
||||
]b4_location_if([[ yylsp[0] = yylloc;
|
||||
]])
|
||||
[ goto yysetstate;
|
||||
|
||||
/*------------------------------------------------------------.
|
||||
|
||||
Reference in New Issue
Block a user