X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/cbf25ce74fab2a7ff245bf0a2b160c06ac5b7b1e..d59beda068aef97834ea84ce4f5cc99b487e4b68:/data/lalr1.cc?ds=inline diff --git a/data/lalr1.cc b/data/lalr1.cc index 81c2d207..6174e824 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -1,6 +1,6 @@ # C++ skeleton for Bison -# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. # This program is free software: you can redistribute it and/or modify @@ -29,7 +29,7 @@ m4_define([b4_integral_parser_table_declare], ]) # b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT) -# --------------------------------------------- +# ------------------------------------------------------------- # Define "parser::yy_" which contents is CONTENT. m4_define([b4_integral_parser_table_define], [ const b4_int_type_for([$2]) @@ -116,7 +116,7 @@ m4_popdef([b4_dollar_dollar])dnl m4_pushdef([b4_copyright_years], - [2002, 2003, 2004, 2005, 2006, 2007, 2008]) + [2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009]) m4_define([b4_parser_class_name], [b4_percent_define_get([[parser_class_name]])]) @@ -146,7 +146,8 @@ dnl FIXME: This is wrong, we want computed header guards. ]b4_percent_code_get([[requires]])[ -]b4_assert_if([#include ])[ +]b4_parse_assert_if([#include ])[ +#include #include #include #include "stack.hh" @@ -161,7 +162,7 @@ dnl FIXME: This is wrong, we want computed header guards. /* Enabling traces. */ #ifndef YYDEBUG -# define YYDEBUG ]b4_debug_flag[ +# define YYDEBUG ]b4_parse_trace_if([1], [0])[ #endif /* Enabling verbose error messages. */ @@ -169,7 +170,7 @@ dnl FIXME: This is wrong, we want computed header guards. # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else -# define YYERROR_VERBOSE ]b4_error_verbose_flag[ +# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[ #endif /* Enabling the token table. */ @@ -232,14 +233,27 @@ do { \ virtual void error (]b4_locations_if([const location_type& loc, ])[const std::string& msg); private: - /// Generate an error message. - /// \param state the state where the error occurred. - /// \param tok the lookahead token. - virtual std::string yysyntax_error_ (int yystate, int tok); - /// State numbers. typedef int state_type; + /// Generate an error message. + /// \param yystate the state where the error occurred. + /// \param yytoken the lookahead token. + virtual std::string yysyntax_error_ (state_type yystate, int yytoken); + + /// 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); + + /// Whether the given \c yypact_ value indicates a defaulted state. + /// \param yyvalue the value to check + static bool yy_pact_value_is_default_ (int yyvalue); + + /// Whether the given \c yytable_ value indicates a syntax error. + /// \param yyvalue the value to check + static bool yy_table_value_is_error_ (int yyvalue); + /// 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_; @@ -307,7 +321,7 @@ do { \ /// The state. state_type state; - /// Return the type corresponding to this state. + /// The type (corresponding to \a state). inline int type_get_ () const; }; @@ -384,7 +398,7 @@ m4_if(b4_prefix, [yy], [], b4_percent_code_get[]dnl [#ifndef YY_ -# if YYENABLE_NLS +# if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* FIXME: INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) @@ -636,6 +650,28 @@ 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_]; + } + + inline bool + ]b4_parser_class_name[::yy_pact_value_is_default_ (int yyvalue) + { + return yyvalue == yypact_ninf_; + } + + inline bool + ]b4_parser_class_name[::yy_table_value_is_error_ (int yyvalue) + { + return yyvalue == yytable_ninf_; + } + int ]b4_parser_class_name[::parse () { @@ -645,7 +681,6 @@ b4_percent_code_get[]dnl /* State. */ int yyn; int yylen = 0; - int yystate = 0; /* Error handling. */ int yynerrs_ = 0; @@ -680,14 +715,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,8 +729,8 @@ m4_popdef([b4_at_dollar])])dnl yybackup: /* Try to take a decision without lookahead. */ - yyn = yypact_[yystate]; - if (yyn == yypact_ninf_) + yyn = yypact_[yystack_[0].state]; + if (yy_pact_value_is_default_ (yyn)) goto yydefault; /* Read a lookahead token. */ @@ -725,7 +758,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ yyn = yytable_[yyn]; if (yyn <= 0) { - if (yyn == 0 || yyn == yytable_ninf_) + if (yy_table_value_is_error_ (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; @@ -740,15 +773,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; @@ -757,11 +789,12 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: - yylen = yyr2_[yyn];]b4_variant_if([ + yylen = yyr2_[yyn]; + 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. */ - ]b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build]),[ + b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])],[ /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, use the top of the stack. @@ -782,21 +815,21 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ // Perform the reduction. YY_REDUCE_PRINT (yyn); - switch (yyn) + try + { + switch (yyn) { ]b4_user_actions[ default: break; } - // Compute post-reduction state. - yyn = yyr1_[yyn]; - yystate = yypgoto_[yyn - yyntokens_] + yystack_[yylen].state; - if (0 <= yystate && yystate <= yylast_ - && yycheck_[yystate] == yystack_[yylen].state) - yystate = yytable_[yystate]; - else - yystate = yydefgoto_[yyn - yyntokens_]; - yylhs.state = yystate; + } + catch (const syntax_error& yyexc) + { + error (]b4_args(b4_locations_if([yyexc.location]), + [[yyexc.what()]])[); + YYERROR; + } YY_SYMBOL_PRINT ("-> $$ =", yylhs); ]b4_variant_if([[ // Destroy the rhs symbols. @@ -830,7 +863,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([[ @@ -843,7 +876,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ /* Return failure if at end of input. */ if (yyla.type == yyeof_) YYABORT; - else + else if (!yyempty) { yy_destroy_ ("Error: discarding", yyla); yyempty = true; @@ -864,15 +897,14 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ YYERROR and the label yyerrorlab therefore never appears in user code. */ if (false) - goto yyerrorlab; - -]b4_locations_if([[ - yyerror_range[0].location = yystack_[yylen - 1].location;]])[ + goto yyerrorlab;]b4_locations_if([[ + yyerror_range[0].location = yystack_[yylen - 1].location;]])b4_variant_if([[ + /* $$ was initialized before running the user action. */ + yy_destroy_ ("Error: discarding", yylhs);]])[ /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ yypop_ (yylen); yylen = 0; - yystate = yystack_[0].state; goto yyerrlab1; /*-------------------------------------------------------------. @@ -884,8 +916,8 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ stack_symbol_type error_token; for (;;) { - yyn = yypact_[yystate]; - if (yyn != yypact_ninf_) + yyn = yypact_[yystack_[0].state]; + if (!yy_pact_value_is_default_ (yyn)) { yyn += yyterror_; if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) @@ -903,7 +935,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([[ @@ -911,7 +942,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; @@ -945,7 +976,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ // Generate an error message. std::string ]b4_parser_class_name[::yysyntax_error_ (]dnl -b4_error_verbose_if([int yystate, int yytoken], +b4_error_verbose_if([state_type yystate, int yytoken], [int, int])[) { std::string yyres;]b4_error_verbose_if([[ @@ -953,7 +984,8 @@ b4_error_verbose_if([int yystate, int yytoken], if (yypact_ninf_ < yyn && yyn <= yylast_) { /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ + YYCHECK. In other words, skip the first -YYN actions for this + state because they are default actions. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ @@ -969,7 +1001,8 @@ b4_error_verbose_if([int yystate, int yytoken], char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; yyarg[yycount++] = yytname_[yytoken]; for (int yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_) + if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_ + && !yy_table_value_is_error_ (yytable_[yyx + yyn])) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) {