X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/9380cfd0083f8cdf845600b08e6b30f77e5e9e29..2873fdf8b1f91a9cbc8d258367c920eb637a0099:/data/lalr1.cc diff --git a/data/lalr1.cc b/data/lalr1.cc index 6a67c5b8..4915caa2 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -29,6 +29,11 @@ m4_define([b4_table_define], }dnl ]) +# b4_symbol_value_template(VAL, [TYPE]) +# ------------------------------------- +# Same as b4_symbol_value, but used in a template method. +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]) @@ -37,28 +42,86 @@ b4_variant_if([ [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_assert_if([IF-ASSERTIONS-ARE-USED], [IF-NOT]) -# ---------------------------------------------------- +# ------------------------------------------------ m4_define([b4_assert_if], [b4_percent_define_ifdef([[assert]], [$1], [$2])]) +# b4_lhs_value([TYPE]) +# -------------------- +# Expansion of $$. +m4_define([b4_lhs_value], +[b4_symbol_value([yylhs.value], [$1])]) + + +# b4_lhs_location() +# ----------------- +# Expansion of @$. +m4_define([b4_lhs_location], +[yylhs.location]) + + +# b4_rhs_data(RULE-LENGTH, NUM) +# ----------------------------- +# Return the data corresponding to the symbol #NUM, where the current +# rule has RULE-LENGTH symbols on RHS. +m4_define([b4_rhs_data], + [yystack_@{($1) - ($2)@}]) + + +# 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], + [b4_rhs_data([$1], [$2]).state]) + + # b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) # -------------------------------------- # Expansion of $NUM, where the current rule has RULE-LENGTH # symbols on RHS. m4_define([b4_rhs_value], - [b4_symbol_value([yystack_@{($1) - ($2)@}.value], [$3])]) + [b4_symbol_value([b4_rhs_data([$1], [$2]).value], [$3])]) + # b4_rhs_location(RULE-LENGTH, NUM) # --------------------------------- # Expansion of @NUM, where the current rule has RULE-LENGTH symbols # on RHS. m4_define([b4_rhs_location], -[yystack_@{($1) - ($2)@}.location]) + [b4_rhs_data([$1], [$2]).location]) + + +# b4_symbol(NUM, FIELD) +# --------------------- +# Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if +# undefined. +m4_define([b4_symbol], +[m4_indir([b4_symbol($1, $2)])]) + + +# b4_symbol_if(NUM, FIELD, IF-TRUE, IF-FALSE) +# ------------------------------------------- +# If FIELD about symbol #NUM is 1 expand IF-TRUE, if is 0, expand IF-FALSE. +# Otherwise an error. +m4_define([b4_symbol_if], +[m4_case(b4_symbol([$1], [$2]), + [1], [$3], + [0], [$4], + [m4_fatal([$0: field $2 of $1 is not a Boolean:] b4_symbol([$1], [$2]))])]) # b4_symbol_actions(FILENAME, LINENO, @@ -68,8 +131,8 @@ m4_define([b4_rhs_location], # Same as in C, but using references instead of pointers. m4_define([b4_symbol_actions], [m4_pushdef([b4_dollar_dollar], - [b4_symbol_value([yyvalue], [$6])])dnl -m4_pushdef([b4_at_dollar], [yylocation])dnl + [b4_symbol_value_template([yysym.value], [$6])])dnl +m4_pushdef([b4_at_dollar], [yysym.location])dnl case $4: // $3 b4_syncline([$2], [$1]) $5; @@ -80,17 +143,109 @@ m4_popdef([b4_dollar_dollar])dnl ]) -# b4_symbol_action_(SYMBOL-TAG, SYMBOL-NUM, SYMBOL-TYPENAME) -# ---------------------------------------------------------- -# Invoke b4_dollar_dollar(SYMBOL_TYPENAME) for each symbol. -m4_define([b4_symbol_action_], -[m4_ifval($3, -[ case $2: // $1 - b4_dollar_dollar($@); +# b4_symbol_case_(SYMBOL-NUM) +# --------------------------- +# Issue a "case NUM" for SYMBOL-NUM. +m4_define([b4_symbol_case_], +[ case b4_symbol([$1], [number]): // b4_symbol([$1], [tag]) +]) + + +# b4_type_action_(NUMS) +# --------------------- +# Run actions for the symbol NUMS that all have the same type-name. +# Skip NUMS that have no type-name. +m4_define([b4_type_action_], +[b4_symbol_if([$1], [has_type_name], +[m4_map([b4_symbol_case_], [$@])[]dnl + b4_dollar_dollar([b4_symbol([$1], [number])], + [b4_symbol([$1], [tag])], + [b4_symbol([$1], [type_name])]); break; + ])]) +# b4_symbol_constructor_declaration_(SYMBOL-NUMBERS) +# ---------------------------------------------------- +# Declare the overloaded version of make_symbol for the (common) type of +# these SYMBOL-NUMBERS. Use at class-level. +m4_define([b4_symbol_constructor_declaration_], +[ template + static inline symbol_type + make_symbol (b4_symbol_if([$1], [has_type_name], + [const b4_symbol([$1], [type_name])& v, ])dnl +const location_type& l); + +]) + +# b4_symbol_constructor_declarations +# ---------------------------------- +# Declare the overloaded versions of make_symbol for all the value types. +# Use at class-level. +m4_define([b4_symbol_constructor_declarations], +[b4_variant_if([ + // Declaration of make_symbol for each value type. +m4_map([b4_symbol_constructor_declaration_], m4_defn([b4_type_names]))])]) + + + +# b4_symbol_constructor_specialization_(SYMBOL-NUMBER) +# ---------------------------------------------------- +# Declare the specialization of make_symbol for this each SYMBOL-NUMBER. +# Specializations cannot be declared at class-level, this must be done +# at namespace-level. +m4_define([b4_symbol_constructor_specialization_], +[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [tag_is_id], +[ template <> + inline + b4_parser_class_name::symbol_type + b4_parser_class_name::make_symbol (dnl +b4_symbol_if([$1], [has_type_name], + [const b4_symbol([$1], [type_name])& v, ])dnl +const b4_parser_class_name::location_type& l); +])])]) + +# b4_symbol_constructor_specializations +# ------------------------------------- +# Declare specializations of make_symbol. +m4_define([b4_symbol_constructor_specializations], +[b4_variant_if([ + // Specializations of make_symbol for each symbol type. +m4_map([b4_symbol_constructor_specialization_], + m4_defn([b4_symbol_numbers]))])dnl +]) + + + +# b4_symbol_constructor_definition_(SYMBOL-NUMBER) +# ------------------------------------------------ +# Define make_symbol for this SYMBOL-NUMBER. +m4_define([b4_symbol_constructor_definition_], +[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [tag_is_id], +[ template <> + b4_parser_class_name::symbol_type + b4_parser_class_name::make_symbol (dnl +b4_symbol_if([$1], [has_type_name], + [const b4_symbol([$1], [type_name])& v, ])dnl +const location_type& l) + { + return symbol_type (yytranslate_ (token::b4_symbol([$1], [tag])),dnl + b4_symbol_if([$1], [has_type_name], [v, ])l); + } + +])])]) + + +# b4_symbol_constructor_declarations +# ---------------------------------- +# Define the overloaded versions of make_symbol for all the value types. +m4_define([b4_symbol_constructor_definitions], +[b4_variant_if( +[ // Implementation of make_symbol for each symbol type. +m4_map([b4_symbol_constructor_definition_], m4_defn([b4_symbol_numbers]))])]) + + # b4_symbol_variant(YYTYPE, YYVAL, ACTION, [ARGS]) # ------------------------------------------------ # Run some ACTION ("build", or "destroy") on YYVAL of symbol type @@ -100,9 +255,9 @@ m4_define([b4_symbol_variant], [$2.$3<$][3>(m4_shift3($@))])dnl switch ($1) { -m4_map([b4_symbol_action_], m4_defn([b4_type_names])) - default: - break; +m4_map([b4_type_action_], m4_defn([b4_type_names]))[]dnl + default: + break; } m4_popdef([b4_dollar_dollar])dnl ]) @@ -122,8 +277,8 @@ m4_define([_b4_char_sizeof_dummy], dummy[]_b4_char_sizeof_counter]) -# b4_char_sizeof(SYMBOL-TAG, SYMBOL-NUM, SYMBOL-TYPENAME) -# ------------------------------------------------------- +# b4_char_sizeof(SYMBOL-NUM) +# -------------------------- # To be mapped on the list of type names to produce: # # char dummy1[sizeof(type_name_1)]; @@ -132,9 +287,9 @@ dummy[]_b4_char_sizeof_counter]) # for defined type names. # $3 is doubly-quoted, do not quote it again. m4_define([b4_char_sizeof], -[m4_ifval($3, +[m4_ifval(b4_symbol([$1], [type_name]), [ - char _b4_char_sizeof_dummy@{sizeof($3)@}; // $1])dnl + char _b4_char_sizeof_dummy@{sizeof([b4_symbol([$1], [type_name])])@}; // b4_symbol([$1], [tag])])dnl ]) @@ -187,11 +342,12 @@ dnl FIXME: This is wrong, we want computed header guards. {]b4_assert_if([ /// Whether something is contained. bool built; - - /// Initially uninitialized. - variant () - : built(false) - {}])[ +])[ + /// Empty construction. + inline + variant ()]b4_assert_if([ + : built(false)])[ + {} /// Instantiate a \a T in here. template @@ -203,6 +359,25 @@ dnl FIXME: This is wrong, we want computed header guards. 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& @@ -304,7 +479,7 @@ do { \ ]b4_variant_if( [ /// An auxiliary type to compute the largest semantic type. union union_type - {]m4_map([b4_char_sizeof], m4_defn([b4_type_names]))[ + {]m4_map([b4_char_sizeof], m4_defn([b4_symbol_numbers]))[ }; /// Symbol semantic values. @@ -363,23 +538,6 @@ m4_ifdef([b4_stype], /// \param tok the lookahead token. virtual std::string yysyntax_error_ (int yystate, int tok); -#if YYDEBUG - /// \brief Report a symbol value on the debug stream. - /// \param yytype The token type. - /// \param yyvalue Its semantic value. - /// \param yylocation Its location. - virtual void yy_symbol_value_print_ (int yytype, - const semantic_type& yyvalue, - const location_type& yylocation); - /// \brief Report a symbol on the debug stream. - /// \param yytype The token type. - /// \param yyvalue Its semantic value. - /// \param yylocation Its location. - virtual void yy_symbol_print_ (int yytype, - const semantic_type& yyvalue, - const location_type& yylocation); -#endif - /// State numbers. typedef int state_type; @@ -427,10 +585,6 @@ m4_ifdef([b4_stype], #endif #if YYDEBUG - /// A `-1'-separated list of the rules' RHS. - 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. static const ]b4_int_type_for([b4_rline])[ yyrline_[]; /// For each scanner token number, its symbol number. @@ -446,30 +600,25 @@ m4_ifdef([b4_stype], #endif /// Convert a scanner token number \a t to a symbol number. - token_number_type yytranslate_ (int t); + static inline token_number_type yytranslate_ (int t); - /// \brief Reclaim the memory associated to a symbol. - /// \param yymsg Why this token is reclaimed. - /// If null, nothing is printed at all. - /// \param yytype The symbol type. - /// \param yyvalue Its semantic value. - /// \param yylocation Its location. - inline void yydestruct_ (const char* yymsg, - int yytype, - semantic_type& yyvalue, - location_type& yylocation); - - /// Element of the stack: a state and its attributes. - struct data_type + /// A complete symbol, with its type. + template + struct symbol_base_type { /// Default constructor. - data_type (); + inline symbol_base_type (); /// Constructor. - data_type (state_type s, const semantic_type& v, const location_type& l); + inline symbol_base_type (const location_type& l); + inline symbol_base_type (const semantic_type& v, const location_type& l); - /// The state. - state_type state; + /// Return this with its exact type. + const Exact& self () const; + Exact& self (); + + /// Return the type of this symbol. + int type_get () const; /// The semantic value. semantic_type value; @@ -478,8 +627,72 @@ m4_ifdef([b4_stype], location_type location; }; +#if YYDEBUG + /// \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; +#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; + + public: + /// Element of the stack: a state and its attributes. + struct symbol_type : symbol_base_type + { + /// The parent class. + typedef symbol_base_type super_type; + + /// Default constructor. + inline symbol_type (); + + /// Constructor. + inline symbol_type (int t, + const semantic_type& v, const location_type& l); + + inline symbol_type (int t, + const location_type& l); + + /// The symbol type. + int type; + + /// Return the type corresponding to this state. + inline int type_get_ () const; + }; + +]b4_symbol_constructor_declarations[ + + private: + /// Element of the stack: a state and its attributes. + struct stack_symbol_type : symbol_base_type + { + /// The parent class. + typedef symbol_base_type super_type; + + /// Default constructor. + inline stack_symbol_type (); + + /// Constructor. + inline stack_symbol_type (state_type s, + const semantic_type& v, const location_type& l); + + /// The state. + state_type state; + + /// Return the type corresponding to this state. + inline int type_get_ () const; + }; + /// Stack type. - typedef stack stack_type; + typedef stack stack_type; /// The stack. stack_type yystack_; @@ -487,30 +700,37 @@ m4_ifdef([b4_stype], /// Push a new state on the stack. /// \param m a debug message to display /// if null, no trace is output. - /// \param s the state entered - /// \param v semantic value - /// \param l location - /// \warning the contents of \a v is stolen. - inline void yypush_ (const char* m, state_type s, - semantic_type& v, const location_type& l); + /// \param s the symbol + /// \warning the contents of \a s.value is stolen. + inline 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 + /// if null, no trace is output. + /// \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); /// Pop \a n symbols the three stacks. inline void yypop_ (unsigned int n = 1); /* Constants. */ - static const int yyeof_; - /* LAST_ -- Last index in TABLE_. */ - static const int yylast_; - static const int yynnts_; - static const int yyempty_; - static const int yyfinal_; - static const int yyterror_; - static const int yyerrcode_; - static const int yyntokens_; - static const unsigned int yyuser_token_number_max_; - static const token_number_type yyundef_token_; + enum + { + yyeof_ = 0, + yylast_ = ]b4_last[, //< Last index in yytable_. + yynnts_ = ]b4_nterms_number[, //< Number of nonterminal symbols. + yyempty_ = -2, + yyfinal_ = ]b4_final_state_number[, //< Termination state number. + yyterror_ = 1, + yyerrcode_ = 256, + yyntokens_ = ]b4_tokens_number[, //< Number of tokens. + }; + ]b4_parse_param_vars[ }; +]b4_symbol_constructor_specializations[ ]b4_namespace_close[ ]b4_percent_define_flag_if([[global_tokens_and_yystype]], @@ -564,14 +784,14 @@ b4_percent_code_get[]dnl /* A pseudo ostream that takes yydebug_ into account. */ # define YYCDEBUG if (yydebug_) (*yycdebug_) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ - do { \ - if (yydebug_) \ - { \ - *yycdebug_ << Title << ' '; \ - yy_symbol_print_ ((Type), (Value), (Location)); \ - *yycdebug_ << std::endl; \ - } \ +# define YY_SYMBOL_PRINT(Title, Symbol) \ + do { \ + if (yydebug_) \ + { \ + *yycdebug_ << Title << ' '; \ + yy_print_ (*yycdebug_, Symbol); \ + *yycdebug_ << std::endl; \ + } \ } while (false) # define YY_REDUCE_PRINT(Rule) \ @@ -589,9 +809,9 @@ b4_percent_code_get[]dnl #else /* !YYDEBUG */ # define YYCDEBUG if (false) std::cerr -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) static_cast(0) -# define YY_REDUCE_PRINT(Rule) static_cast(0) -# define YY_STACK_PRINT() static_cast(0) +# define YY_SYMBOL_PRINT(Title, Symbol) static_cast(0) +# define YY_REDUCE_PRINT(Rule) static_cast(0) +# define YY_STACK_PRINT() static_cast(0) #endif /* !YYDEBUG */ @@ -659,86 +879,169 @@ b4_percent_code_get[]dnl { } -#if YYDEBUG - /*--------------------------------. - | Print this symbol on YYOUTPUT. | - `--------------------------------*/ - inline void - ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype, - const semantic_type& yyvalue, const location_type& yylocation) + /*---------------. + | Symbol types. | + `---------------*/ + + // symbol_base_type. + template + ]b4_parser_class_name[::symbol_base_type::symbol_base_type () + : value() + , location() { - YYUSE (yylocation); - YYUSE (yyvalue); - switch (yytype) - { - ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl -[ default: - break; - } } + template + ]b4_parser_class_name[::symbol_base_type::symbol_base_type (const location_type& l) + : value() + , location(l) + { + } - void - ]b4_parser_class_name[::yy_symbol_print_ (int yytype, - const semantic_type& yyvalue, const location_type& yylocation) + template + ]b4_parser_class_name[::symbol_base_type::symbol_base_type (const semantic_type& v, const location_type& l) + : value(v) + , location(l) { - *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm") - << ' ' << yytname_[yytype] << " (" - << yylocation << ": "; - yy_symbol_value_print_ (yytype, yyvalue, yylocation); - *yycdebug_ << ')'; } -#endif + template + const Exact& + ]b4_parser_class_name[::symbol_base_type::self () const + { + return static_cast(*this); + } + + template + Exact& + ]b4_parser_class_name[::symbol_base_type::self () + { + return static_cast(*this); + } + + template + int + ]b4_parser_class_name[::symbol_base_type::type_get () const + { + return self ().type_get_ (); + } + + // symbol_type. + ]b4_parser_class_name[::symbol_type::symbol_type () + : super_type () + , type () + { + } + + ]b4_parser_class_name[::symbol_type::symbol_type (int t, + const location_type& l) + : super_type (l) + , type (t) + { + } + + ]b4_parser_class_name[::symbol_type::symbol_type (int t, + const semantic_type& v, const location_type& l) + : super_type (v, l) + , type (t) + { + } + + int + ]b4_parser_class_name[::symbol_type::type_get_ () const + { + return type; + } + +]b4_symbol_constructor_definitions[ + + // stack_symbol_type. + ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type () + : super_type () + , state () + { + } + + ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (state_type s, + const semantic_type& v, const location_type& l) + : super_type (v, l) + , state (s) + { + } + + int + ]b4_parser_class_name[::stack_symbol_type::type_get_ () const + { + return yystos_[state]; + } + + + template void - ]b4_parser_class_name[::yydestruct_ (const char* yymsg, - int yytype, semantic_type& yyvalue, location_type& yylocation) + ]b4_parser_class_name[::yy_destroy_ (const char* yymsg, + symbol_base_type& yysym) const { + int yytype = yysym.type_get (); YYUSE (yymsg); - YYUSE (yyvalue); - YYUSE (yylocation); - if (yymsg) - YY_SYMBOL_PRINT (yymsg, yytype, yyvalue, yylocation); + YY_SYMBOL_PRINT (yymsg, yysym); // User destructor. switch (yytype) { - ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[ +]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[ default: break; }]b4_variant_if([ // Type destructor. - b4_symbol_variant([[yytype]], [[yyvalue]], [[destroy]])])[ + b4_symbol_variant([[yytype]], [[yysym.value]], [[template destroy]])])[ } - ]b4_parser_class_name[::data_type::data_type () - : state() - , value() - , location() +#if YYDEBUG + template + void + ]b4_parser_class_name[::yy_print_ (std::ostream& yyo, + const symbol_base_type& yysym) const { + int yytype = yysym.type_get (); + yyo << (yytype < yyntokens_ ? "token" : "nterm") + << ' ' << yytname_[yytype] << " (" + << yysym.location << ": "; + switch (yytype) + { +]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))[ + default: + break; + } + yyo << ')'; } +#endif - ]b4_parser_class_name[::data_type::data_type (state_type s, - const semantic_type& v, const location_type& l) - : state(s) - , value(v) - , location(l) + void + ]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 (s, semantic_type(), sym.location)); + ]b4_symbol_variant([[yystos_[s]]], [[yystack_[0].value]], + [build], [sym.value])], +[ yystack_.push (stack_symbol_type (s, sym.value, sym.location));])[ } void - ]b4_parser_class_name[::yypush_ (const char* m, state_type s, - semantic_type& v, const location_type& l) + ]b4_parser_class_name[::yypush_ (const char* m, stack_symbol_type& s) { if (m) - YY_SYMBOL_PRINT (m, yystos_[s], v, l); + YY_SYMBOL_PRINT (m, s); ]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));])[ +[[ yystack_.push (stack_symbol_type (s.state, semantic_type(), s.location)); + ]b4_symbol_variant([[yystos_[s.state]]], [[yystack_[0].value]], + [build], [s.value])], +[ yystack_.push (s);])[ } void @@ -777,9 +1080,8 @@ b4_percent_code_get[]dnl int ]b4_parser_class_name[::parse () { - /// Lookahead and lookahead in internal form. + /// Coded type of the lookahead. int yychar = yyempty_; - int yytoken = 0; /* State. */ int yyn; @@ -790,25 +1092,23 @@ b4_percent_code_get[]dnl int yynerrs_ = 0; int yyerrstatus_ = 0; - /// Semantic value of the lookahead. - semantic_type yylval; - /// Location of the lookahead. - location_type yylloc; + /// The lookahead symbol. + symbol_type yyla; + /// The locations where the error started and ended. - data_type yyerror_range[2]; + stack_symbol_type yyerror_range[2]; - /// $$. - semantic_type yyval; - /// @@$. - location_type yyloc; + /// $$ and @@$. + stack_symbol_type yylhs; + /// The return value of parse(). int yyresult; YYCDEBUG << "Starting parse" << std::endl; ]m4_ifdef([b4_initial_action], [ -m4_pushdef([b4_at_dollar], [yylloc])dnl -m4_pushdef([b4_dollar_dollar], [yylval])dnl +m4_pushdef([b4_at_dollar], [yyla.location])dnl +m4_pushdef([b4_dollar_dollar], [yyla.value])dnl /* User initialization code. */ b4_user_initial_action m4_popdef([b4_dollar_dollar])dnl @@ -819,7 +1119,7 @@ m4_popdef([b4_at_dollar])])dnl location values to have been already stored, initialize these stacks with a primary value. */ yystack_ = stack_type (0); - yypush_ (0, yystate, yylval, yylloc); + yypush_ (0, 0, yyla); // A new state was pushed on the stack. // Invariant: yystate == yystack_[0].state, i.e., @@ -846,28 +1146,27 @@ m4_popdef([b4_at_dollar])])dnl { YYCDEBUG << "Reading a token: "; yychar = ]b4_c_function_call([yylex], [int], - [[YYSTYPE*], [&yylval]][]dnl -b4_locations_if([, [[location*], [&yylloc]]])dnl + [[YYSTYPE*], [&yyla.value]][]dnl +b4_locations_if([, [[location*], [&yyla.location]]])dnl m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; } - /* Convert token to internal form. */ if (yychar <= yyeof_) { - yychar = yytoken = yyeof_; + yychar = yyla.type = yyeof_; YYCDEBUG << "Now at end of input." << std::endl; } else { - yytoken = yytranslate_ (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, yylval, yylloc); + yyla.type = yytranslate_ (yychar); + YY_SYMBOL_PRINT ("Next token is", yyla); } - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken) + /* If the proper action on seeing token YYLA.TYPE is to reduce or + to detect an error, take that action. */ + yyn += yyla.type; + if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type) goto yydefault; /* Reduce or error. */ @@ -875,7 +1174,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; if (yyn <= 0) { if (yyn == 0 || yyn == yytable_ninf_) - goto yyerrlab; + goto yyerrlab; yyn = -yyn; goto yyreduce; } @@ -890,7 +1189,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; /* Shift the lookahead token. */ yystate = yyn; - yypush_ ("Shifting", yystate, yylval, yylloc); + yypush_ ("Shifting", yystate, yyla); goto yynewstate; /*-----------------------------------------------------------. @@ -910,61 +1209,61 @@ 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@}]], [yyval], [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. - Otherwise, the following line sets YYVAL to garbage. + Otherwise, the following line sets YYLHS.VALUE to garbage. This behavior is undocumented and Bison users should not rely upon it. */ if (yylen) - yyval = yystack_@{yylen - 1@}.value; + yylhs.value = yystack_@{yylen - 1@}.value; else - yyval = yystack_@{0@}.value;])[ + yylhs.value = yystack_@{0@}.value;])[ // Compute the default @@$. { - slice slice (yystack_, yylen); - YYLLOC_DEFAULT (yyloc, slice, yylen); + slice slice (yystack_, yylen); + YYLLOC_DEFAULT (yylhs.location, slice, yylen); } // Perform the reduction. YY_REDUCE_PRINT (yyn); switch (yyn) { - ]b4_user_actions[ +]b4_user_actions[ default: break; } - YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], yyval, yyloc); + // Compute post-reduction state. + yyn = yyr1_[yyn]; + yystate = yypgoto_[yyn - yyntokens_] + yystack_[yylen].state; + if (0 <= yystate && yystate <= yylast_ + && yycheck_[yystate] == yystack_[yylen].state) + yystate = yytable_[yystate]; + else + yystate = yydefgoto_[yyn - yyntokens_]; + yylhs.state = yystate; + YY_SYMBOL_PRINT ("-> $$ =", yylhs); ]b4_variant_if([[ // Destroy the lhs symbols. for (int i = 0; i < yylen; ++i) - // Destroy a variant which value may have be swapped with yyval. - // The value of yyval (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. - yydestruct_ (0, - yystos_[yystack_[i].state], - yystack_[i].value, yystack_[i].location);]])[ + // 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. + yy_destroy_ (0, yystack_[i]);]])[ yypop_ (yylen); yylen = 0; YY_STACK_PRINT (); /* Shift the result of the reduction. */ - yyn = yyr1_[yyn]; - yystate = yypgoto_[yyn - yyntokens_] + yystack_[0].state; - if (0 <= yystate && yystate <= yylast_ - && yycheck_[yystate] == yystack_[0].state) - yystate = yytable_[yystate]; - else - yystate = yydefgoto_[yyn - yyntokens_]; - yypush_ (0, yystate, yyval, yyloc); + yypush_ (0, yylhs); goto yynewstate; /*------------------------------------. @@ -975,10 +1274,10 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; if (!yyerrstatus_) { ++yynerrs_; - error (yylloc, yysyntax_error_ (yystate, yytoken)); + error (yyla.location, yysyntax_error_ (yystate, yyla.type)); } - yyerror_range[0].location = yylloc; + yyerror_range[0].location = yyla.location; if (yyerrstatus_ == 3) { /* If just tried and failed to reuse lookahead token after an @@ -992,7 +1291,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; } else { - yydestruct_ ("Error: discarding", yytoken, yylval, yylloc); + yy_destroy_ ("Error: discarding", yyla); yychar = yyempty_; } } @@ -1026,42 +1325,40 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus_ = 3; /* Each real token shifted decrements this. */ + { + stack_symbol_type error_token; + for (;;) + { + yyn = yypact_[yystate]; + if (yyn != yypact_ninf_) + { + yyn += yyterror_; + if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) + { + yyn = yytable_[yyn]; + if (0 < yyn) + break; + } + } - for (;;) - { - yyn = yypact_[yystate]; - if (yyn != yypact_ninf_) - { - yyn += yyterror_; - if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) - { - yyn = yytable_[yyn]; - if (0 < yyn) - break; - } - } - - // Pop the current state because it cannot handle the error token. - if (yystack_.size () == 1) - YYABORT; - - yyerror_range[0].location = yystack_[0].location; - yydestruct_ ("Error: popping", - yystos_[yystate], - yystack_[0].value, yystack_[0].location); - yypop_ (); - yystate = yystack_[0].state; - YY_STACK_PRINT (); - } + // Pop the current state because it cannot handle the error token. + if (yystack_.size () == 1) + YYABORT; - yyerror_range[1].location = yylloc; - // Using YYLLOC is tempting, but would change the location of - // the lookahead. YYLOC is available though. - YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2); + yyerror_range[0].location = yystack_[0].location; + yy_destroy_ ("Error: popping", yystack_[0]); + yypop_ (); + yystate = yystack_[0].state; + YY_STACK_PRINT (); + } - /* Shift the error token. */ - yystate = yyn; - yypush_ ("Shifting", yystate, yylval, yyloc); + yyerror_range[1].location = yyla.location; + YYLLOC_DEFAULT (error_token.location, (yyerror_range - 1), 2); + + /* Shift the error token. */ + error_token.state = yystate = yyn; + yypush_ ("Shifting", error_token); + } goto yynewstate; /* Accept. */ @@ -1076,16 +1373,14 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; yyreturn: if (yychar != yyempty_) - yydestruct_ ("Cleanup: discarding lookahead", yytoken, yylval, yylloc); + yy_destroy_ ("Cleanup: discarding lookahead", yyla); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ yypop_ (yylen); while (yystack_.size () != 1) { - yydestruct_ ("Cleanup: popping", - yystos_[yystack_[0].state], - yystack_[0].value, yystack_[0].location); + yy_destroy_ ("Cleanup: popping", yystack_[0]); yypop_ (); } @@ -1195,13 +1490,6 @@ b4_error_verbose_if([ tok])[) #endif #if YYDEBUG - /* YYRHS -- A `-1'-separated list of the rules' RHS. */ - ]b4_table_define([rhs], [b4_rhs])[; - - /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ - ]b4_table_define([prhs], [b4_prhs])[; - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ ]b4_table_define([rline], [b4_rline])[; @@ -1230,9 +1518,7 @@ b4_error_verbose_if([ tok])[) /* The symbols being reduced. */ for (int yyi = 0; yyi < yynrhs; yyi++) YY_SYMBOL_PRINT (" $" << yyi + 1 << " =", - yyrhs_[yyprhs_[yyrule] + yyi], - ]b4_rhs_value(yynrhs, yyi + 1)[, - ]b4_rhs_location(yynrhs, yyi + 1)[); + ]b4_rhs_data(yynrhs, yyi + 1)[); } #endif // YYDEBUG @@ -1244,26 +1530,17 @@ b4_error_verbose_if([ tok])[) const token_number_type translate_table[] = { - ]b4_translate[ +]b4_translate[ }; - if ((unsigned int) t <= yyuser_token_number_max_) + const unsigned int user_token_number_max_ = ]b4_user_token_number_max[; + const token_number_type undef_token_ = ]b4_undef_token_number[; + + if (static_cast (t) <= user_token_number_max_) return translate_table[t]; else - return yyundef_token_; + return undef_token_; } - const int ]b4_parser_class_name[::yyeof_ = 0; - const int ]b4_parser_class_name[::yylast_ = ]b4_last[; - const int ]b4_parser_class_name[::yynnts_ = ]b4_nterms_number[; - const int ]b4_parser_class_name[::yyempty_ = -2; - const int ]b4_parser_class_name[::yyfinal_ = ]b4_final_state_number[; - const int ]b4_parser_class_name[::yyterror_ = 1; - const int ]b4_parser_class_name[::yyerrcode_ = 256; - const int ]b4_parser_class_name[::yyntokens_ = ]b4_tokens_number[; - - const unsigned int ]b4_parser_class_name[::yyuser_token_number_max_ = ]b4_user_token_number_max[; - const ]b4_parser_class_name[::token_number_type ]b4_parser_class_name[::yyundef_token_ = ]b4_undef_token_number[; - ]b4_namespace_close[ ]b4_epilogue[]dnl