X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/fb7c5b1f23ff4af726b73bee6db669cbdab7de94..9c6a89660e930bf68907fb6141b517378147f38e:/data/lalr1.cc diff --git a/data/lalr1.cc b/data/lalr1.cc index f19df604..86e6fd08 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -42,27 +42,10 @@ m4_define([b4_integral_parser_table_define], # b4_symbol_value_template(VAL, [TYPE]) # ------------------------------------- -# Same as b4_symbol_value, but used in a template method. +# Same as b4_symbol_value, but used in a template method. It makes +# a difference when using variants. m4_copy([b4_symbol_value], [b4_symbol_value_template]) -# How the semantic value is extracted when using variants. -b4_variant_if([ - # b4_symbol_value(VAL, [TYPE]) - # ---------------------------- - m4_define([b4_symbol_value], - [m4_ifval([$2], - [$1.as< $2 >()], - [$1])]) - - # b4_symbol_value_template(VAL, [TYPE]) - # ------------------------------------- - # Same as b4_symbol_value, but used in a template method. - m4_define([b4_symbol_value_template], - [m4_ifval([$2], - [$1.template as< $2 >()], - [$1])]) -]) # b4_variant_if - # b4_lex_symbol_if([IF-YYLEX-RETURNS-A-COMPLETE-SYMBOL], [IF-NOT]) # ---------------------------------------------------------------- @@ -80,14 +63,14 @@ m4_define([b4_assert_if], # -------------------- # Expansion of $$. m4_define([b4_lhs_value], -[b4_symbol_value([yylhs.value], [$1])]) + [b4_symbol_value([yylhs.value], [$1])]) # b4_lhs_location() # ----------------- # Expansion of @$. m4_define([b4_lhs_location], -[yylhs.location]) + [yylhs.location]) # b4_rhs_data(RULE-LENGTH, NUM) @@ -99,7 +82,7 @@ m4_define([b4_rhs_data], # b4_rhs_state(RULE-LENGTH, NUM) -# ----------------------------- +# ------------------------------ # The state corresponding to the symbol #NUM, where the current # rule has RULE-LENGTH symbols on RHS. m4_define([b4_rhs_state], @@ -121,6 +104,7 @@ m4_define([b4_rhs_value], m4_define([b4_rhs_location], [b4_rhs_data([$1], [$2]).location]) + # b4_symbol_action(SYMBOL-NUM, KIND) # ---------------------------------- # Run the action KIND (destructor or printer) for SYMBOL-NUM. @@ -287,60 +271,6 @@ m4_define([b4_symbol_constructor_definitions], b4_symbol_foreach([b4_symbol_constructor_definition_])])]) -# 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 >(m4_shift3($@))])dnl - switch ($1) - { -b4_type_foreach([b4_type_action_])[]dnl - default: - break; - } -m4_popdef([b4_dollar_dollar])dnl -]) - - -# _b4_char_sizeof_counter -# ----------------------- -# A counter used by _b4_char_sizeof_dummy to create fresh symbols. -m4_define([_b4_char_sizeof_counter], -[0]) - -# _b4_char_sizeof_dummy -# --------------------- -# At each call return a new C++ identifier. -m4_define([_b4_char_sizeof_dummy], -[m4_define([_b4_char_sizeof_counter], m4_incr(_b4_char_sizeof_counter))dnl -dummy[]_b4_char_sizeof_counter]) - - -# b4_char_sizeof_(SYMBOL-NUM) -# --------------------------- -# A comment describing this symbol. -m4_define([b4_char_sizeof_], -[ // b4_symbol([$1], [tag]) -]) - -# b4_char_sizeof(SYMBOL-NUMS) -# -------------------------- -# To be mapped on the list of type names to produce: -# -# char dummy1[sizeof(type_name_1)]; -# char dummy2[sizeof(type_name_2)]; -# -# for defined type names. -m4_define([b4_char_sizeof], -[b4_symbol_if([$1], [has_type], -[ -m4_map([b4_char_sizeof_], [$@])dnl - char _b4_char_sizeof_dummy@{sizeof([b4_symbol([$1], [type])])@}; -])]) - - # b4_yytranslate_definition # ------------------------- # Define yytranslate_. Sometimes we want it in the header file, @@ -384,6 +314,8 @@ b4_locations_if( [# Backward compatibility. 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])]) # We do want M4 expansion after # for CPP macros. m4_changecom() @@ -407,104 +339,7 @@ dnl FIXME: This is wrong, we want computed header guards. ]b4_namespace_open[ ]b4_locations_if([ class position; class location;])[ -]b4_variant_if( -[[ - /// A char[S] buffer to store and retrieve objects. - /// - /// Sort of a variant, but does not keep track of the nature - /// of the stored data, since that knowledge is available - /// via the current state. - template - struct variant - {]b4_assert_if([ - /// Whether something is contained. - bool built; -])[ - /// Empty construction. - inline - variant ()]b4_assert_if([ - : built(false)])[ - {} - - /// Instantiate a \a T in here. - template - inline T& - build() - {]b4_assert_if([ - assert(!built); - built = true;])[ - return *new (buffer) T; - } - - /// Instantiate a \a T in here from \a t. - template - inline T& - build(const T& t) - {]b4_assert_if([ - assert(!built); - built = true;])[ - return *new (buffer) T(t); - } - - /// Construct and fill. - template - inline - variant (const T& t)]b4_assert_if([ - : built(true)])[ - { - new (buffer) T(t); - } - - /// Accessor to a built \a T. - template - inline T& - as() - {]b4_assert_if([ - assert(built);])[ - return reinterpret_cast(buffer); - } - - /// Const accessor to a built \a T (for %printer). - template - inline const T& - as() const - {]b4_assert_if([ - assert(built);])[ - 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); - other.destroy(); - } - - /// Destroy the stored \a T. - template - inline void - destroy() - { - as().~T();]b4_assert_if([ - built = false;])[ - } - - /// A buffer large enough to store any of the semantic values. - char buffer[S]; - }; -]])[ +]b4_variant_if([b4_variant_definition])[ ]b4_namespace_close[ ]b4_locations_if([#include "location.hh"])[ @@ -1196,7 +1031,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ /* Variants are always initialized to an empty instance of the correct type. The default $$=$1 rule is NOT applied when using variants */ - ]b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])[],[ + ]b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build]),[ /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, use the top of the stack. @@ -1234,16 +1069,18 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ yylhs.state = yystate; YY_SYMBOL_PRINT ("-> $$ =", yylhs); ]b4_variant_if([[ - // Destroy the lhs symbols. + // Destroy the rhs symbols. for (int i = 0; i < yylen; ++i) - // Destroy a variant which value may have be swapped with - // yylhs.value. The value of yylhs.value (hence maybe one of - // these lhs symbols) depends on what does the default - // contruction for this type. In the case of pointers for - // instance, nothing is done, so the value is junk. Therefore - // do not try to report the content in the debug trace, it's - // junk. Hence yymsg = 0. Besides, that keeps exactly the same - // traces as with the other Bison skeletons. + // 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 + // 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]);]])[ yypop_ (yylen); @@ -1254,9 +1091,9 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ yypush_ (0, yylhs); goto yynewstate; - /*------------------------------------. - | yyerrlab -- here on detecting error | - `------------------------------------*/ + /*--------------------------------------. + | yyerrlab -- here on detecting error. | + `--------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus_) @@ -1393,7 +1230,8 @@ b4_error_verbose_if([int yystate, int yytoken], int yychecklim = yylast_ - yyn + 1; int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_; - // Number of "expected" tokens. + // Number of reported tokens (one for the "unexpected", one per + // "expected"). size_t yycount = 0; // Its maximum. enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; @@ -1494,105 +1332,6 @@ b4_error_verbose_if([int yystate, int yytoken], ]b4_lex_symbol_if([], [b4_yytranslate_definition])[ ]b4_namespace_close[ - ]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 - -#include - -]b4_namespace_open[ - template > - class stack - { - public: - - // Hide our reversed order. - typedef typename S::reverse_iterator iterator; - typedef typename S::const_reverse_iterator const_iterator; - - stack () : seq_ () - { - } - - stack (unsigned int n) : seq_ (n) - { - } - - inline - T& - operator [] (unsigned int i) - { - return seq_[i]; - } - - inline - const T& - operator [] (unsigned int i) const - { - return seq_[i]; - } - - inline - void - push (const T& t) - { - seq_.push_front (t); - } - - inline - void - pop (unsigned int n = 1) - { - for (; n; --n) - seq_.pop_front (); - } - - inline - typename S::size_type - size () const - { - return seq_.size (); - } - - inline const_iterator begin () const { return seq_.rbegin (); } - inline const_iterator end () const { return seq_.rend (); } - - private: - /// The wrapped container. - S seq_; - }; - - /// Present a slice of the top of a stack. - template > - class slice - { - public: - - slice (const S& stack, - unsigned int range) : stack_ (stack), - range_ (range) - { - } - - inline - const T& - operator [] (unsigned int i) const - { - return stack_[range_ - i]; - } - - private: - - const S& stack_; - unsigned int range_; - }; -]b4_namespace_close[ - -#endif // not BISON_STACK_HH[]dnl -] m4_divert_pop(0) m4_popdef([b4_copyright_years])dnl