X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/e51b0a82be0ea8051f6e95dc668288c74c55ae9b..fe1b448ada5e3a79ae3f523e08b5004396f30ca9:/data/lalr1.cc?ds=inline diff --git a/data/lalr1.cc b/data/lalr1.cc index 3fdd33ea..c3678887 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -18,6 +18,15 @@ m4_include(b4_pkgdatadir/[c++.m4]) +# b4_subtract(LHS, RHS) +# --------------------- +# Evaluate LHS - RHS if they are integer literals, otherwise expand +# to (LHS) - (RHS). +m4_define([b4_subtract], +[m4_bmatch([$1$2], [^[0123456789]*$], + [m4_eval([$1 - $2])], + [($1) - ($2)])]) + # b4_args(ARG1, ...) # _b4_args(ARG1, ...) @@ -107,7 +116,7 @@ m4_define([b4_lhs_location], # 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)@}]) + [yystack_@{b4_subtract($@)@}]) # b4_rhs_state(RULE-LENGTH, NUM) @@ -134,12 +143,23 @@ m4_define([b4_rhs_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(NUM, FIELD) # --------------------- # Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if -# undefined. +# undefined. If FIELD = id, prepend the prefix. m4_define([b4_symbol], -[m4_indir([b4_symbol($1, $2)])]) +[m4_case([$2], + [id], [m4_do([b4_percent_define_get([token.prefix])], + [b4_symbol_([$1], [id])])], + [b4_symbol_($@)])]) # b4_symbol_if(NUM, FIELD, IF-TRUE, IF-FALSE) @@ -195,66 +215,40 @@ m4_define([b4_type_action_], ])]) -# b4_symbol_constructor_declaration_(SYMBOL-NUMBERS) -# ---------------------------------------------------- +# b4_symbol_constructor_declaration_(SYMBOL-NUMBER) +# ------------------------------------------------- # 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_args(b4_symbol_if([$1], [has_type], - [const b4_symbol([$1], [type])& v]), - b4_locations_if([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], [has_id], -[ template <> - inline - b4_parser_class_name::symbol_type - b4_parser_class_name::make_symbol (dnl +[ static inline + symbol_type + make_[]b4_symbol_([$1], [id]) (dnl b4_args(b4_symbol_if([$1], [has_type], [const b4_symbol([$1], [type])& v]), b4_locations_if([const location_type& l]))); + ])])]) -# b4_symbol_constructor_specializations -# ------------------------------------- -# Declare specializations of make_symbol. -m4_define([b4_symbol_constructor_specializations], + +# b4_symbol_constructor_declarations +# ---------------------------------- +# Declare symbol constructors for all the value types. +# Use at class-level. +m4_define([b4_symbol_constructor_declarations], [b4_variant_if([ - // Specializations of make_symbol for each symbol type. -m4_map([b4_symbol_constructor_specialization_], - m4_defn([b4_symbol_numbers]))])dnl -]) + // Symbol constructors declarations. +m4_map([b4_symbol_constructor_declaration_], m4_defn([b4_symbol_numbers]))])]) # b4_symbol_constructor_definition_(SYMBOL-NUMBER) # ------------------------------------------------ -# Define make_symbol for this SYMBOL-NUMBER. +# Define symbol constructor for this SYMBOL-NUMBER. m4_define([b4_symbol_constructor_definition_], [b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id], -[ template <> - b4_parser_class_name::symbol_type - b4_parser_class_name::make_symbol (dnl +[ b4_parser_class_name::symbol_type + b4_parser_class_name::make_[]b4_symbol_([$1], [id]) (dnl b4_args(b4_symbol_if([$1], [has_type], [const b4_symbol([$1], [type])& v]), b4_locations_if([const location_type& l]))) @@ -345,6 +339,21 @@ m4_define([b4_symbol_constructor_definitions], { return type; } +]b4_lex_symbol_if([[ + ]b4_parser_class_name[::token_type + ]b4_parser_class_name[::symbol_type::token () const + { + // YYTOKNUM[NUM] -- (External) token number corresponding to the + // (internal) symbol number NUM (which must be that of a token). */ + static + const ]b4_int_type_for([b4_toknum])[ + yytoken_number_[] = + { + ]b4_toknum[ + }; + return static_cast (yytoken_number_[type]); + } +]])[ ]b4_variant_if( [ // Implementation of make_symbol for each symbol type. @@ -410,7 +419,7 @@ m4_map([b4_char_sizeof_], [$@])dnl # Define yytranslate_. Sometimes we want it in the header file, # sometimes the cc file suffices. m4_define([b4_yytranslate_definition], -[[ // YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. +[[ // Symbol number corresponding to token number t. ]b4_parser_class_name[::token_number_type ]b4_parser_class_name[::yytranslate_ (]b4_lex_symbol_if([token_type], [int])[ t) @@ -726,8 +735,6 @@ m4_ifdef([b4_stype], #if YYDEBUG /// For each rule, its source line number. static const ]b4_int_type_for([b4_rline])[ yyrline_[]; - /// For each scanner token number, its symbol number. - static const ]b4_int_type_for([b4_toknum])[ yytoken_number_[]; /// Report on the debug stream that the rule \a r is going to be reduced. virtual void yy_reduce_print_ (int r); /// Print the state stack on the debug stream. @@ -739,7 +746,7 @@ m4_ifdef([b4_stype], #endif /// Convert a scanner token number \a t to a symbol number. - static token_number_type yytranslate_ (]b4_lex_symbol_if([token_type], [int])[ t); + static inline token_number_type yytranslate_ (]b4_lex_symbol_if([token_type], [int])[ t); /// A complete symbol, with its type. template @@ -808,6 +815,9 @@ m4_ifdef([b4_stype], /// Return the type corresponding to this state. inline int type_get_ () const; + + /// Its token. + inline token_type token () const; }; ]b4_symbol_constructor_declarations[ @@ -873,7 +883,9 @@ m4_ifdef([b4_stype], ]b4_parse_param_vars[ }; -]b4_symbol_constructor_specializations[ + +]b4_lex_symbol_if([b4_yytranslate_definition])[ +]b4_lex_symbol_if([b4_symbol_constructor_definitions])[ ]b4_namespace_close[ ]b4_percent_define_flag_if([[global_tokens_and_yystype]], @@ -1023,7 +1035,7 @@ b4_percent_code_get[]dnl | Symbol types. | `---------------*/ -]b4_symbol_constructor_definitions[ +]b4_lex_symbol_if([], [b4_symbol_constructor_definitions])[ // stack_symbol_type. ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type () @@ -1559,12 +1571,6 @@ b4_error_verbose_if([int yystate, int yytoken], symbol of state STATE-NUM. */ ]b4_table_define([stos], [b4_stos])[; -#if YYDEBUG - /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding - to YYLEX-NUM. */ - ]b4_table_define([token_number], [b4_toknum])[; -#endif - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ ]b4_table_define([r1], [b4_r1])[; @@ -1614,7 +1620,7 @@ b4_error_verbose_if([int yystate, int yytoken], } #endif // YYDEBUG -]b4_yytranslate_definition[ +]b4_lex_symbol_if([], [b4_yytranslate_definition])[ ]b4_namespace_close[ ]b4_epilogue[]dnl