[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 3/5] c++: improvements on symbol kinds
From: |
Akim Demaille |
Subject: |
[PATCH 3/5] c++: improvements on symbol kinds |
Date: |
Sat, 11 Apr 2020 08:47:41 +0200 |
Instead of
/// (Internal) symbol kind.
enum symbol_kind_type
{
YYNTOKENS = 5, ///< Number of tokens.
YYSYMBOL_YYEMPTY = -2,
YYSYMBOL_YYEOF = 0, // END_OF_FILE
YYSYMBOL_YYERROR = 1, // error
YYSYMBOL_YYUNDEF = 2, // $undefined
YYSYMBOL_TEXT = 3, // TEXT
YYSYMBOL_NUMBER = 4, // NUMBER
YYSYMBOL_YYACCEPT = 5, // $accept
YYSYMBOL_result = 6, // result
YYSYMBOL_list = 7, // list
YYSYMBOL_item = 8 // item
};
generate
/// Symbol kinds.
struct symbol_kind
{
enum symbol_kind_type
{
YYNTOKENS = 5, ///< Number of tokens.
S_YYEMPTY = -2,
S_YYEOF = 0, // END_OF_FILE
S_YYERROR = 1, // error
S_YYUNDEF = 2, // $undefined
S_TEXT = 3, // TEXT
S_NUMBER = 4, // NUMBER
S_YYACCEPT = 5, // $accept
S_result = 6, // result
S_list = 7, // list
S_item = 8 // item
};
};
* data/skeletons/c++.m4 (api.symbol.prefix): Define to S_.
Adjust all the uses.
(b4_public_types_declare): Nest the enum inside 'struct symbol_kind'.
* data/skeletons/glr.cc, data/skeletons/lalr1.cc,
* tests/headers.at, tests/local.at: Adjust.
---
data/skeletons/c++.m4 | 36 +++++++++++++++++++++++-------------
data/skeletons/glr.cc | 8 ++++----
data/skeletons/lalr1.cc | 16 +++++++++-------
tests/headers.at | 2 +-
tests/local.at | 2 +-
5 files changed, 38 insertions(+), 26 deletions(-)
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<Base>::empty () const YY_NOEXCEPT
{
- return Base::type_get () == ]b4_symbol_prefix[YYEMPTY;
+ return Base::type_get () == symbol_kind::]b4_symbol_prefix[YYEMPTY;
}
template <typename Base>
@@ -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));
}
{
--
2.26.0
- [PATCH 0/5] Clean up, Akim Demaille, 2020/04/11
- [PATCH 2/5] d: improvements on symbol kinds, Akim Demaille, 2020/04/11
- [PATCH 1/5] symbols: minor fixes, Akim Demaille, 2020/04/11
- [PATCH 4/5] todo: update, Akim Demaille, 2020/04/11
- [PATCH 3/5] c++: improvements on symbol kinds,
Akim Demaille <=
- Re: [PATCH 3/5] c++: improvements on symbol kinds, Hans Åberg, 2020/04/14
- Re: [PATCH 3/5] c++: improvements on symbol kinds, Akim Demaille, 2020/04/15
- Re: [PATCH 3/5] c++: improvements on symbol kinds, Hans Åberg, 2020/04/15
- Re: [PATCH 3/5] c++: improvements on symbol kinds, Akim Demaille, 2020/04/15
- Re: [PATCH 3/5] c++: improvements on symbol kinds, Hans Åberg, 2020/04/15
- Re: [PATCH 3/5] c++: improvements on symbol kinds, Akim Demaille, 2020/04/15
- Re: [PATCH 3/5] c++: improvements on symbol kinds, Hans Åberg, 2020/04/15
- Re: [PATCH 3/5] c++: improvements on symbol kinds, Akim Demaille, 2020/04/16
- Re: [PATCH 3/5] c++: improvements on symbol kinds, Hans Åberg, 2020/04/16
[PATCH 5/5] style: rename YYNOMEM as YYENOMEM, Akim Demaille, 2020/04/11