X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/6b5a748937ae95af26d78e9e5e7a335351a2970d..38cea49be1670782636ce2e7bc300ef761e78fc2:/data/lalr1.cc diff --git a/data/lalr1.cc b/data/lalr1.cc index d6ea50b7..a0a059ae 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -1,6 +1,6 @@ # C++ skeleton for Bison -# Copyright (C) 2002-2012 Free Software Foundation, Inc. +# Copyright (C) 2002-2013 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,7 +20,7 @@ m4_include(b4_pkgdatadir/[c++.m4]) # b4_integral_parser_table_declare(TABLE-NAME, CONTENT, COMMENT) # -------------------------------------------------------------- -# Declare "parser::yy_" which contents is CONTENT. +# Declare "parser::yy_" whose contents is CONTENT. m4_define([b4_integral_parser_table_declare], [m4_ifval([$3], [b4_comment([$3], [ ]) ])dnl @@ -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. +# Define "parser::yy_" whose contents is CONTENT. m4_define([b4_integral_parser_table_define], [ const b4_int_type_for([$2]) b4_parser_class_name::yy$1_[[]] = @@ -114,16 +114,28 @@ b4_dollar_popdef[]dnl ])]) +# b4_lex +# ------ +# Call yylex. +m4_define([b4_lex], +[b4_token_ctor_if( +[b4_function_call([yylex], + [symbol_type], m4_ifdef([b4_lex_param], b4_lex_param))], +[b4_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))])]) + + m4_pushdef([b4_copyright_years], - [2002-2012]) + [2002-2013]) m4_define([b4_parser_class_name], [b4_percent_define_get([[parser_class_name]])]) -b4_locations_if([b4_percent_define_ifdef([[location_type]], [], - [# Backward compatibility. +b4_bison_locations_if([# Backward compatibility. m4_define([b4_location_constructors]) - m4_include(b4_pkgdatadir/[location.cc])])]) + m4_include(b4_pkgdatadir/[location.cc])]) m4_include(b4_pkgdatadir/[stack.hh]) b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])]) @@ -134,13 +146,13 @@ b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])]) m4_define([b4_shared_declarations], [b4_percent_code_get([[requires]])[ ]b4_parse_assert_if([# include ])[ -# include +# include # include # include # include ]b4_defines_if([[ # include "stack.hh" -]b4_locations_if([b4_percent_define_ifdef([[location_type]], [], - [[# include "location.hh"]])])])[ +]b4_bison_locations_if([[# include "location.hh"]])])[ +]b4_variant_if([b4_variant_includes])[ ]b4_YYDEBUG_define[ @@ -148,9 +160,8 @@ m4_define([b4_shared_declarations], ]b4_defines_if([], [b4_stack_define -b4_locations_if([b4_percent_define_ifdef([[location_type]], [], - [b4_position_define -b4_location_define])])])[ +b4_bison_locations_if([b4_position_define +b4_location_define])])[ ]b4_variant_if([b4_variant_define])[ @@ -195,8 +206,9 @@ b4_location_define])])])[ /// 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); + /// \param yytoken the lookahead token type, or yyempty_. + virtual std::string yysyntax_error_ (state_type yystate, + symbol_number_type yytoken) const; /// Compute post-reduction state. /// \param yystate the current state @@ -216,6 +228,9 @@ b4_location_define])])])[ 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_; + /// Convert a scanner token number \a t to a symbol number. + static token_number_type yytranslate_ (]b4_token_ctor_if([token_type], [int])[ t); + // Tables. ]b4_parser_tables_declare[]b4_error_verbose_if([ @@ -227,7 +242,7 @@ b4_location_define])])])[ 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.])[ + [[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. virtual void yy_reduce_print_ (int r); /// Print the state stack on the debug stream. @@ -236,48 +251,58 @@ b4_location_define])])])[ // Debugging. int yydebug_; std::ostream* yycdebug_; -#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 ]b4_api_PREFIX[DEBUG /// \brief Display a symbol type, value and location. /// \param yyo The output stream. /// \param yysym The symbol. - template - void yy_print_ (std::ostream& yyo, - const symbol_base_type& yysym) const; + template + void yy_print_ (std::ostream& yyo, const basic_symbol& yysym) const; #endif /// \brief Reclaim the memory associated to a symbol. /// \param yymsg Why this token is reclaimed. /// If null, print nothing. /// \param s The symbol. - template - inline void yy_destroy_ (const char* yymsg, - symbol_base_type& yysym) const; + template + void yy_destroy_ (const char* yymsg, basic_symbol& yysym) const; private: - /// Element of the stack: a state and its attributes. - struct stack_symbol_type : symbol_base_type + /// Type access provider for state based symbols. + struct by_state { - /// The parent class. - typedef symbol_base_type super_type; - /// Default constructor. - inline stack_symbol_type (); + by_state (); /// Constructor. - inline stack_symbol_type (]b4_join([state_type s], - [const semantic_type& v], - b4_locations_if([const location_type& l]))[); + by_state (state_type s); + + /// Copy constructor. + by_state (const by_state& other); + + void move (by_state& that); /// The state. state_type state; /// The type (corresponding to \a state). - inline int type_get_ () const; + /// -1 when empty. + int type_get () const; + + /// The type used to store the symbol type. + typedef state_type value_type; + }; + + /// "Internal" symbol: element of the stack. + struct stack_symbol_type : basic_symbol + { + /// Superclass. + typedef basic_symbol super_type; + /// Construct an empty symbol. + stack_symbol_type (); + /// Steal the contents from \a sym to build this. + stack_symbol_type (state_type s, symbol_type& sym); + /// Assignment, needed by push_back. + stack_symbol_type& operator= (const stack_symbol_type& that); }; /// Stack type. @@ -291,7 +316,7 @@ b4_location_define])])])[ /// if null, no trace is output. /// \param s the symbol /// \warning the contents of \a s.value is stolen. - inline void yypush_ (const char* m, stack_symbol_type& s); + void yypush_ (const char* m, stack_symbol_type& s); /// Push a new look ahead token on the state on the stack. /// \param m a debug message to display @@ -299,12 +324,12 @@ b4_location_define])])])[ /// \param s the state /// \param sym the symbol (for its value and location). /// \warning the contents of \a s.value is stolen. - inline void yypush_ (const char* m, state_type s, symbol_type& sym); + void yypush_ (const char* m, state_type s, symbol_type& sym); /// Pop \a n symbols the three stacks. - inline void yypop_ (unsigned int n = 1); + void yypop_ (unsigned int n = 1); - /* Constants. */ + // Constants. enum { yyeof_ = 0, @@ -320,7 +345,7 @@ b4_location_define])])])[ ]b4_parse_param_vars[ }; -]b4_lex_symbol_if([b4_yytranslate_define +]b4_token_ctor_if([b4_yytranslate_define b4_public_types_define])[ ]b4_namespace_close[ @@ -328,18 +353,15 @@ b4_public_types_define])[ [b4_token_defines #ifndef ]b4_api_PREFIX[STYPE - /* Redirection for backward compatibility. */ + // Redirection for backward compatibility. # define ]b4_api_PREFIX[STYPE b4_namespace_ref::b4_parser_class_name::semantic_type #endif ])[ ]b4_percent_code_get([[provides]])[ ]]) -# We do want M4 expansion after # for CPP macros. -m4_changecom() b4_defines_if( -[m4_divert_push(0)dnl -@output(b4_spec_defines_file@)@ +[b4_output_begin([b4_spec_defines_file]) b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++]) [ /** @@ -347,17 +369,16 @@ b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++]) ** Define the ]b4_namespace_ref[::parser class. */ -/* C++ LALR(1) parser skeleton written by Akim Demaille. */ +// C++ LALR(1) parser skeleton written by Akim Demaille. ]b4_cpp_guard_open([b4_spec_defines_file])[ ]b4_shared_declarations[ ]b4_cpp_guard_close([b4_spec_defines_file]) -m4_divert_pop(0)dnl +b4_output_end() ]) -m4_divert_push(0)dnl -@output(b4_parser_file_name@)@ +b4_output_begin([b4_parser_file_name]) b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++]) b4_percent_code_get([[top]])[]dnl m4_if(b4_prefix, [yy], [], @@ -373,14 +394,14 @@ m4_if(b4_prefix, [yy], [], ]b4_defines_if([[#include "@basename(]b4_spec_defines_file[@)"]], [b4_shared_declarations])[ -/* User implementation prologue. */ +// User implementation prologue. ]b4_user_post_prologue[ ]b4_percent_code_get[ #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS -# include /* FIXME: INFRINGES ON USER NAME SPACE */ +# include // FIXME: INFRINGES ON USER NAME SPACE. # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif @@ -393,13 +414,13 @@ m4_if(b4_prefix, [yy], [], [#define YYRHSLOC(Rhs, K) ((Rhs)[K].location) ]b4_yylloc_default_define])[ -/* Suppress unused-variable warnings by "using" E. */ -#define YYUSE(e) ((void) (e)) +// Suppress unused-variable warnings by "using" E. +#define YYUSE(E) ((void) (E)) -/* Enable debugging if requested. */ +// Enable debugging if requested. #if ]b4_api_PREFIX[DEBUG -/* A pseudo ostream that takes yydebug_ into account. */ +// A pseudo ostream that takes yydebug_ into account. # define YYCDEBUG if (yydebug_) (*yycdebug_) # define YY_SYMBOL_PRINT(Title, Symbol) \ @@ -424,14 +445,14 @@ m4_if(b4_prefix, [yy], [], yystack_print_ (); \ } while (false) -#else /* !]b4_api_PREFIX[DEBUG */ +#else // !]b4_api_PREFIX[DEBUG # define YYCDEBUG if (false) std::cerr # define YY_SYMBOL_PRINT(Title, Symbol) YYUSE(Symbol) # define YY_REDUCE_PRINT(Rule) static_cast(0) # define YY_STACK_PRINT() static_cast(0) -#endif /* !]b4_api_PREFIX[DEBUG */ +#endif // !]b4_api_PREFIX[DEBUG #define yyerrok (yyerrstatus_ = 0) #define yyclearin (yyempty = true) @@ -466,7 +487,7 @@ m4_if(b4_prefix, [yy], [], case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; - /* Fall through. */ + // Fall through. default: yyr += *yyp; break; @@ -488,50 +509,85 @@ m4_if(b4_prefix, [yy], [], ]m4_ifset([b4_parse_param], [ ], [ :])[yydebug_ (false), yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[ #endif]b4_parse_param_cons[ - { - } + {} ]b4_parser_class_name::~b4_parser_class_name[ () - { - } + {} /*---------------. | Symbol types. | `---------------*/ -]b4_lex_symbol_if([], [b4_public_types_define])[ +]b4_token_ctor_if([], [b4_public_types_define])[ - // stack_symbol_type. - ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type () - : super_type () - , state () + // by_state. + inline + ]b4_parser_class_name[::by_state::by_state () + : state (-1) + {} + + inline + ]b4_parser_class_name[::by_state::by_state (const by_state& other) + : state (other.state) + {} + + inline + void + ]b4_parser_class_name[::by_state::move (by_state& that) { + state = that.state; + that.state = -1; } - ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (]b4_join( - [state_type s], - [const semantic_type& v], - b4_locations_if([const location_type& l]))[) - : super_type (v]b4_locations_if([, l])[) - , state (s) + inline + ]b4_parser_class_name[::by_state::by_state (state_type s) + : state (s) + {} + + inline + int + ]b4_parser_class_name[::by_state::type_get () const { + return state == -1 ? -1 : yystos_[state]; } - int - ]b4_parser_class_name[::stack_symbol_type::type_get_ () const + inline + ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type () + {} + + + inline + ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (state_type s, symbol_type& that) + : super_type (s]b4_locations_if([, that.location])[) + { + ]b4_variant_if([b4_symbol_variant([that.type_get ()], + [value], [move], [that.value])], + [[value = that.value;]])[ + // that is emptied. + that.type = -1; + } + + inline + ]b4_parser_class_name[::stack_symbol_type& + ]b4_parser_class_name[::stack_symbol_type::operator= (const stack_symbol_type& that) { - return yystos_[state]; + state = that.state; + ]b4_variant_if([b4_symbol_variant([that.type_get ()], + [value], [copy], [that.value])], + [[value = that.value;]])[]b4_locations_if([ + location = that.location;])[ + return *this; } - template + template + inline void - ]b4_parser_class_name[::yy_destroy_ (const char* yymsg, - symbol_base_type& yysym) const + ]b4_parser_class_name[::yy_destroy_ (const char* yymsg, basic_symbol& yysym) const { if (yymsg) - YY_SYMBOL_PRINT (yymsg, yysym); + YY_SYMBOL_PRINT (yymsg, yysym);]b4_variant_if([], [ // User destructor. int yytype = yysym.type_get (); @@ -540,17 +596,14 @@ m4_if(b4_prefix, [yy], [], ]b4_symbol_foreach([b4_symbol_destructor])dnl [ default: break; - }]b4_variant_if([ - - // Type destructor. - b4_symbol_variant([[yytype]], [[yysym.value]], [[template destroy]])])[ + }])[ } #if ]b4_api_PREFIX[DEBUG - template + template void ]b4_parser_class_name[::yy_print_ (std::ostream& yyo, - const symbol_base_type& yysym) const + const basic_symbol& yysym) const { std::ostream& yyoutput = yyo; YYUSE (yyoutput); @@ -568,40 +621,24 @@ m4_if(b4_prefix, [yy], [], } #endif + inline void - ]b4_parser_class_name[::yypush_ (const char* m, state_type s, - symbol_type& sym) + ]b4_parser_class_name[::yypush_ (const char* m, state_type s, symbol_type& sym) { - if (m) - YY_SYMBOL_PRINT (m, sym); -]b4_variant_if( -[[ yystack_.push (stack_symbol_type (]b4_join( - [s], - [semantic_type()], - b4_locations_if([sym.location]))[)); - ]b4_symbol_variant([[yystos_[s]]], [[yystack_[0].value]], - [build], [sym.value])], -[[ yystack_.push (stack_symbol_type (]b4_join( - [s], - [sym.value], - b4_locations_if([sym.location]))[));]])[ + stack_symbol_type t (s, sym); + yypush_ (m, t); } + inline void ]b4_parser_class_name[::yypush_ (const char* m, stack_symbol_type& s) { if (m) YY_SYMBOL_PRINT (m, s); -]b4_variant_if( -[[ yystack_.push (stack_symbol_type (]b4_join( - [s.state], - [semantic_type()], - b4_locations_if([s.location]))[)); - ]b4_symbol_variant([[yystos_[s.state]]], [[yystack_[0].value]], - [build], [s.value])], -[ yystack_.push (s);])[ + yystack_.push (s); } + inline void ]b4_parser_class_name[::yypop_ (unsigned int n) { @@ -663,11 +700,11 @@ m4_if(b4_prefix, [yy], [], /// Whether yyla contains a lookahead. bool yyempty = true; - /* State. */ + // State. int yyn; int yylen = 0; - /* Error handling. */ + // Error handling. int yynerrs_ = 0; int yyerrstatus_ = 0; @@ -683,11 +720,15 @@ m4_if(b4_prefix, [yy], [], /// The return value of parse (). int yyresult; + // FIXME: This shoud be completely indented. It is not yet to + // avoid gratuitous conflicts when merging into the master branch. + try + { YYCDEBUG << "Starting parse" << std::endl; ]m4_ifdef([b4_initial_action], [ b4_dollar_pushdef([yyla.value], [], [yyla.location])dnl - /* User initialization code. */ + // User initialization code. b4_user_initial_action b4_dollar_popdef])[]dnl @@ -702,39 +743,35 @@ b4_dollar_popdef])[]dnl yynewstate: YYCDEBUG << "Entering state " << yystack_[0].state << std::endl; - /* Accept? */ + // Accept? if (yystack_[0].state == yyfinal_) goto yyacceptlab; goto yybackup; - /* Backup. */ + // Backup. yybackup: - /* Try to take a decision without lookahead. */ + // Try to take a decision without lookahead. yyn = yypact_[yystack_[0].state]; if (yy_pact_value_is_default_ (yyn)) goto yydefault; - /* Read a lookahead token. */ + // Read a lookahead token. if (yyempty) { YYCDEBUG << "Reading a token: "; try - { -]b4_lex_symbol_if( -[ yyla = b4_function_call([yylex], [symbol_type], - m4_ifdef([b4_lex_param], b4_lex_param));], -[ yyla.type = yytranslate_ (b4_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)));])[ - } + {]b4_token_ctor_if([[ + symbol_type yylookahead (]b4_lex[); + yyla.move (yylookahead);]], [[ + yyla.type = yytranslate_ (]b4_lex[);]])[ + } catch (const syntax_error& yyexc) - { - error (yyexc); - goto yyerrlab1; - } + { + error (yyexc); + goto yyerrlab1; + } yyempty = false; } YY_SYMBOL_PRINT ("Next token is", yyla); @@ -745,7 +782,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type) goto yydefault; - /* Reduce or error. */ + // Reduce or error. yyn = yytable_[yyn]; if (yyn <= 0) { @@ -755,15 +792,14 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ goto yyreduce; } - /* Discard the token being shifted. */ + // Discard the token being shifted. yyempty = true; - /* Count tokens shifted since error; after three, turn off error - status. */ + // Count tokens shifted since error; after three, turn off error status. if (yyerrstatus_) --yyerrstatus_; - /* Shift the lookahead token. */ + // Shift the lookahead token. yypush_ ("Shifting", yyn, yyla); goto yynewstate; @@ -807,40 +843,25 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ // Perform the reduction. YY_REDUCE_PRINT (yyn); try - { - switch (yyn) { + switch (yyn) + { ]b4_user_actions[ - default: - break; + default: + break; + } } - } catch (const syntax_error& yyexc) - { - error (yyexc); - YYERROR; - } + { + error (yyexc); + YYERROR; + } YY_SYMBOL_PRINT ("-> $$ =", yylhs); -]b4_variant_if([[ - // Destroy the rhs symbols. - for (int i = 0; i < yylen; ++i) - // 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 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_ (YY_NULL, yystack_[i]);]])[ - yypop_ (yylen); yylen = 0; YY_STACK_PRINT (); - /* Shift the result of the reduction. */ + // Shift the result of the reduction. yypush_ (YY_NULL, yylhs); goto yynewstate; @@ -848,7 +869,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: - /* If not already recovering from an error, report this error. */ + // If not already recovering from an error, report this error. if (!yyerrstatus_) { ++yynerrs_; @@ -864,7 +885,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ /* If just tried and failed to reuse lookahead token after an error, discard it. */ - /* Return failure if at end of input. */ + // Return failure if at end of input. if (yyla.type == yyeof_) YYABORT; else if (!yyempty) @@ -874,8 +895,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ } } - /* Else will try to reuse lookahead token after shifting the error - token. */ + // Else will try to reuse lookahead token after shifting the error token. goto yyerrlab1; @@ -891,8 +911,9 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ goto yyerrorlab;]b4_locations_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 + YY_SYMBOL_PRINT ("Error: discarding", yylhs); + yylhs.~stack_symbol_type();]])[ + /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ yypop_ (yylen); yylen = 0; @@ -902,7 +923,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: - yyerrstatus_ = 3; /* Each real token shifted decrements this. */ + yyerrstatus_ = 3; // Each real token shifted decrements this. { stack_symbol_type error_token; for (;;) @@ -932,18 +953,18 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ yyerror_range[2].location = yyla.location; YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);]])[ - /* Shift the error token. */ + // Shift the error token. error_token.state = yyn; yypush_ ("Shifting", error_token); } goto yynewstate; - /* Accept. */ + // Accept. yyacceptlab: yyresult = 0; goto yyreturn; - /* Abort. */ + // Abort. yyabortlab: yyresult = 1; goto yyreturn; @@ -952,10 +973,10 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ if (!yyempty) yy_destroy_ ("Cleanup: discarding lookahead", yyla); - /* Do not reclaim the symbols of the rule which action triggered + /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ yypop_ (yylen); - while (yystack_.size () != 1) + while (1 < yystack_.size ()) { yy_destroy_ ("Cleanup: popping", yystack_[0]); yypop_ (); @@ -963,6 +984,23 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ return yyresult; } + catch (...) + { + YYCDEBUG << "Exception caught: cleaning lookahead and stack" + << std::endl; + // Do not try to display the values of the reclaimed symbols, + // as their printer might throw an exception. + if (!yyempty) + yy_destroy_ (YY_NULL, yyla); + + while (1 < yystack_.size ()) + { + yy_destroy_ (YY_NULL, yystack_[0]); + yypop_ (); + } + throw; + } + } void ]b4_parser_class_name[::error (const syntax_error& yyexc) @@ -974,8 +1012,8 @@ 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([state_type yystate, int yytoken], - [int, int])[) +b4_error_verbose_if([state_type yystate, symbol_number_type yytoken], + [state_type, symbol_number_type])[) const {]b4_error_verbose_if([[ std::string yyres; // Number of reported tokens (one for the "unexpected", one per @@ -1021,7 +1059,7 @@ b4_error_verbose_if([state_type yystate, int yytoken], 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. */ + // Stay within bounds of both yycheck and yytname. int yychecklim = yylast_ - yyn + 1; int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_; for (int yyx = yyxbegin; yyx < yyxend; ++yyx) @@ -1077,8 +1115,8 @@ b4_error_verbose_if([state_type yystate, int yytoken], ]b4_parser_tables_define[ ]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. */ + // YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + // First, the terminals, then, starting at \a yyntokens_, nonterminals. const char* const ]b4_parser_class_name[::yytname_[] = { @@ -1107,18 +1145,20 @@ b4_error_verbose_if([state_type yystate, int yytoken], { unsigned int yylno = yyrline_[yyrule]; int yynrhs = yyr2_[yyrule]; - /* Print the symbols being reduced, and their result. */ + // Print the symbols being reduced, and their result. *yycdebug_ << "Reducing stack by rule " << yyrule - 1 << " (line " << yylno << "):" << std::endl; - /* The symbols being reduced. */ + // The symbols being reduced. for (int yyi = 0; yyi < yynrhs; yyi++) YY_SYMBOL_PRINT (" $" << yyi + 1 << " =", ]b4_rhs_data(yynrhs, yyi + 1)[); } #endif // ]b4_api_PREFIX[DEBUG -]b4_lex_symbol_if([], [b4_yytranslate_define])[ +]b4_token_ctor_if([], [b4_yytranslate_define])[ ]b4_namespace_close[ ]b4_epilogue[]dnl -m4_divert_pop(0) +b4_output_end() + + m4_popdef([b4_copyright_years])dnl