bison-patches
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]