X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/28427f57ceb6f70c3a84696a9275c60ed72d1f52..56441943d0c6e6685368626b31342a81b129f143:/data/lalr1.cc diff --git a/data/lalr1.cc b/data/lalr1.cc index 3d6bdca9..37522aa3 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -22,7 +22,7 @@ m4_include(b4_pkgdatadir/[c++.m4]) # -------------------------------------------------------------- # Declare "parser::yy_" which contents is CONTENT. m4_define([b4_integral_parser_table_declare], -[m4_ifval([$3], [b4_c_comment([$3], [ ]) +[m4_ifval([$3], [b4_comment([$3], [ ]) ])dnl static const b4_int_type_for([$2]) yy$1_[[]];dnl ]) @@ -120,14 +120,9 @@ m4_pushdef([b4_copyright_years], m4_define([b4_parser_class_name], [b4_percent_define_get([[parser_class_name]])]) -# The header is mandatory. -b4_defines_if([], - [b4_fatal([b4_skeleton[: using %%defines is mandatory]])]) - -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])]) @@ -138,21 +133,24 @@ 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 +# include ]b4_defines_if([[ # include "stack.hh" -]b4_locations_if([b4_percent_define_ifdef([[location_type]], [], - [[# include "location.hh"]])])[ - -]b4_variant_if([b4_namespace_open -b4_variant_define -b4_namespace_close])[ +]b4_bison_locations_if([[# include "location.hh"]])])[ ]b4_YYDEBUG_define[ ]b4_namespace_open[ +]b4_defines_if([], +[b4_stack_define +b4_bison_locations_if([b4_position_define +b4_location_define])])[ + +]b4_variant_if([b4_variant_define])[ + /// A Bison parser. class ]b4_parser_class_name[ { @@ -238,7 +236,7 @@ b4_namespace_close])[ #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); + static inline token_number_type yytranslate_ (]b4_token_ctor_if([token_type], [int])[ t); #if ]b4_api_PREFIX[DEBUG /// \brief Display a symbol type, value and location. @@ -268,7 +266,7 @@ b4_namespace_close])[ inline stack_symbol_type (); /// Constructor. - inline stack_symbol_type (]b4_args([state_type s], + inline stack_symbol_type (]b4_join([state_type s], [const semantic_type& v], b4_locations_if([const location_type& l]))[); @@ -319,7 +317,7 @@ b4_namespace_close])[ ]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[ @@ -336,7 +334,8 @@ b4_public_types_define])[ # We do want M4 expansion after # for CPP macros. m4_changecom() -m4_divert_push(0)dnl +b4_defines_if( +[m4_divert_push(0)dnl @output(b4_spec_defines_file@)@ b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++]) [ @@ -350,7 +349,11 @@ b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++]) ]b4_cpp_guard_open([b4_spec_defines_file])[ ]b4_shared_declarations[ ]b4_cpp_guard_close([b4_spec_defines_file]) -@output(b4_parser_file_name@)@ +b4_output_end() +]) + + +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], [], @@ -363,7 +366,8 @@ m4_if(b4_prefix, [yy], [], ]b4_null_define[ -#include "@basename(]b4_spec_defines_file[@)" +]b4_defines_if([[#include "@basename(]b4_spec_defines_file[@)"]], + [b4_shared_declarations])[ /* User implementation prologue. */ ]b4_user_post_prologue[ @@ -492,7 +496,7 @@ m4_if(b4_prefix, [yy], [], | 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 () @@ -501,7 +505,7 @@ m4_if(b4_prefix, [yy], [], { } - ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (]b4_args( + ]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]))[) @@ -567,13 +571,13 @@ m4_if(b4_prefix, [yy], [], if (m) YY_SYMBOL_PRINT (m, sym); ]b4_variant_if( -[[ yystack_.push (stack_symbol_type (]b4_args( +[[ 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_args( +[[ yystack_.push (stack_symbol_type (]b4_join( [s], [sym.value], b4_locations_if([sym.location]))[));]])[ @@ -585,7 +589,7 @@ m4_if(b4_prefix, [yy], [], if (m) YY_SYMBOL_PRINT (m, s); ]b4_variant_if( -[[ yystack_.push (stack_symbol_type (]b4_args( +[[ yystack_.push (stack_symbol_type (]b4_join( [s.state], [semantic_type()], b4_locations_if([s.location]))[)); @@ -655,11 +659,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; @@ -675,6 +679,10 @@ 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], [ @@ -713,20 +721,20 @@ b4_dollar_popdef])[]dnl { YYCDEBUG << "Reading a token: "; try - { -]b4_lex_symbol_if( -[ yyla = b4_c_function_call([yylex], [symbol_type], + { +]b4_token_ctor_if( +[ yyla = b4_function_call([yylex], [symbol_type], m4_ifdef([b4_lex_param], b4_lex_param));], -[ yyla.type = yytranslate_ (b4_c_function_call([yylex], [int], +[ 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)));])[ - } + } catch (const syntax_error& yyexc) - { - error (yyexc); - goto yyerrlab1; - } + { + error (yyexc); + goto yyerrlab1; + } yyempty = false; } YY_SYMBOL_PRINT ("Next token is", yyla); @@ -799,19 +807,19 @@ 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. @@ -844,7 +852,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ if (!yyerrstatus_) { ++yynerrs_; - error (]b4_args(b4_locations_if([yyla.location]), + error (]b4_join(b4_locations_if([yyla.location]), [[yysyntax_error_ (yystack_[0].state, yyempty ? yyempty_ : yyla.type)]])[); } @@ -947,7 +955,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ yypop_ (yylen); - while (yystack_.size () != 1) + while (1 < yystack_.size ()) { yy_destroy_ ("Cleanup: popping", yystack_[0]); yypop_ (); @@ -955,11 +963,28 @@ 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) { - error (]b4_args(b4_locations_if([yyexc.location]), + error (]b4_join(b4_locations_if([yyexc.location]), [[yyexc.what()]])[); } @@ -1109,8 +1134,10 @@ b4_error_verbose_if([state_type yystate, int yytoken], } #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