X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/98ae96438ebb4465c777a7849f1b4ca222e760e3..455671735e6f4e9712c2f5ac1bc153b07b33e67b:/data/lalr1.cc?ds=sidebyside diff --git a/data/lalr1.cc b/data/lalr1.cc index 887671d1..8f0ebe8f 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -2,7 +2,7 @@ m4_divert(-1) # C++ skeleton for Bison -# Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -20,6 +20,8 @@ m4_divert(-1) # 02110-1301 USA m4_include(b4_pkgdatadir/[c++.m4]) +# Backward compatibility. +m4_define([b4_location_constructors]) m4_include(b4_pkgdatadir/[location.cc]) # We do want M4 expansion after # for CPP macros. @@ -28,9 +30,11 @@ m4_divert(0)dnl m4_if(b4_defines_flag, 0, [], [@output @output_header_name@ b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison], - [2002, 2003, 2004, 2005]) + [2002, 2003, 2004, 2005, 2006]) dnl FIXME: This is wrong, we want computed header guards. [ +/* C++ LALR(1) parser skeleton written by Akim Demaille. */ + #ifndef PARSER_HEADER_H # define PARSER_HEADER_H @@ -98,12 +102,13 @@ namespace yy { public: /// Symbol semantic values. -#if ! defined (YYSTYPE) +#ifndef YYSTYPE ]m4_ifdef([b4_stype], -[b4_syncline([b4_stype_line], [b4_file_name]) - union semantic_type b4_stype; +[ union semantic_type +b4_stype /* Line __line__ of lalr1.cc. */ -b4_syncline([@oline@], [@ofile@])], +b4_syncline([@oline@], [@ofile@]) + ;], [ typedef int semantic_type;])[ #else typedef YYSTYPE semantic_type; @@ -115,6 +120,8 @@ b4_syncline([@oline@], [@ofile@])], { ]b4_token_enums(b4_tokens)[ }; + /// Token type. + typedef token::yytokentype token_type; /// Build a parser object. ]b4_parser_class_name[ (]b4_parse_param_decl[); @@ -149,13 +156,20 @@ b4_syncline([@oline@], [@ofile@])], b4_error_verbose_if([, int tok])[); #if YYDEBUG + /// \brief Report a symbol value on the debug stream. + /// \param yytype The token type. + /// \param yyvaluep Its semantic value. + /// \param yylocationp Its location. + virtual void yy_symbol_value_print_ (int yytype, + const semantic_type* yyvaluep, + const location_type* yylocationp); /// \brief Report a symbol on the debug stream. /// \param yytype The token type. /// \param yyvaluep Its semantic value. /// \param yylocationp Its location. - virtual void yysymprint_ (int yytype, - const semantic_type* yyvaluep, - const location_type* yylocationp); + virtual void yy_symbol_print_ (int yytype, + const semantic_type* yyvaluep, + const location_type* yylocationp); #endif /* ! YYDEBUG */ @@ -230,13 +244,13 @@ b4_error_verbose_if([, int tok])[); /// For each scanner token number, its symbol number. static const ]b4_int_type_for([b4_toknum])[ yytoken_number_[]; /// Report on the debug stream that the rule \a r is going to be reduced. - virtual void yyreduce_print_ (int r); + virtual void yy_reduce_print_ (int r); /// Print the state stack on the debug stream. virtual void yystack_print_ (); #endif /// Convert a scanner token number to a symbol number. - inline token_number_type yytranslate_ (int token); + token_number_type yytranslate_ (int token); /// \brief Reclaim the memory associated to a symbol. /// \param yymsg Why this token is reclaimed. @@ -244,9 +258,9 @@ b4_error_verbose_if([, int tok])[); /// \param yyvaluep Its semantic value. /// \param yylocationp Its location. inline void yydestruct_ (const char* yymsg, - int yytype, - semantic_type* yyvaluep, - location_type* yylocationp); + int yytype, + semantic_type* yyvaluep, + location_type* yylocationp); /// Pop \a n symbols the three stacks. inline void yypop_ (unsigned int n = 1); @@ -276,7 +290,7 @@ b4_error_verbose_if([, int tok])[); [b4_token_defines(b4_tokens) #ifndef YYSTYPE - /* Redirection for backward compatibility. */ + /* Redirection for backward compatibility. */ # define YYSTYPE yy::b4_parser_class_name::semantic_type #endif ])[ @@ -284,7 +298,7 @@ b4_error_verbose_if([, int tok])[); ])dnl @output @output_parser_name@ b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison], - [2002, 2003, 2004, 2005]) + [2002, 2003, 2004, 2005, 2006]) m4_if(b4_prefix[], [yy], [], [ // Take the name prefix into account. @@ -312,9 +326,9 @@ b4_syncline([@oline@], [@ofile@])[ #endif /* Suppress unused-variable warnings by "using" E. */ -#define YYUSE(e) do {;} while (false && (e)) +#define YYUSE(e) ((void) (e)) -/* A pseudo ostream that takes yydebug_ into account. */ +/* A pseudo ostream that takes yydebug_ into account. */ # define YYCDEBUG \ for (bool yydebugcond_ = yydebug_; yydebugcond_; yydebugcond_ = false) \ (*yycdebug_) @@ -326,8 +340,8 @@ b4_syncline([@oline@], [@ofile@])[ do { \ if (yydebug_) \ { \ - *yycdebug_ << (Title) << ' '; \ - yysymprint_ ((Type), (Value), (Location)); \ + *yycdebug_ << Title << ' '; \ + yy_symbol_print_ ((Type), (Value), (Location)); \ *yycdebug_ << std::endl; \ } \ } while (false) @@ -335,7 +349,7 @@ do { \ # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug_) \ - yyreduce_print_ (Rule); \ + yy_reduce_print_ (Rule); \ } while (false) # define YY_STACK_PRINT() \ @@ -415,33 +429,36 @@ namespace yy | Print this symbol on YYOUTPUT. | `--------------------------------*/ - void - ]b4_parser_class_name[::yysymprint_ (int yytype, - const semantic_type* yyvaluep, const location_type* yylocationp) + inline void + ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype, + const semantic_type* yyvaluep, const location_type* yylocationp) { - /* Backward compatibility, but should be removed eventually. */ - std::ostream& cdebug_ = *yycdebug_; - - YYUSE (!&cdebug_); YYUSE (yylocationp); YYUSE (yyvaluep); - - *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm") - << ' ' << yytname_[yytype] << " (" - << *yylocationp << ": "; switch (yytype) { ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl [ default: - break; + break; } + } + + + void + ]b4_parser_class_name[::yy_symbol_print_ (int yytype, + const semantic_type* yyvaluep, const location_type* yylocationp) + { + *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm") + << ' ' << yytname_[yytype] << " (" + << *yylocationp << ": "; + yy_symbol_value_print_ (yytype, yyvaluep, yylocationp); *yycdebug_ << ')'; } #endif /* ! YYDEBUG */ void ]b4_parser_class_name[::yydestruct_ (const char* yymsg, - int yytype, semantic_type* yyvaluep, location_type* yylocationp) + int yytype, semantic_type* yyvaluep, location_type* yylocationp) { YYUSE (yylocationp); YYUSE (yymsg); @@ -452,8 +469,8 @@ namespace yy switch (yytype) { ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[ - default: - break; + default: + break; } } @@ -500,10 +517,10 @@ namespace yy /* State. */ int yyn; - int yylen; + int yylen = 0; int yystate = 0; - /* Error handling. */ + /* Error handling. */ int yynerrs_ = 0; int yyerrstatus_ = 0; @@ -526,7 +543,7 @@ namespace yy ]m4_ifdef([b4_initial_action], [ m4_pushdef([b4_at_dollar], [yylloc])dnl m4_pushdef([b4_dollar_dollar], [yylval])dnl - /* User initialization code. */ + /* User initialization code. */ b4_initial_action m4_popdef([b4_dollar_dollar])dnl m4_popdef([b4_at_dollar])dnl @@ -560,9 +577,9 @@ b4_syncline([@oline@], [@ofile@])])dnl /* Read a look-ahead token. */ if (yychar == yyempty_) { - YYCDEBUG << "Reading a token: "; - yychar = ]b4_c_function_call([yylex], [int], - [[YYSTYPE*], [&yylval]][]dnl + YYCDEBUG << "Reading a token: "; + yychar = ]b4_c_function_call([yylex], [int], + [[YYSTYPE*], [&yylval]][]dnl b4_location_if([, [[location*], [&yylloc]]])dnl m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; } @@ -571,13 +588,13 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; /* Convert token to internal form. */ if (yychar <= yyeof_) { - yychar = yytoken = yyeof_; - YYCDEBUG << "Now at end of input." << std::endl; + yychar = yytoken = yyeof_; + YYCDEBUG << "Now at end of input." << std::endl; } else { - yytoken = yytranslate_ (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + yytoken = yytranslate_ (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to @@ -590,10 +607,10 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; yyn = yytable_[yyn]; if (yyn <= 0) { - if (yyn == 0 || yyn == yytable_ninf_) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; + if (yyn == 0 || yyn == yytable_ninf_) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; } /* Accept? */ @@ -632,7 +649,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; `-----------------------------*/ yyreduce: yylen = yyr2_[yyn]; - /* If LEN_ is nonzero, implement the default value of the action: + /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, use the top of the stack. Otherwise, the following line sets YYVAL to garbage. @@ -650,15 +667,15 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; YY_REDUCE_PRINT (yyn); switch (yyn) { - ]b4_actions[ - default: break; + ]b4_actions + /* Line __line__ of lalr1.cc. */ +b4_syncline([@oline@], [@ofile@])[ + default: break; } - - ]/* Line __line__ of lalr1.cc. */ - b4_syncline([@oline@], [@ofile@])[ + YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc); yypop_ (yylen); - + yylen = 0; YY_STACK_PRINT (); yysemantic_stack_.push (yyval); @@ -668,7 +685,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; yyn = yyr1_[yyn]; yystate = yypgoto_[yyn - yyntokens_] + yystate_stack_[0]; if (0 <= yystate && yystate <= yylast_ - && yycheck_[yystate] == yystate_stack_[0]) + && yycheck_[yystate] == yystate_stack_[0]) yystate = yytable_[yystate]; else yystate = yydefgoto_[yyn - yyntokens_]; @@ -681,28 +698,28 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; /* If not already recovering from an error, report this error. */ if (!yyerrstatus_) { - ++yynerrs_; - error (yylloc, yysyntax_error_ (yystate]dnl + ++yynerrs_; + error (yylloc, yysyntax_error_ (yystate]dnl b4_error_verbose_if([, yytoken])[)); } yyerror_range[0] = yylloc; if (yyerrstatus_ == 3) { - /* If just tried and failed to reuse look-ahead token after an - error, discard it. */ - - if (yychar <= yyeof_) - { - /* Return failure if at end of input. */ - if (yychar == yyeof_) - YYABORT; - } - else - { - yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc); - yychar = yyempty_; - } + /* If just tried and failed to reuse look-ahead token after an + error, discard it. */ + + if (yychar <= yyeof_) + { + /* Return failure if at end of input. */ + if (yychar == yyeof_) + YYABORT; + } + else + { + yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc); + yychar = yyempty_; + } } /* Else will try to reuse look-ahead token after shifting the error @@ -722,7 +739,10 @@ b4_error_verbose_if([, yytoken])[)); goto yyerrorlab; yyerror_range[0] = yylocation_stack_[yylen - 1]; + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ yypop_ (yylen); + yylen = 0; yystate = yystate_stack_[0]; goto yyerrlab1; @@ -734,29 +754,29 @@ b4_error_verbose_if([, yytoken])[)); for (;;) { - yyn = yypact_[yystate]; - if (yyn != yypact_ninf_) - { - yyn += yyterror_; - if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) - { - yyn = yytable_[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yystate_stack_.height () == 1) - YYABORT; - - yyerror_range[0] = yylocation_stack_[0]; - yydestruct_ ("Error: popping", - yystos_[yystate], - &yysemantic_stack_[0], &yylocation_stack_[0]); - yypop_ (); - yystate = yystate_stack_[0]; - YY_STACK_PRINT (); + yyn = yypact_[yystate]; + if (yyn != yypact_ninf_) + { + yyn += yyterror_; + if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) + { + yyn = yytable_[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yystate_stack_.height () == 1) + YYABORT; + + yyerror_range[0] = yylocation_stack_[0]; + yydestruct_ ("Error: popping", + yystos_[yystate], + &yysemantic_stack_[0], &yylocation_stack_[0]); + yypop_ (); + yystate = yystate_stack_[0]; + YY_STACK_PRINT (); } if (yyn == yyfinal_) @@ -765,13 +785,13 @@ b4_error_verbose_if([, yytoken])[)); yyerror_range[1] = yylloc; // Using YYLLOC is tempting, but would change the location of // the look-ahead. YYLOC is available though. - YYLLOC_DEFAULT (yyloc, yyerror_range - 1, 2); + YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2); yysemantic_stack_.push (yylval); yylocation_stack_.push (yyloc); - /* Shift the error token. */ + /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos_[yyn], - &yysemantic_stack_[0], &yylocation_stack_[0]); + &yysemantic_stack_[0], &yylocation_stack_[0]); yystate = yyn; goto yynewstate; @@ -790,13 +810,16 @@ b4_error_verbose_if([, yytoken])[)); if (yychar != yyeof_ && yychar != yyempty_) yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + yypop_ (yylen); while (yystate_stack_.height () != 1) { - yydestruct_ ("Cleanup: popping", - yystos_[yystate_stack_[0]], - &yysemantic_stack_[0], - &yylocation_stack_[0]); - yypop_ (); + yydestruct_ ("Cleanup: popping", + yystos_[yystate_stack_[0]], + &yysemantic_stack_[0], + &yylocation_stack_[0]); + yypop_ (); } return yyresult; @@ -808,42 +831,43 @@ b4_error_verbose_if([, yytoken])[)); b4_error_verbose_if([, int tok])[) { std::string res; + YYUSE (yystate); #if YYERROR_VERBOSE int yyn = yypact_[yystate]; if (yypact_ninf_ < yyn && yyn < yylast_) { - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = yylast_ - yyn; - int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_; - int count = 0; - for (int x = yyxbegin; x < yyxend; ++x) - if (yycheck_[x + yyn] == x && x != yyterror_) - ++count; - - // FIXME: This method of building the message is not compatible - // with internationalization. It should work like yacc.c does it. - // That is, first build a string that looks like this: - // "syntax error, unexpected %s or %s or %s" - // Then, invoke YY_ on this string. - // Finally, use the string as a format to output - // yytname_[tok], etc. - // Until this gets fixed, this message appears in English only. - res = "syntax error, unexpected "; - res += yytnamerr_ (yytname_[tok]); - if (count < 5) - { - count = 0; - for (int x = yyxbegin; x < yyxend; ++x) - if (yycheck_[x + yyn] == x && x != yyterror_) - { - res += (!count++) ? ", expecting " : " or "; - res += yytnamerr_ (yytname_[x]); - } - } + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = yylast_ - yyn; + int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_; + int count = 0; + for (int x = yyxbegin; x < yyxend; ++x) + if (yycheck_[x + yyn] == x && x != yyterror_) + ++count; + + // FIXME: This method of building the message is not compatible + // with internationalization. It should work like yacc.c does it. + // That is, first build a string that looks like this: + // "syntax error, unexpected %s or %s or %s" + // Then, invoke YY_ on this string. + // Finally, use the string as a format to output + // yytname_[tok], etc. + // Until this gets fixed, this message appears in English only. + res = "syntax error, unexpected "; + res += yytnamerr_ (yytname_[tok]); + if (count < 5) + { + count = 0; + for (int x = yyxbegin; x < yyxend; ++x) + if (yycheck_[x + yyn] == x && x != yyterror_) + { + res += (!count++) ? ", expecting " : " or "; + res += yytnamerr_ (yytname_[x]); + } + } } else #endif @@ -935,7 +959,7 @@ b4_error_verbose_if([, int tok])[) #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at \a yyntokens_, nonterminals. */ + First, the terminals, then, starting at \a yyntokens_, nonterminals. */ const char* const ]b4_parser_class_name[::yytname_[] = { @@ -944,7 +968,7 @@ b4_error_verbose_if([, int tok])[) #endif #if YYDEBUG - /* YYRHS -- A `-1'-separated list of the rules' RHS. */ + /* YYRHS -- A `-1'-separated list of the rules' RHS. */ const ]b4_parser_class_name[::rhs_number_type ]b4_parser_class_name[::yyrhs_[] = { @@ -972,23 +996,26 @@ b4_error_verbose_if([, int tok])[) { *yycdebug_ << "Stack now"; for (state_stack_type::const_iterator i = yystate_stack_.begin (); - i != yystate_stack_.end (); ++i) + i != yystate_stack_.end (); ++i) *yycdebug_ << ' ' << *i; *yycdebug_ << std::endl; } // Report on the debug stream that the rule \a yyrule is going to be reduced. void - ]b4_parser_class_name[::yyreduce_print_ (int yyrule) + ]b4_parser_class_name[::yy_reduce_print_ (int yyrule) { unsigned int yylno = yyrline_[yyrule]; + int yynrhs = yyr2_[yyrule]; /* Print the symbols being reduced, and their result. */ *yycdebug_ << "Reducing stack by rule " << yyrule - 1 - << " (line " << yylno << "), "; - for (]b4_int_type_for([b4_prhs])[ i = yyprhs_[yyrule]; - 0 <= yyrhs_[i]; ++i) - *yycdebug_ << yytname_[yyrhs_[i]] << ' '; - *yycdebug_ << "-> " << yytname_[yyr1_[yyrule]] << std::endl; + << " (line " << yylno << "), "; + /* The symbols being reduced. */ + for (int yyi = 0; yyi < yynrhs; yyi++) + YY_SYMBOL_PRINT (" $" << yyi + 1 << " =", + yyrhs_[yyprhs_[yyrule] + yyi], + &]b4_rhs_value(yynrhs, yyi + 1)[, + &]b4_rhs_location(yynrhs, yyi + 1)[); } #endif // YYDEBUG @@ -1025,7 +1052,8 @@ b4_error_verbose_if([, int tok])[) ]b4_epilogue dnl @output b4_dir_prefix[]stack.hh -b4_copyright([stack handling for Bison C++ parsers], [2002, 2003, 2004, 2005])[ +b4_copyright([stack handling for Bison C++ parsers], + [2002, 2003, 2004, 2005, 2006])[ #ifndef BISON_STACK_HH # define BISON_STACK_HH