diff --git a/data/skeletons/c++.m4 b/data/skeletons/c++.m4 index eb273214..a0dbbd97 100644 --- a/data/skeletons/c++.m4 +++ b/data/skeletons/c++.m4 @@ -22,6 +22,8 @@ b4_percent_define_ifdef([[api.value.union.name]], [b4_complain_at(b4_percent_define_get_loc([[api.value.union.name]]), [named %union is invalid in C++])]) +b4_percent_define_default([[api.symbol.prefix]], [[S_]]) + m4_include(b4_skeletonsdir/[c.m4]) b4_percent_define_check_kind([api.namespace], [code], [deprecated]) @@ -187,12 +189,11 @@ m4_define([b4_token_enums], # to use a signed type, which matters for yytoken. m4_define([b4_declare_symbol_enum], [[enum symbol_kind_type - { - YYNTOKENS = ]b4_tokens_number[, ///< Number of tokens. - ]b4_symbol_kind([-2])[ = -2, -]b4_symbol_foreach([ b4_symbol_enum])[ - }; -]]) + { + YYNTOKENS = ]b4_tokens_number[, ///< Number of tokens. + ]b4_symbol_kind([-2])[ = -2, +]b4_symbol_foreach([ b4_symbol_enum])dnl +[ };]]) @@ -252,7 +253,7 @@ m4_define([b4_public_types_declare], location_type location;])[ }; - /// Token numbers. + /// Token kinds. struct token { ]b4_token_enums[ @@ -261,8 +262,17 @@ m4_define([b4_public_types_declare], /// (External) token kind, as returned by yylex. typedef token::yytokentype token_type; + /// Symbol kinds. + struct symbol_kind + { + ]b4_declare_symbol_enum[ + }; + /// (Internal) symbol kind. - ]b4_declare_symbol_enum[ + typedef symbol_kind::symbol_kind_type symbol_kind_type; + + /// The number of tokens. + static const symbol_kind_type YYNTOKENS = symbol_kind::YYNTOKENS; ]]) @@ -456,7 +466,7 @@ m4_define([b4_public_types_define], bool ]b4_parser_class[::basic_symbol::empty () const YY_NOEXCEPT { - return Base::type_get () == ]b4_symbol_prefix[YYEMPTY; + return Base::type_get () == symbol_kind::]b4_symbol_prefix[YYEMPTY; } template @@ -472,7 +482,7 @@ m4_define([b4_public_types_define], // by_type. ]b4_inline([$1])b4_parser_class[::by_type::by_type () - : type (]b4_symbol_prefix[YYEMPTY) + : type (symbol_kind::]b4_symbol_prefix[YYEMPTY) {} #if 201103L <= YY_CPLUSPLUS @@ -494,7 +504,7 @@ m4_define([b4_public_types_define], ]b4_inline([$1])[void ]b4_parser_class[::by_type::clear () { - type = ]b4_symbol_prefix[YYEMPTY; + type = symbol_kind::]b4_symbol_prefix[YYEMPTY; } ]b4_inline([$1])[void @@ -540,11 +550,11 @@ m4_define([b4_yytranslate_define], const int user_token_number_max_ = ]b4_user_token_number_max[; if (t <= 0) - return ]b4_symbol_prefix[YYEOF; + return symbol_kind::]b4_symbol_prefix[YYEOF; else if (t <= user_token_number_max_) return YY_CAST (symbol_kind_type, translate_table[t]); else - return ]b4_symbol_prefix[YYUNDEF;]])[ + return symbol_kind::]b4_symbol_prefix[YYUNDEF;]])[ } ]]) diff --git a/data/skeletons/glr.cc b/data/skeletons/glr.cc index 3e7e56c3..a6d7471d 100644 --- a/data/skeletons/glr.cc +++ b/data/skeletons/glr.cc @@ -357,10 +357,10 @@ b4_percent_define_flag_if([[global_tokens_and_yystype]], ]b4_namespace_close[ ]m4_define([b4_declare_symbol_enum], [[typedef ]b4_namespace_ref[::]b4_parser_class[::symbol_kind_type yysymbol_kind_t; -#define ]b4_symbol_prefix[YYEMPTY ]b4_namespace_ref[::]b4_parser_class[::]b4_symbol_prefix[YYEMPTY -#define ]b4_symbol_prefix[YYERROR ]b4_namespace_ref[::]b4_parser_class[::]b4_symbol_prefix[YYERROR -#define ]b4_symbol_prefix[YYEOF ]b4_namespace_ref[::]b4_parser_class[::]b4_symbol_prefix[YYEOF -#define ]b4_symbol_prefix[YYUNDEF ]b4_namespace_ref[::]b4_parser_class[::]b4_symbol_prefix[YYUNDEF +#define ]b4_symbol_prefix[YYEMPTY ]b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol_prefix[YYEMPTY +#define ]b4_symbol_prefix[YYERROR ]b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol_prefix[YYERROR +#define ]b4_symbol_prefix[YYEOF ]b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol_prefix[YYEOF +#define ]b4_symbol_prefix[YYUNDEF ]b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol_prefix[YYUNDEF ]])[ ]b4_percent_code_get([[provides]])[ ]m4_popdef([b4_parse_param])dnl diff --git a/data/skeletons/lalr1.cc b/data/skeletons/lalr1.cc index e67ecc03..4387fbfc 100644 --- a/data/skeletons/lalr1.cc +++ b/data/skeletons/lalr1.cc @@ -700,7 +700,7 @@ b4_parse_error_case([verbose], [[ ]b4_parser_class[::by_state::type_get () const YY_NOEXCEPT { if (state == empty_state) - return ]b4_symbol_prefix[YYEMPTY; + return symbol_kind::]b4_symbol_prefix[YYEMPTY; else return YY_CAST (symbol_kind_type, yystos_[+state]); } @@ -725,7 +725,7 @@ b4_parse_error_case([verbose], [[ b4_symbol_variant([that.type_get ()], [value], [move], [YY_MOVE (that.value)])])[ // that is emptied. - that.type = ]b4_symbol_prefix[YYEMPTY; + that.type = symbol_kind::]b4_symbol_prefix[YYEMPTY; } #if YY_CPLUSPLUS < 201103L @@ -1089,7 +1089,7 @@ b4_dollar_popdef])[]dnl error, discard it. */ // Return failure if at end of input. - if (yyla.type_get () == ]b4_symbol_prefix[YYEOF) + if (yyla.type_get () == symbol_kind::]b4_symbol_prefix[YYEOF) YYABORT; else if (!yyla.empty ()) { @@ -1131,8 +1131,9 @@ b4_dollar_popdef])[]dnl yyn = yypact_[+yystack_[0].state]; if (!yy_pact_value_is_default_ (yyn)) { - yyn += ]b4_symbol_prefix[YYERROR; - if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == ]b4_symbol_prefix[YYERROR) + yyn += symbol_kind::]b4_symbol_prefix[YYERROR; + if (0 <= yyn && yyn <= yylast_ + && yycheck_[yyn] == symbol_kind::]b4_symbol_prefix[YYERROR) { yyn = yytable_[yyn]; if (0 < yyn) @@ -1244,7 +1245,8 @@ b4_dollar_popdef])[]dnl for (int yyx = 0; yyx < YYNTOKENS; ++yyx) { symbol_kind_type yysym = YY_CAST (symbol_kind_type, yyx); - if (yysym != ]b4_symbol_prefix[YYERROR && yysym != ]b4_symbol_prefix[YYUNDEF + if (yysym != symbol_kind::]b4_symbol_prefix[YYERROR + && yysym != symbol_kind::]b4_symbol_prefix[YYUNDEF && yyparser_.yy_lac_check_ (yysym)) { if (!yyarg) @@ -1266,7 +1268,7 @@ b4_dollar_popdef])[]dnl int yychecklim = yylast_ - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; for (int yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck_[yyx + yyn] == yyx && yyx != ]b4_symbol_prefix[YYERROR + if (yycheck_[yyx + yyn] == yyx && yyx != symbol_kind::]b4_symbol_prefix[YYERROR && !yy_table_value_is_error_ (yytable_[yyx + yyn])) { if (!yyarg) diff --git a/tests/headers.at b/tests/headers.at index d746b8d7..f1cb7316 100644 --- a/tests/headers.at +++ b/tests/headers.at @@ -321,7 +321,7 @@ AT_PERL_CHECK([[-n -0777 -e ' |YYChar |YYNTOKENS # This is actual scoped in a C++ class. |YYPUSH_MORE(?:_DEFINED)? - |YYSYMBOL_(\w+) # These guys are scoped. + |S_(YY(ACCEPT|EMPTY|EOF|ERROR|UNDEF)) # These guys are scoped. |YYUSE |YY_ATTRIBUTE(?:_PURE|_UNUSED) |YY(?:_REINTERPRET)?_CAST diff --git a/tests/local.at b/tests/local.at index 1b656a80..3e1cc1a8 100644 --- a/tests/local.at +++ b/tests/local.at @@ -756,7 +756,7 @@ void std::cerr << "syntax error"; { symbol_kind_type la = ctx.token (); - if (la != YYSYMBOL_YYEMPTY) + if (la != symbol_kind::S_YYEMPTY) fprintf (stderr, " on token [%s]", yysymbol_name (la)); } {