X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/d69c9694a7a7038b4c3eb20acbf8ba8354bcf7a1..11707b2b48fb781ff0e7fd3befdfb02f787a76e4:/data/lalr1.cc diff --git a/data/lalr1.cc b/data/lalr1.cc index 7a048152..b00212e8 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -113,6 +113,17 @@ 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, # SYMBOL-TAG, SYMBOL-NUM, # SYMBOL-ACTION, SYMBOL-TYPENAME) @@ -132,16 +143,26 @@ m4_popdef([b4_dollar_dollar])dnl ]) -# b4_symbol_action_(NUM) -# ---------------------- -# Invoke b4_dollar_dollar(SYMBOL_TYPENAME) for each symbol. -m4_define([b4_symbol_action_], -[m4_ifval(b4_symbol([$1], [type_name]), +# 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; + ])]) @@ -154,9 +175,9 @@ m4_define([b4_symbol_variant], [$2.$3<$][3>(m4_shift3($@))])dnl switch ($1) { -m4_map([b4_symbol_action_], m4_defn([b4_symbol_numbers])) - default: - break; +m4_map([b4_type_action_], m4_defn([b4_type_names]))[]dnl + default: + break; } m4_popdef([b4_dollar_dollar])dnl ]) @@ -489,7 +510,7 @@ 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); /// A complete symbol, with its type. template @@ -597,17 +618,18 @@ m4_ifdef([b4_stype], 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[ }; @@ -860,7 +882,7 @@ b4_percent_code_get[]dnl }]b4_variant_if([ // Type destructor. - b4_symbol_variant([[yytype]], [[yysym.value]], [[template destroy]])])[ + b4_symbol_variant([[yytype]], [[yysym.value]], [[template destroy]])])[ } #if YYDEBUG @@ -875,8 +897,8 @@ b4_percent_code_get[]dnl << yysym.location << ": "; switch (yytype) { -]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl -[ default: +]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))[ + default: break; } yyo << ')'; @@ -1015,7 +1037,6 @@ b4_locations_if([, [[location*], [&yyla.location]]])dnl m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; } - /* Convert token to internal form. */ if (yychar <= yyeof_) { @@ -1096,7 +1117,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; YY_REDUCE_PRINT (yyn); switch (yyn) { - ]b4_user_actions[ +]b4_user_actions[ default: break; } @@ -1395,26 +1416,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