X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/59c544c2683a1ce534404a4891b7e3435e3a242c..4af4348a3f5f6b5c4e537edd09f5fe9cf30e9eb6:/data/lalr1-fusion.cc diff --git a/data/lalr1-fusion.cc b/data/lalr1-fusion.cc index 48cefdd9..f2659fb9 100644 --- a/data/lalr1-fusion.cc +++ b/data/lalr1-fusion.cc @@ -52,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, @@ -85,13 +85,13 @@ m4_define([b4_symbol_action_], ])]) -# b4_symbol_variant(YYTYPE, YYVAL, ACTION) -# ---------------------------------------- +# b4_symbol_variant(YYTYPE, YYVAL, ACTION, [ARGS]) +# ------------------------------------------------ # Run some ACTION ("build", or "destroy") on YYVAL of symbol type # YYTYPE. m4_define([b4_symbol_variant], [m4_pushdef([b4_dollar_dollar], - [$2.$3<$][3>()])dnl + [$2.$3<$][3>(m4_shift3($@))])dnl switch ($1) { m4_map([b4_symbol_action_], m4_defn([b4_type_names])) @@ -132,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]])]) @@ -148,8 +151,7 @@ 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]) +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. */ @@ -184,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& @@ -208,6 +202,32 @@ dnl FIXME: This is wrong, we want computed header guards. return reinterpret_cast(buffer); } + /// Swap the content with \a other. + template + inline void + swap(variant& other) + { + std::swap(as(), other.as()); + } + + /// Assign the content of \a other to this. + /// Destroys \a other. + template + inline void + build(variant& other) + { + build(); + swap(other); + } + + /// 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]; }; @@ -479,8 +499,7 @@ 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]) +b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++]) b4_percent_code_get([[top]])[]dnl m4_if(b4_prefix, [yy], [], [ @@ -682,7 +701,10 @@ do { \ ]b4_parser_class_name[::yypush_ (state_type s, semantic_type& v, const location_type& l) { - yystack_.push (data_type (s, v, l)); +]b4_variant_if( +[[ yystack_.push (data_type (s, semantic_type(), l)); + ]b4_symbol_variant([[yystos_[s]]], [[yystack_[0].value]], [build], [v])], +[ yystack_.push (data_type (s, v, l));])[ } void @@ -1210,11 +1232,9 @@ b4_error_verbose_if([ tok])[) ]b4_namespace_close[ -]b4_epilogue -dnl +]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_copyright([Stack handling for Bison parsers in C++])[ #ifndef BISON_STACK_HH # define BISON_STACK_HH @@ -1312,3 +1332,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