[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH for Dlang support] d: make enum SymbolKind idiomatic D
From: |
Adela Vais |
Subject: |
[PATCH for Dlang support] d: make enum SymbolKind idiomatic D |
Date: |
Tue, 8 Sep 2020 22:31:52 +0300 |
The enum is now wrapped in a structure that contains its string representation.
* data/skeletons/d.m4, data/skeletons/lalr1.d: here.
---
data/skeletons/d.m4 | 29 +++++++++++++++++++++++++++--
data/skeletons/lalr1.d | 21 +++++----------------
2 files changed, 32 insertions(+), 18 deletions(-)
diff --git a/data/skeletons/d.m4 b/data/skeletons/d.m4
index edb0c49e..863484f4 100644
--- a/data/skeletons/d.m4
+++ b/data/skeletons/d.m4
@@ -204,11 +204,36 @@ m4_define([b4_symbol_enum],
# to use a signed type, which matters for yytoken.
m4_define([b4_declare_symbol_enum],
[[ /* Symbol kinds. */
- public enum SymbolKind
+ struct SymbolKind
{
+ public enum SymbolKindEnum
+ {
]b4_symbol(-2, kind_base)[ = -2, /* No symbol. */
]b4_symbol_foreach([b4_symbol_enum])dnl
-[ };
+[ }
+
+ private SymbolKindEnum yycode_;
+ alias yycode_ this;
+
+ this(int code)
+ {
+ yycode_ = cast(SymbolKindEnum) code;
+ }
+
+ /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at \a YYNTOKENS_, nonterminals. */
+ private static immutable string[] yytname_ = @{
+ ]b4_tname[
+ @};
+
+ public string toString() const
+ {
+ return yytname_[yycode_];
+ }
+ }
+ ]])])
+ [
+ }
]])])
diff --git a/data/skeletons/lalr1.d b/data/skeletons/lalr1.d
index 761125cb..59547b06 100644
--- a/data/skeletons/lalr1.d
+++ b/data/skeletons/lalr1.d
@@ -732,7 +732,7 @@ m4_popdef([b4_at_dollar])])dnl
// FIXME: This method of building the message is not compatible
// with internationalization.
string res = "syntax error, unexpected ";
- res ~= yytnamerr_ (yytname_[tok]);
+ res ~= yytnamerr_ (tok.toString);
int yyn = yypact_[yystate];
if (!yy_pact_value_is_default_ (yyn))
{
@@ -757,7 +757,7 @@ m4_popdef([b4_at_dollar])])dnl
&& !yy_table_value_is_error_ (yytable_[x + yyn]))
{
res ~= count++ == 0 ? ", expecting " : " or ";
- res ~= yytnamerr_ (yytname_[x]);
+ res ~= yytnamerr_ (SymbolKind(x).toString);
}
}
}
@@ -795,13 +795,6 @@ m4_popdef([b4_at_dollar])])dnl
]b4_parser_tables_define[
- /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
- First, the terminals, then, starting at \a yyntokens_, nonterminals. */
- private static immutable string[] yytname_ =
- @{
- ]b4_tname[
- @};
-
]b4_parse_trace_if([[
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
private static immutable ]b4_int_type_for([b4_rline])[[] yyrline_ =
@@ -831,11 +824,10 @@ m4_popdef([b4_at_dollar])])dnl
}
]])[
- private static SymbolKind yytranslate_ (int t)
+ private static auto yytranslate_ (int t)
{
]b4_api_token_raw_if(
-[[ import std.conv : to;
- return to!SymbolKind (t);]],
+[[ return SymbolKind(t);]],
[[ /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
immutable ]b4_int_type_for([b4_translate])[[] translate_table =
@{
@@ -848,10 +840,7 @@ m4_popdef([b4_at_dollar])])dnl
if (t <= 0)
return ]b4_symbol(0, kind)[;
else if (t <= code_max)
- {
- import std.conv : to;
- return to!SymbolKind (translate_table[t]);
- }
+ return SymbolKind(translate_table[t]);
else
return ]b4_symbol(2, kind)[;]])[
}
--
2.17.1
- [PATCH for Dlang support] d: make enum SymbolKind idiomatic D,
Adela Vais <=