The previous patches ensure that symbols (symbol_type and
stack_symbol_type) can be empty, cleared, and their emptiness can be
checked. Therefore, yyempty, which codes whether yyla is empty or
not, is now useless.
In C skeletons (e.g., yacc.c), the fact that the lookahead is empty is
coded by "yychar = YYEMPTY", which is exactly what this patch
restores, since yychar/yytoken corresponds to yyla.type.
* data/lalr1.cc (yyempty): Remove.
Rather, depend on yyla.empty ().
/// Generate an error message.
/// \param yystate the state where the error occurred.
/// Generate an error message.
/// \param yystate the state where the error occurred.
- /// \param yytoken the lookahead token type, or empty_symbol.
+ /// \param yyla the lookahead token.
virtual std::string yysyntax_error_ (state_type yystate,
virtual std::string yysyntax_error_ (state_type yystate,
- symbol_number_type yytoken) const;
+ const symbol_type& yyla) const;
/// Compute post-reduction state.
/// \param yystate the current state
/// Compute post-reduction state.
/// \param yystate the current state
#endif // !]b4_api_PREFIX[DEBUG
#define yyerrok (yyerrstatus_ = 0)
#endif // !]b4_api_PREFIX[DEBUG
#define yyerrok (yyerrstatus_ = 0)
-#define yyclearin (yyempty = true)
+#define yyclearin (yyla.clear ())
#define YYACCEPT goto yyacceptlab
#define YYABORT goto yyabortlab
#define YYACCEPT goto yyacceptlab
#define YYABORT goto yyabortlab
int yynerrs_ = 0;
int yyerrstatus_ = 0;
int yynerrs_ = 0;
int yyerrstatus_ = 0;
- /// Whether yyla contains a lookahead.
- bool yyempty = true;
-
/// The lookahead symbol.
symbol_type yyla;]b4_locations_if([[
/// The lookahead symbol.
symbol_type yyla;]b4_locations_if([[
goto yydefault;
// Read a lookahead token.
goto yydefault;
// Read a lookahead token.
{
YYCDEBUG << "Reading a token: ";
try
{
YYCDEBUG << "Reading a token: ";
try
error (yyexc);
goto yyerrlab1;
}
error (yyexc);
goto yyerrlab1;
}
}
YY_SYMBOL_PRINT ("Next token is", yyla);
}
YY_SYMBOL_PRINT ("Next token is", yyla);
- // Discard the token being shifted.
- yyempty = true;
-
// Count tokens shifted since error; after three, turn off error status.
if (yyerrstatus_)
--yyerrstatus_;
// Count tokens shifted since error; after three, turn off error status.
if (yyerrstatus_)
--yyerrstatus_;
{
++yynerrs_;
error (]b4_join(b4_locations_if([yyla.location]),
{
++yynerrs_;
error (]b4_join(b4_locations_if([yyla.location]),
- [[yysyntax_error_ (yystack_[0].state,
- yyempty ? empty_symbol : yyla.type_get ())]])[);
+ [[yysyntax_error_ (yystack_[0].state, yyla)]])[);
// Return failure if at end of input.
if (yyla.type_get () == yyeof_)
YYABORT;
// Return failure if at end of input.
if (yyla.type_get () == yyeof_)
YYABORT;
+ else if (!yyla.empty ())
{
yy_destroy_ ("Error: discarding", yyla);
yyla.clear ();
{
yy_destroy_ ("Error: discarding", yyla);
yyla.clear ();
yy_destroy_ ("Cleanup: discarding lookahead", yyla);
/* Do not reclaim the symbols of the rule whose action triggered
yy_destroy_ ("Cleanup: discarding lookahead", yyla);
/* Do not reclaim the symbols of the rule whose action triggered
<< std::endl;
// Do not try to display the values of the reclaimed symbols,
// as their printer might throw an exception.
<< std::endl;
// Do not try to display the values of the reclaimed symbols,
// as their printer might throw an exception.
yy_destroy_ (YY_NULLPTR, yyla);
while (1 < yystack_.size ())
yy_destroy_ (YY_NULLPTR, yyla);
while (1 < yystack_.size ())
// Generate an error message.
std::string
]b4_parser_class_name[::yysyntax_error_ (]dnl
// Generate an error message.
std::string
]b4_parser_class_name[::yysyntax_error_ (]dnl
-b4_error_verbose_if([state_type yystate, symbol_number_type yytoken],
- [state_type, symbol_number_type])[) const
+b4_error_verbose_if([state_type yystate, const symbol_type& yyla],
+ [state_type, const symbol_type&])[) const
{]b4_error_verbose_if([[
// Number of reported tokens (one for the "unexpected", one per
// "expected").
{]b4_error_verbose_if([[
// Number of reported tokens (one for the "unexpected", one per
// "expected").
the only way this function was invoked is if the default action
is an error action. In that case, don't check for expected
tokens because there are none.
the only way this function was invoked is if the default action
is an error action. In that case, don't check for expected
tokens because there are none.
- - The only way there can be no lookahead present (in yytoken) is
+ - The only way there can be no lookahead present (in yyla) is
if this state is a consistent state with a default action.
Thus, detecting the absence of a lookahead is sufficient to
determine that there is no unexpected or expected token to
if this state is a consistent state with a default action.
Thus, detecting the absence of a lookahead is sufficient to
determine that there is no unexpected or expected token to
token that will not be accepted due to an error action in a
later state.
*/
token that will not be accepted due to an error action in a
later state.
*/
- if (yytoken != empty_symbol)
+ int yytoken = yyla.type_get ();
yyarg[yycount++] = yytname_[yytoken];
int yyn = yypact_[yystate];
if (!yy_pact_value_is_default_ (yyn))
yyarg[yycount++] = yytname_[yytoken];
int yyn = yypact_[yystate];
if (!yy_pact_value_is_default_ (yyn))