From 7580c37942a7f33d3c348d2bf71964fbbba89f1f Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sun, 16 Aug 2009 07:36:39 +0200 Subject: [PATCH] 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. --- ChangeLog | 15 +++++++++++++++ data/glr.c | 3 +-- data/lalr1.cc | 48 +++++++++++++++++++++++++----------------------- 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index 39575a35..f5da787e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2009-08-19 Akim Demaille + + 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 lalr1.cc: destroy $$ when YYERROR is called. diff --git a/data/glr.c b/data/glr.c index d67ec421..a4b921f1 100644 --- a/data/glr.c +++ b/data/glr.c @@ -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 diff --git a/data/lalr1.cc b/data/lalr1.cc index 365a3845..09fedabe 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -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; -- 2.45.2