lalr1.cc: get rid of yyparse's yystate.

yystate and yystack_[0].state are equal, keep only the latter.
The former was also used as a temporary variable to compute the
post-reduction state.  Move this computation into an auxiliary
function.

	* data/glr.c (yyLRgotoState): Fuse variable definition and first
	assignment.
	* data/lalr1.cc (yy_lr_goto_state_): New.
	(yyparse): Use it.
	Replace remaining uses of yystate by yystate_[0].state.
	Remove the former.
This commit is contained in:
Akim Demaille
2009-08-16 07:36:39 +02:00
parent c4dc4c4671
commit 7580c37942
3 changed files with 41 additions and 25 deletions

View File

@@ -1,3 +1,18 @@
2009-08-19 Akim Demaille <demaille@gostai.com>
lalr1.cc: get rid of yyparse's yystate.
yystate and yystack_[0].state are equal, keep only the latter.
The former was also used as a temporary variable to compute the
post-reduction state. Move this computation into an auxiliary
function.
* data/glr.c (yyLRgotoState): Fuse variable definition and first
assignment.
* data/lalr1.cc (yy_lr_goto_state_): New.
(yyparse): Use it.
Replace remaining uses of yystate by yystate_[0].state.
Remove the former.
2009-08-19 Akim Demaille <demaille@gostai.com>
lalr1.cc: destroy $$ when YYERROR is called.

View File

@@ -1011,8 +1011,7 @@ yygetLRActions (yyStateNum yystate, int yytoken,
static inline yyStateNum
yyLRgotoState (yyStateNum yystate, yySymbol yylhs)
{
int yyr;
yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
int yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate)
return yytable[yyr];
else

View File

@@ -240,6 +240,11 @@ do { \
/// State numbers.
typedef int state_type;
/// Compute post-reduction state.
/// \param yystate the current state
/// \param yylhs the nonterminal to push on the stack
state_type yy_lr_goto_state_ (state_type yystate, int yylhs);
/// Internal symbol numbers.
typedef ]b4_int_type_for([b4_translate])[ token_number_type;
static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
@@ -636,6 +641,16 @@ b4_percent_code_get[]dnl
}
#endif
inline ]b4_parser_class_name[::state_type
]b4_parser_class_name[::yy_lr_goto_state_ (state_type yystate, int yylhs)
{
int yyr = yypgoto_[yylhs - yyntokens_] + yystate;
if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
return yytable_[yyr];
else
return yydefgoto_[yylhs - yyntokens_];
}
int
]b4_parser_class_name[::parse ()
{
@@ -645,7 +660,6 @@ b4_percent_code_get[]dnl
/* State. */
int yyn;
int yylen = 0;
int yystate = 0;
/* Error handling. */
int yynerrs_ = 0;
@@ -680,14 +694,12 @@ m4_popdef([b4_at_dollar])])dnl
yystack_ = stack_type (0);
yypush_ (0, 0, yyla);
// A new state was pushed on the stack.
// Invariant: yystate == yystack_[0].state, i.e.,
// yystate was just pushed onto the state stack.
// A new symbol was pushed on the stack.
yynewstate:
YYCDEBUG << "Entering state " << yystate << std::endl;
YYCDEBUG << "Entering state " << yystack_[0].state << std::endl;
/* Accept? */
if (yystate == yyfinal_)
if (yystack_[0].state == yyfinal_)
goto yyacceptlab;
goto yybackup;
@@ -696,7 +708,7 @@ m4_popdef([b4_at_dollar])])dnl
yybackup:
/* Try to take a decision without lookahead. */
yyn = yypact_[yystate];
yyn = yypact_[yystack_[0].state];
if (yyn == yypact_ninf_)
goto yydefault;
@@ -740,15 +752,14 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
--yyerrstatus_;
/* Shift the lookahead token. */
yystate = yyn;
yypush_ ("Shifting", yystate, yyla);
yypush_ ("Shifting", yyn, yyla);
goto yynewstate;
/*-----------------------------------------------------------.
| yydefault -- do the default action for the current state. |
`-----------------------------------------------------------*/
yydefault:
yyn = yydefact_[yystate];
yyn = yydefact_[yystack_[0].state];
if (yyn == 0)
goto yyerrlab;
goto yyreduce;
@@ -758,14 +769,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
`-----------------------------*/
yyreduce:
yylen = yyr2_[yyn];
// Compute post-reduction state.
yystate = yypgoto_[yyr1_[yyn] - yyntokens_] + yystack_[yylen].state;
if (0 <= yystate && yystate <= yylast_
&& yycheck_[yystate] == yystack_[yylen].state)
yystate = yytable_[yystate];
else
yystate = yydefgoto_[yyr1_[yyn] - yyntokens_];
yylhs.state = yystate;]b4_variant_if([
yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([
/* Variants are always initialized to an empty instance of the
correct type. The default $$=$1 action is NOT applied when using
variants. */
@@ -829,7 +833,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
{
++yynerrs_;
error (]b4_args(b4_locations_if([yyla.location]),
[yysyntax_error_ (yystate, yyla.type)])[);
[[yysyntax_error_ (yystack_[0].state, yyla.type)]])[);
}
]b4_locations_if([[
@@ -871,7 +875,6 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
this YYERROR. */
yypop_ (yylen);
yylen = 0;
yystate = yystack_[0].state;
goto yyerrlab1;
/*-------------------------------------------------------------.
@@ -883,7 +886,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
stack_symbol_type error_token;
for (;;)
{
yyn = yypact_[yystate];
yyn = yypact_[yystack_[0].state];
if (yyn != yypact_ninf_)
{
yyn += yyterror_;
@@ -902,7 +905,6 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
yyerror_range[0].location = yystack_[0].location;]])[
yy_destroy_ ("Error: popping", yystack_[0]);
yypop_ ();
yystate = yystack_[0].state;
YY_STACK_PRINT ();
}
]b4_locations_if([[
@@ -910,7 +912,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
YYLLOC_DEFAULT (error_token.location, (yyerror_range - 1), 2);]])[
/* Shift the error token. */
error_token.state = yystate = yyn;
error_token.state = yyn;
yypush_ ("Shifting", error_token);
}
goto yynewstate;