From 769b430fce983b8325780cf218f4583bcc62f137 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 28 May 2002 09:53:35 +0000 Subject: [PATCH 1/1] * data/bison.c++: Catch up with bison.simple: 2002-05-24 Paul Hilfinger and Paul Eggert : `error' handing. 2002-05-26 Akim Demaille : stos_, token_number_, and popping traces. --- ChangeLog | 20 ++++++--- data/bison.c++ | 103 +++++++++++++++++++++++++++++++--------------- data/bison.simple | 3 +- 3 files changed, 85 insertions(+), 41 deletions(-) diff --git a/ChangeLog b/ChangeLog index 55542c3c..7598bfa7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,13 +1,21 @@ +2002-05-28 Akim Demaille + + * data/bison.c++: Catch up with bison.simple: + 2002-05-24 Paul Hilfinger + and Paul Eggert : `error' handing. + 2002-05-26 Akim Demaille : stos_, token_number_, + and popping traces. + 2002-05-27 Paul Hilfinger * src/output.c (output_skeleton): Put an explicit path in front of the skeleton file name, rather than relying on the -I directory, to partially alleviate effects of having a skeleton file lying around in the current directory. - + 2002-05-27 Paul Hilfinger - * src/conflicts.c (log_resolution): Correct typo: + * src/conflicts.c (log_resolution): Correct typo: obstack_printf should be obstack_fgrow1. 2002-05-26 Akim Demaille @@ -75,7 +83,7 @@ 2002-05-24 Paul Hilfinger and Paul Eggert - + * data/bison.simple (yyparse): Correct error handling to conform to POSIX and yacc. Specifically, after syntax error is discovered, do not reduce further before shifting the error token. @@ -88,15 +96,15 @@ * data/bison.simple (yyr1): Don't use yy_token_number_type as element type; it isn't always big enough, since it doesn't necessarily include non-terminals. - (yytranslate): Expand definition of yy_token_number_type, so that + (yytranslate): Expand definition of yy_token_number_type, so that the latter can be removed. (yy_token_number_type): Remove, only one use. * data/bison.c++ (r1_): Parallel change to yyr1 in bison.simple--- don't use TokenNumberType as element type. - + * tests/regression.at: Modify expected output to agree with change to yyr1 and yytranslate. - + 2002-05-13 Florian Krohm * src/reader.c (parse_action): Use copy_character instead of diff --git a/data/bison.c++ b/data/bison.c++ index c418bad3..8b58e08d 100644 --- a/data/bison.c++ +++ b/data/bison.c++ @@ -272,6 +272,8 @@ namespace yy static const RhsNumberType rhs_[[]]; static const b4_uint_type(b4_prhs_max) prhs_[[]]; static const b4_uint_type(b4_rline_max) rline_[[]]; + static const b4_uint_type(b4_stos_max) stos_[[]]; + static const short token_number_[[]]; #endif /* Even more tables. */ @@ -567,47 +569,62 @@ yy::b4_name::parse () token. */ errstatus = 3; - goto yyerrhandle; - /* Pop the current state because it cannot handle the error token. */ - yyerrdefault: - yyerrpop: - if (!state_stack_.height ()) - goto yyabortlab; - state_ = (state_stack_.pop (), state_stack_[[0]]); - semantic_stack_.pop (); - location_stack_.pop ();; + for (;;) + { + n_ = pact_[[state_]]; + if (n_ != flag_) + { + n_ += terror_; + if (0 <= n_ && n_ <= last_ && check_[[n_]] == terror_) + { + n_ = table_[[n_]]; + if (0 < n_) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (!state_stack_.height ()) + goto yyabortlab; #if YYDEBUG - if (debug_) - { - YYFPRINTF (stderr, "Error: state stack now"); - for (StateStack::ConstIterator i = state_stack_.begin (); - i != state_stack_.end (); ++i) - YYFPRINTF (stderr, " %d", *i); - YYFPRINTF (stderr, "\n"); - } + if (debug_) + { + if (stos_[[state_]] < ntokens_) + { + YYFPRINTF (stderr, "Error: popping token %d (%s", + token_number_[[stos_[state_]]], + name_[[stos_[state_]]]); +# ifdef YYPRINT + YYPRINT (stderr, token_number_[[stos_[state_]]], + semantic_stack_.top ()); +# endif + YYFPRINTF (stderr, ")\n"); + } + else + { + YYFPRINTF (stderr, "Error: popping nonterminal (%s)\n", + name_[[stos_[state_]]]); + } + } #endif - yyerrhandle: - n_ = pact_[[state_]]; - if (n_ == flag_) - goto yyerrdefault; - - n_ += terror_; - if (n_ < 0 || n_ > last_ || check_[[n_]] != terror_) - goto yyerrdefault; + state_ = (state_stack_.pop (), state_stack_[[0]]); + semantic_stack_.pop (); + location_stack_.pop ();; - n_ = table_[[n_]]; - if (n_ < 0) - { - if (n_ == flag_) - goto yyerrpop; - n_ = -n_; - goto yyreduce; +#if YYDEBUG + if (debug_) + { + YYFPRINTF (stderr, "Error: state stack now"); + for (StateStack::ConstIterator i = state_stack_.begin (); + i != state_stack_.end (); ++i) + YYFPRINTF (stderr, " %d", *i); + YYFPRINTF (stderr, "\n"); + } +#endif } - else if (!n_) - goto yyerrpop; if (n_ == final_) goto yyacceptlab; @@ -686,6 +703,24 @@ yy::b4_name::check_[[]] = b4_check }; +#if YYDEBUG +/* STOS_[[STATE-NUM]] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +const b4_uint_type(b4_stos_max) +yy::b4_name::stos_[[]] = +{ + b4_stos +}; + +/* TOKEN_NUMBER_[[YYLEX-NUM]] -- Internal token number corresponding + to YYLEX-NUM. */ +const short +yy::b4_name::token_number_[[]] = +{ + b4_toknum +}; +#endif + /* YYR1[[YYN]] -- Symbol number of symbol that rule YYN derives. */ const b4_uint_type(b4_r1_max) yy::b4_name::r1_[[]] = diff --git a/data/bison.simple b/data/bison.simple index b595946a..1beb5ed7 100644 --- a/data/bison.simple +++ b/data/bison.simple @@ -371,7 +371,8 @@ static const char *const yytname[[]] = }; #endif -/* YYTOKNUM[[YYN]] -- Index in YYTNAME corresponding to YYLEX. */ +/* YYTOKNUM[[YYLEX-NUM]] -- Internal token number corresponding to + token YYLEX-NUM. */ static const short yytoknum[[]] = { b4_toknum -- 2.45.2