X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/53f036ce027289d3f5e70c88735b88aa6725381d..9b5049bd074ec26af9e216fd95eb8d618e3601a4:/data/lalr1.cc diff --git a/data/lalr1.cc b/data/lalr1.cc index 1e4c856a..deab8639 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -1,7 +1,6 @@ # C++ skeleton for Bison -# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 -# Free Software Foundation, Inc. +# Copyright (C) 2002-2010 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 @@ -29,7 +28,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 +115,7 @@ m4_popdef([b4_dollar_dollar])dnl m4_pushdef([b4_copyright_years], - [2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009]) + [2002-2010]) m4_define([b4_parser_class_name], [b4_percent_define_get([[parser_class_name]])]) @@ -147,18 +146,16 @@ dnl FIXME: This is wrong, we want computed header guards. ]b4_percent_code_get([[requires]])[ ]b4_parse_assert_if([#include ])[ +#include #include #include +]b4_locations_if([#include "location.hh"])[ #include "stack.hh" ]b4_namespace_open[ -]b4_locations_if([ class position; - class location;])[ ]b4_variant_if([b4_variant_define])[ ]b4_namespace_close[ -]b4_locations_if([#include "location.hh"])[ - /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG ]b4_parse_trace_if([1], [0])[ @@ -245,6 +242,14 @@ do { \ /// \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_; @@ -312,7 +317,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; }; @@ -389,7 +394,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) @@ -651,6 +656,18 @@ b4_percent_code_get[]dnl 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 () { @@ -669,7 +686,7 @@ b4_percent_code_get[]dnl symbol_type yyla;]b4_locations_if([[ /// The locations where the error started and ended. - stack_symbol_type yyerror_range[2];]])[ + stack_symbol_type yyerror_range[3];]])[ /// $$ and @@$. stack_symbol_type yylhs; @@ -709,7 +726,7 @@ m4_popdef([b4_at_dollar])])dnl /* Try to take a decision without lookahead. */ yyn = yypact_[yystack_[0].state]; - if (yyn == yypact_ninf_) + if (yy_pact_value_is_default_ (yyn)) goto yydefault; /* Read a lookahead token. */ @@ -737,7 +754,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; @@ -794,12 +811,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; } + } + 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. @@ -837,7 +863,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ } ]b4_locations_if([[ - yyerror_range[0].location = yyla.location;]])[ + yyerror_range[1].location = yyla.location;]])[ if (yyerrstatus_ == 3) { /* If just tried and failed to reuse lookahead token after an @@ -846,7 +872,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; @@ -868,7 +894,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ code. */ if (false) goto yyerrorlab;]b4_locations_if([[ - yyerror_range[0].location = yystack_[yylen - 1].location;]])b4_variant_if([[ + yyerror_range[1].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 @@ -887,7 +913,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ for (;;) { yyn = yypact_[yystack_[0].state]; - if (yyn != yypact_ninf_) + if (!yy_pact_value_is_default_ (yyn)) { yyn += yyterror_; if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) @@ -902,14 +928,14 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ if (yystack_.size () == 1) YYABORT; ]b4_locations_if([[ - yyerror_range[0].location = yystack_[0].location;]])[ + yyerror_range[1].location = yystack_[0].location;]])[ yy_destroy_ ("Error: popping", yystack_[0]); yypop_ (); YY_STACK_PRINT (); } ]b4_locations_if([[ - yyerror_range[1].location = yyla.location; - YYLLOC_DEFAULT (error_token.location, (yyerror_range - 1), 2);]])[ + yyerror_range[2].location = yyla.location; + YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);]])[ /* Shift the error token. */ error_token.state = yyn; @@ -972,7 +998,7 @@ b4_error_verbose_if([state_type yystate, int yytoken], yyarg[yycount++] = yytname_[yytoken]; for (int yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_ - && yytable_[yyx + yyn] != yytable_ninf_) + && !yy_table_value_is_error_ (yytable_[yyx + yyn])) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) {