X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/8b9c89fb65d758e99602c068e16bfbf109437e42..006a0303009d132faef2bdac7dd92b0212a09bd2:/data/lalr1-fusion.cc?ds=sidebyside diff --git a/data/lalr1-fusion.cc b/data/lalr1-fusion.cc index 3a629aaf..e3cafff8 100644 --- a/data/lalr1-fusion.cc +++ b/data/lalr1-fusion.cc @@ -18,6 +18,17 @@ m4_include(b4_pkgdatadir/[c++.m4]) +# b4_table_define(TABLE-NAME, CONTENT) +# ------------------------------------ +# Define "parser::yy_" which contents is CONTENT. +m4_define([b4_table_define], +[const b4_int_type_for([$2]) + b4_parser_class_name::yy$1_[[]] = + { + $2 + }dnl +]) + # How the semantic value is extracted when using variants. b4_variant_if([ # b4_symbol_value(VAL, [TYPE]) @@ -41,7 +52,7 @@ m4_define([b4_rhs_value], # Expansion of @NUM, where the current rule has RULE-LENGTH symbols # on RHS. m4_define([b4_rhs_location], -[(yystack_@{($1) - ($2)@}.location)]) +[yystack_@{($1) - ($2)@}.location]) # b4_symbol_actions(FILENAME, LINENO, @@ -121,6 +132,9 @@ m4_define([b4_char_sizeof], ]) +m4_pushdef([b4_copyright_years], + [2002, 2003, 2004, 2005, 2006, 2007, 2008]) + m4_define([b4_parser_class_name], [b4_percent_define_get([[parser_class_name]])]) @@ -136,9 +150,8 @@ m4_include(b4_pkgdatadir/[location.cc]) m4_changecom() m4_divert_push(0)dnl b4_defines_if( -[@output(b4_spec_defines_file@) -b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++], - [2002, 2003, 2004, 2005, 2006, 2007, 2008]) +[@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. */ @@ -173,14 +186,6 @@ dnl FIXME: This is wrong, we want computed header guards. return *new (buffer) T; } - /// Destroy the stored \a T. - template - inline void - destroy() - { - reinterpret_cast(buffer).~T(); - } - /// Accessor to a built \a T. template inline T& @@ -197,6 +202,14 @@ dnl FIXME: This is wrong, we want computed header guards. return reinterpret_cast(buffer); } + /// Destroy the stored \a T. + template + inline void + destroy() + { + as().~T(); + } + /// A buffer large enough to store any of the semantic values. char buffer[S]; }; @@ -309,8 +322,7 @@ m4_ifdef([b4_stype], /// Generate an error message. /// \param state the state where the error occurred. /// \param tok the lookahead token. - virtual std::string yysyntax_error_ (int yystate]dnl -b4_error_verbose_if([, int tok])[); + virtual std::string yysyntax_error_ (int yystate, int tok); #if YYDEBUG /// \brief Report a symbol value on the debug stream. @@ -376,10 +388,8 @@ b4_error_verbose_if([, int tok])[); #endif #if YYDEBUG - /// A type to store symbol numbers and -1. - typedef ]b4_int_type_for([b4_rhs])[ rhs_number_type; /// A `-1'-separated list of the rules' RHS. - static const rhs_number_type yyrhs_[]; + static const ]b4_int_type_for([b4_rhs])[ yyrhs_[]; /// For each rule, the index of the first RHS symbol in \a yyrhs_. static const ]b4_int_type_for([b4_prhs])[ yyprhs_[]; /// For each rule, its source line number. @@ -470,9 +480,8 @@ b4_percent_code_get([[provides]])[]dnl [#endif /* ! defined PARSER_HEADER_H */] ])dnl -@output(b4_parser_file_name@) -b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++], - [2002, 2003, 2004, 2005, 2006, 2007, 2008]) +@output(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], [], [ @@ -860,10 +869,13 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; else yyval = yystack_@{0@}.value;])[ + // Compute the default @@$. { slice slice (yystack_, yylen); YYLLOC_DEFAULT (yyloc, slice, yylen); } + + // Perform the reduction. YY_REDUCE_PRINT (yyn); switch (yyn) { @@ -873,6 +885,15 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; } YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], yyval, yyloc); +]b4_variant_if([ + // Destroy the lhs symbols. + for (int i = 0; i < yylen; ++i) + { + b4_symbol_variant([[yystos_[yystack_@{i@}.state]]], + [[yystack_@{i@}.value]], + [[destroy]]) + }])dnl +[ yypop_ (yylen); yylen = 0; YY_STACK_PRINT (); @@ -896,8 +917,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; if (!yyerrstatus_) { ++yynerrs_; - error (yylloc, yysyntax_error_ (yystate]dnl -b4_error_verbose_if([, yytoken])[)); + error (yylloc, yysyntax_error_ (yystate, yytoken)); } yyerror_range[0].location = yylloc; @@ -1019,8 +1039,8 @@ b4_error_verbose_if([, yytoken])[)); // Generate an error message. std::string - ]b4_parser_class_name[::yysyntax_error_ (int yystate]dnl -b4_error_verbose_if([, int tok])[) + ]b4_parser_class_name[::yysyntax_error_ (int yystate, int]dnl +b4_error_verbose_if([ tok])[) { std::string res; YYUSE (yystate); @@ -1071,83 +1091,43 @@ b4_error_verbose_if([, int tok])[) /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[; - const ]b4_int_type_for([b4_pact])[ - ]b4_parser_class_name[::yypact_[] = - { - ]b4_pact[ - }; + ]b4_table_define([pact], [b4_pact])[; /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ - const ]b4_int_type_for([b4_defact])[ - ]b4_parser_class_name[::yydefact_[] = - { - ]b4_defact[ - }; + ]b4_table_define([defact], [b4_defact])[; /* YYPGOTO[NTERM-NUM]. */ - const ]b4_int_type_for([b4_pgoto])[ - ]b4_parser_class_name[::yypgoto_[] = - { - ]b4_pgoto[ - }; + ]b4_table_define([pgoto], [b4_pgoto])[; /* YYDEFGOTO[NTERM-NUM]. */ - const ]b4_int_type_for([b4_defgoto])[ - ]b4_parser_class_name[::yydefgoto_[] = - { - ]b4_defgoto[ - }; + ]b4_table_define([defgoto], [b4_defgoto])[; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. */ const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[; - const ]b4_int_type_for([b4_table])[ - ]b4_parser_class_name[::yytable_[] = - { - ]b4_table[ - }; + ]b4_table_define([table], [b4_table])[; /* YYCHECK. */ - const ]b4_int_type_for([b4_check])[ - ]b4_parser_class_name[::yycheck_[] = - { - ]b4_check[ - }; + ]b4_table_define([check], [b4_check])[; /* STOS_[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ - const ]b4_int_type_for([b4_stos])[ - ]b4_parser_class_name[::yystos_[] = - { - ]b4_stos[ - }; + ]b4_table_define([stos], [b4_stos])[; #if YYDEBUG /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding to YYLEX-NUM. */ - const ]b4_int_type_for([b4_toknum])[ - ]b4_parser_class_name[::yytoken_number_[] = - { - ]b4_toknum[ - }; + ]b4_table_define([token_number], [b4_toknum])[; #endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ - const ]b4_int_type_for([b4_r1])[ - ]b4_parser_class_name[::yyr1_[] = - { - ]b4_r1[ - }; + ]b4_table_define([r1], [b4_r1])[; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ - const ]b4_int_type_for([b4_r2])[ - ]b4_parser_class_name[::yyr2_[] = - { - ]b4_r2[ - }; + ]b4_table_define([r2], [b4_r2])[; #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. @@ -1155,32 +1135,20 @@ b4_error_verbose_if([, int tok])[) const char* const ]b4_parser_class_name[::yytname_[] = { - ]b4_tname[ + ]b4_tname[ }; #endif #if YYDEBUG /* YYRHS -- A `-1'-separated list of the rules' RHS. */ - const ]b4_parser_class_name[::rhs_number_type - ]b4_parser_class_name[::yyrhs_[] = - { - ]b4_rhs[ - }; + ]b4_table_define([rhs], [b4_rhs])[; /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ - const ]b4_int_type_for([b4_prhs])[ - ]b4_parser_class_name[::yyprhs_[] = - { - ]b4_prhs[ - }; + ]b4_table_define([prhs], [b4_prhs])[; /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ - const ]b4_int_type_for([b4_rline])[ - ]b4_parser_class_name[::yyrline_[] = - { - ]b4_rline[ - }; + ]b4_table_define([rline], [b4_rline])[; // Print the state stack on the debug stream. void @@ -1221,7 +1189,7 @@ b4_error_verbose_if([, int tok])[) const token_number_type translate_table[] = { - ]b4_translate[ + ]b4_translate[ }; if ((unsigned int) t <= yyuser_token_number_max_) return translate_table[t]; @@ -1243,11 +1211,9 @@ b4_error_verbose_if([, int tok])[) ]b4_namespace_close[ -]b4_epilogue -dnl -@output(b4_dir_prefix[]stack.hh@) -b4_copyright([Stack handling for Bison parsers in C++], - [2002, 2003, 2004, 2005, 2006, 2007, 2008])[ +]b4_epilogue[]dnl +@output(b4_dir_prefix[]stack.hh@)@ +b4_copyright([Stack handling for Bison parsers in C++])[ #ifndef BISON_STACK_HH # define BISON_STACK_HH @@ -1345,3 +1311,4 @@ b4_copyright([Stack handling for Bison parsers in C++], #endif // not BISON_STACK_HH[]dnl ] m4_divert_pop(0) +m4_popdef([b4_copyright_years])dnl