X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/f3bd3f7876b4d4c6d22b9590e1a0938ad342c91f..3eb4f1a3e62807125a815dc572da9204b5b51865:/data/lalr1.cc?ds=sidebyside diff --git a/data/lalr1.cc b/data/lalr1.cc index cb770252..59b30964 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -1,6 +1,6 @@ # C++ skeleton for Bison -# Copyright (C) 2002-2011 Free Software Foundation, Inc. +# Copyright (C) 2002-2012 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 @@ -115,7 +115,7 @@ m4_popdef([b4_dollar_dollar])dnl m4_pushdef([b4_copyright_years], - [2002-2011]) + [2002-2012]) m4_define([b4_parser_class_name], [b4_percent_define_get([[parser_class_name]])]) @@ -126,8 +126,8 @@ b4_defines_if([], b4_locations_if([b4_percent_define_ifdef([[location_type]], [], [# Backward compatibility. - m4_define([b4_location_constructors]) - m4_include(b4_pkgdatadir/[location.cc])])]) + m4_define([b4_location_constructors]) + m4_include(b4_pkgdatadir/[location.cc])])]) m4_include(b4_pkgdatadir/[stack.hh]) b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])]) @@ -136,44 +136,29 @@ m4_changecom() m4_divert_push(0)dnl @output(b4_spec_defines_file@)@ b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++]) -dnl FIXME: This is wrong, we want computed header guards. [ -/* C++ LALR(1) parser skeleton written by Akim Demaille. */ +/** + ** \file ]b4_spec_defines_file[ + ** Define the ]b4_namespace_ref[::parser class. + */ -#ifndef PARSER_HEADER_H -# define PARSER_HEADER_H +/* C++ LALR(1) parser skeleton written by Akim Demaille. */ +]b4_cpp_guard_open([b4_spec_defines_file])[ ]b4_percent_code_get([[requires]])[ - -]b4_parse_assert_if([#include ])[ -#include -#include -#include -#include "stack.hh" +]b4_parse_assert_if([# include ])[ +# include +# include +# include +# include "stack.hh" ]b4_locations_if([b4_percent_define_ifdef([[location_type]], [], - [[#include "location.hh"]])])[ + [[# include "location.hh"]])])[ ]b4_variant_if([b4_namespace_open b4_variant_define b4_namespace_close])[ -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG ]b4_parse_trace_if([1], [0])[ -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[ -#endif - -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE ]b4_token_table[ -#endif +]b4_YYDEBUG_define[ ]b4_namespace_open[ @@ -190,7 +175,7 @@ b4_namespace_close])[ /// \returns 0 iff parsing succeeded. virtual int parse (); -#if YYDEBUG +#if ]b4_api_PREFIX[DEBUG /// The current debugging stream. std::ostream& debug_stream () const; /// Set the current debugging stream. @@ -209,6 +194,9 @@ b4_namespace_close])[ /// \param msg a description of the syntax error. virtual void error (]b4_locations_if([const location_type& loc, ])[const std::string& msg); + /// Report a syntax error. + void error (const syntax_error& err); + private: /// State numbers. typedef int state_type; @@ -236,18 +224,16 @@ b4_namespace_close])[ static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_; static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_; - /* Tables. */ -]b4_parser_tables_declare[ - -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE - /// For a symbol, its name in clear. - static const char* const yytname_[]; -#endif]b4_error_verbose_if([ + // Tables. +]b4_parser_tables_declare[]b4_error_verbose_if([ /// Convert the symbol name \a n to a form suitable for a diagnostic. static std::string yytnamerr_ (const char *n);])[ -#if YYDEBUG +]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[ + /// For a symbol, its name in clear. + static const char* const yytname_[]; +]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[ ]b4_integral_parser_table_declare([rline], [b4_rline], [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[ /// Report on the debug stream that the rule \a r is going to be reduced. @@ -255,15 +241,15 @@ b4_namespace_close])[ /// Print the state stack on the debug stream. virtual void yystack_print_ (); - /* Debugging. */ + // Debugging. int yydebug_; std::ostream* yycdebug_; -#endif +#endif // ]b4_api_PREFIX[DEBUG /// Convert a scanner token number \a t to a symbol number. static inline token_number_type yytranslate_ (]b4_lex_symbol_if([token_type], [int])[ t); -#if YYDEBUG +#if ]b4_api_PREFIX[DEBUG /// \brief Display a symbol type, value and location. /// \param yyo The output stream. /// \param yysym The symbol. @@ -349,14 +335,13 @@ b4_public_types_define])[ ]b4_percent_define_flag_if([[global_tokens_and_yystype]], [b4_token_defines(b4_tokens) -#ifndef YYSTYPE +#ifndef ]b4_api_PREFIX[STYPE /* Redirection for backward compatibility. */ -# define YYSTYPE b4_namespace_ref::b4_parser_class_name::semantic_type +# define ]b4_api_PREFIX[STYPE b4_namespace_ref::b4_parser_class_name::semantic_type #endif -]) -b4_percent_code_get([[provides]])[]dnl - -[#endif /* ! defined PARSER_HEADER_H */] +])[ +]b4_percent_code_get([[provides]])[ +]b4_cpp_guard_close([b4_spec_defines_file]) @output(b4_parser_file_name@)@ b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++]) b4_percent_code_get([[top]])[]dnl @@ -371,10 +356,12 @@ m4_if(b4_prefix, [yy], [], #include "@basename(]b4_spec_defines_file[@)" /* User implementation prologue. */ -]b4_user_post_prologue -b4_percent_code_get[]dnl +]b4_user_post_prologue[ +]b4_percent_code_get[ -[#ifndef YY_ +]b4_null_define[ + +#ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* FIXME: INFRINGES ON USER NAME SPACE */ @@ -387,31 +374,14 @@ b4_percent_code_get[]dnl #endif ]b4_locations_if([dnl -[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K].location) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (N) \ - { \ - (Current).begin = YYRHSLOC (Rhs, 1).begin; \ - (Current).end = YYRHSLOC (Rhs, N).end; \ - } \ - else \ - { \ - (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end; \ - } \ - while (false) -#endif]])[ +[#define YYRHSLOC(Rhs, K) ((Rhs)[K].location) +]b4_yylloc_default_define])[ /* Suppress unused-variable warnings by "using" E. */ #define YYUSE(e) ((void) (e)) /* Enable debugging if requested. */ -#if YYDEBUG +#if ]b4_api_PREFIX[DEBUG /* A pseudo ostream that takes yydebug_ into account. */ # define YYCDEBUG if (yydebug_) (*yycdebug_) @@ -438,14 +408,14 @@ b4_percent_code_get[]dnl yystack_print_ (); \ } while (false) -#else /* !YYDEBUG */ +#else /* !]b4_api_PREFIX[DEBUG */ # define YYCDEBUG if (false) std::cerr -# define YY_SYMBOL_PRINT(Title, Symbol) static_cast(0) +# define YY_SYMBOL_PRINT(Title, Symbol) YYUSE(Symbol) # define YY_REDUCE_PRINT(Rule) static_cast(0) # define YY_STACK_PRINT() static_cast(0) -#endif /* !YYDEBUG */ +#endif /* !]b4_api_PREFIX[DEBUG */ #define yyerrok (yyerrstatus_ = 0) #define yyclearin (yyempty = true) @@ -498,7 +468,7 @@ b4_percent_code_get[]dnl /// Build a parser object. ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [ :])[ -#if YYDEBUG +#if ]b4_api_PREFIX[DEBUG ]m4_ifset([b4_parse_param], [ ], [ :])[yydebug_ (false), yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[ #endif]b4_parse_param_cons[ @@ -544,12 +514,11 @@ b4_percent_code_get[]dnl ]b4_parser_class_name[::yy_destroy_ (const char* yymsg, symbol_base_type& yysym) const { - int yytype = yysym.type_get (); - YYUSE (yymsg); if (yymsg) YY_SYMBOL_PRINT (yymsg, yysym); // User destructor. + int yytype = yysym.type_get (); switch (yytype) { ]b4_symbol_foreach([b4_symbol_destructor])dnl @@ -561,12 +530,14 @@ b4_percent_code_get[]dnl b4_symbol_variant([[yytype]], [[yysym.value]], [[template destroy]])])[ } -#if YYDEBUG +#if ]b4_api_PREFIX[DEBUG template void ]b4_parser_class_name[::yy_print_ (std::ostream& yyo, const symbol_base_type& yysym) const { + std::ostream& yyoutput = yyo; + YYUSE (yyoutput); int yytype = yysym.type_get (); yyo << (yytype < yyntokens_ ? "token" : "nterm") << ' ' << yytname_[yytype] << " ("]b4_locations_if([ @@ -621,7 +592,7 @@ b4_percent_code_get[]dnl yystack_.pop (n); } -#if YYDEBUG +#if ]b4_api_PREFIX[DEBUG std::ostream& ]b4_parser_class_name[::debug_stream () const { @@ -646,7 +617,7 @@ b4_percent_code_get[]dnl { yydebug_ = l; } -#endif +#endif // ]b4_api_PREFIX[DEBUG inline ]b4_parser_class_name[::state_type ]b4_parser_class_name[::yy_lr_goto_state_ (state_type yystate, int yylhs) @@ -693,7 +664,7 @@ b4_percent_code_get[]dnl /// $$ and @@$. stack_symbol_type yylhs; - /// The return value of parse(). + /// The return value of parse (). int yyresult; YYCDEBUG << "Starting parse" << std::endl; @@ -711,7 +682,7 @@ m4_popdef([b4_at_dollar])])dnl location values to have been already stored, initialize these stacks with a primary value. */ yystack_ = stack_type (0); - yypush_ (0, 0, yyla); + yypush_ (YY_NULL, 0, yyla); // A new symbol was pushed on the stack. yynewstate: @@ -735,13 +706,21 @@ m4_popdef([b4_at_dollar])])dnl if (yyempty) { YYCDEBUG << "Reading a token: "; + try + { ]b4_lex_symbol_if( -[ yyla = b4_c_function_call([yylex], [symbol_type], - m4_ifdef([b4_lex_param], b4_lex_param));], -[ yyla.type = yytranslate_ (b4_c_function_call([yylex], [int], - [[YYSTYPE*], [&yyla.value]][]dnl +[ yyla = b4_c_function_call([yylex], [symbol_type], + m4_ifdef([b4_lex_param], b4_lex_param));], +[ yyla.type = yytranslate_ (b4_c_function_call([yylex], [int], + [b4_api_PREFIX[STYPE*], [&yyla.value]][]dnl b4_locations_if([, [[location*], [&yyla.location]]])dnl m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ + } + catch (const syntax_error& yyexc) + { + error (yyexc); + goto yyerrlab1; + } yyempty = false; } YY_SYMBOL_PRINT ("Next token is", yyla); @@ -824,8 +803,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ } catch (const syntax_error& yyexc) { - error (]b4_args(b4_locations_if([yyexc.location]), - [[yyexc.what()]])[); + error (yyexc); YYERROR; } YY_SYMBOL_PRINT ("-> $$ =", yylhs); @@ -835,21 +813,21 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ // Destroy a variant which value may have been swapped with // yylhs.value (for instance if the action was "std::swap($$, // $1)"). The value of yylhs.value (hence possibly one of these - // rhs symbols) depends on the default contruction for this + // rhs symbols) depends on the default construction for this // type. In the case of pointers for instance, no // initialization is done, so the value is junk. Therefore do // not try to report the value of symbols about to be destroyed // in the debug trace, it's possibly junk. Hence yymsg = 0. // Besides, that keeps exactly the same traces as with the other // Bison skeletons. - yy_destroy_ (0, yystack_[i]);]])[ + yy_destroy_ (YY_NULL, yystack_[i]);]])[ yypop_ (yylen); yylen = 0; YY_STACK_PRINT (); /* Shift the result of the reduction. */ - yypush_ (0, yylhs); + yypush_ (YY_NULL, yylhs); goto yynewstate; /*--------------------------------------. @@ -972,6 +950,13 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ return yyresult; } + void + ]b4_parser_class_name[::error (const syntax_error& yyexc) + { + error (]b4_args(b4_locations_if([yyexc.location]), + [[yyexc.what()]])[); + } + // Generate an error message. std::string ]b4_parser_class_name[::yysyntax_error_ (]dnl @@ -1040,7 +1025,7 @@ b4_error_verbose_if([state_type yystate, int yytoken], } } - char const* yyformat = 0; + char const* yyformat = YY_NULL; switch (yycount) { #define YYCASE_(N, S) \ @@ -1077,7 +1062,7 @@ b4_error_verbose_if([state_type yystate, int yytoken], ]b4_parser_tables_define[ -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[ /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at \a yyntokens_, nonterminals. */ const char* @@ -1085,9 +1070,8 @@ b4_error_verbose_if([state_type yystate, int yytoken], { ]b4_tname[ }; -#endif -#if YYDEBUG +]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[ ]b4_integral_parser_table_define([rline], [b4_rline])[ // Print the state stack on the debug stream. @@ -1117,7 +1101,7 @@ b4_error_verbose_if([state_type yystate, int yytoken], YY_SYMBOL_PRINT (" $" << yyi + 1 << " =", ]b4_rhs_data(yynrhs, yyi + 1)[); } -#endif // YYDEBUG +#endif // ]b4_api_PREFIX[DEBUG ]b4_lex_symbol_if([], [b4_yytranslate_define])[ ]b4_namespace_close[