From f1f1eb9cc38c71e4fbe0f8f324b2bd9103b3dcdf Mon Sep 17 00:00:00 2001
From: Adela Vais <adela.vais99@gmail.com>
Date: Thu, 10 Dec 2020 22:49:28 +0200
Subject: [PATCH for Dlang support 2/9] d: create alias Symbol for
 YYParse.Symbol

* data/skeletons/lalr1.d: Here.
* doc/bison.texi: Document it.
* examples/d/calc/calc.y, examples/d/simple/calc.y: Adjust.
* tests/calc.at, tests/d.at, tests/scanner.at: Test it.
---
 data/skeletons/d.m4      |  8 ++++++++
 data/skeletons/lalr1.d   |  4 +++-
 doc/bison.texi           |  4 ++--
 examples/d/calc/calc.y   | 20 ++++++++++----------
 examples/d/simple/calc.y | 20 ++++++++++----------
 tests/calc.at            | 30 +++++++++++++++---------------
 tests/d.at               |  8 ++++----
 tests/scanner.at         | 18 +++++++++---------
 8 files changed, 61 insertions(+), 51 deletions(-)

diff --git a/data/skeletons/d.m4 b/data/skeletons/d.m4
index 5362fb8e..ee0d85a1 100644
--- a/data/skeletons/d.m4
+++ b/data/skeletons/d.m4
@@ -447,6 +447,14 @@ m4_define([b4_var_decls],
 m4_define([b4_var_decl],
           [    protected $1;])
 
+# b4_public_types_declare
+# -----------------------
+# Define the public types: token, semantic value, location, and so forth.
+# Depending on %define token_lex, may be output in the header or source file.
+m4_define([b4_public_types_declare],
+[[
+alias Symbol = ]b4_parser_class[.Symbol;
+]])
 
 # b4_symbol_type_define
 # ---------------------
diff --git a/data/skeletons/lalr1.d b/data/skeletons/lalr1.d
index cea08dca..a3378bce 100644
--- a/data/skeletons/lalr1.d
+++ b/data/skeletons/lalr1.d
@@ -75,7 +75,7 @@ public interface Lexer
    * to the next token and prepares to return the semantic value
    * ]b4_locations_if([and beginning/ending positions ])[of the token.
    * @@return the token identifier corresponding to the next token. */
-  ]b4_parser_class[.Symbol yylex ();
+  Symbol yylex ();
 
   /**
    * Entry point for error reporting.  Emits an error
@@ -95,6 +95,8 @@ public interface Lexer
 ]])[
 }
 
+]b4_public_types_declare[
+
 ]b4_locations_if([b4_position_type_if([[
 static assert(__traits(compiles,
               (new ]b4_position_type[[1])[0]=(new ]b4_position_type[[1])[0]),
diff --git a/doc/bison.texi b/doc/bison.texi
index 959a4039..314f662a 100644
--- a/doc/bison.texi
+++ b/doc/bison.texi
@@ -14011,8 +14011,8 @@ This method is defined by the user to emit an error message.  The first
 parameter is omitted if location tracking is not active.
 @end deftypemethod
 
-@deftypemethod {Lexer} {YYParser.Symbol} yylex()
-Return the next token. The return value is of type YYParser.Symbol, which
+@deftypemethod {Lexer} {Symbol} yylex()
+Return the next token. The return value is of type Symbol, which
 binds together the TokenKind, the semantic value and the location.
 @end deftypemethod
 
diff --git a/examples/d/calc/calc.y b/examples/d/calc/calc.y
index 24ec85d4..8bf55fd4 100644
--- a/examples/d/calc/calc.y
+++ b/examples/d/calc/calc.y
@@ -114,7 +114,7 @@ if (isInputRange!R && is(ElementType!R : dchar))
     return semanticVal_;
   }
 
-  Calc.Symbol yylex()
+  Symbol yylex()
   {
     import std.uni : isWhite, isNumber;
 
@@ -127,7 +127,7 @@ if (isInputRange!R && is(ElementType!R : dchar))
     }
 
     if (input.empty)
-      return Calc.Symbol(TokenKind.YYEOF, YYLocation(startPos, endPos));
+      return Symbol(TokenKind.YYEOF, YYLocation(startPos, endPos));
 
     // Numbers.
     if (input.front.isNumber)
@@ -143,7 +143,7 @@ if (isInputRange!R && is(ElementType!R : dchar))
       }
       start = end;
       end.column += lenChars;
-      return Calc.Symbol(TokenKind.NUM, semanticVal_.ival, YYLocation(startPos, endPos));
+      return Symbol(TokenKind.NUM, semanticVal_.ival, YYLocation(startPos, endPos));
     }
 
     // Individual characters
@@ -153,17 +153,17 @@ if (isInputRange!R && is(ElementType!R : dchar))
     end.column++;
     switch (ch)
     {
-      case '+':  return Calc.Symbol(TokenKind.PLUS, YYLocation(startPos, endPos));
-      case '-':  return Calc.Symbol(TokenKind.MINUS, YYLocation(startPos, endPos));
-      case '*':  return Calc.Symbol(TokenKind.STAR, YYLocation(startPos, endPos));
-      case '/':  return Calc.Symbol(TokenKind.SLASH, YYLocation(startPos, endPos));
-      case '(':  return Calc.Symbol(TokenKind.LPAR, YYLocation(startPos, endPos));
-      case ')':  return Calc.Symbol(TokenKind.RPAR, YYLocation(startPos, endPos));
+      case '+':  return Symbol(TokenKind.PLUS, YYLocation(startPos, endPos));
+      case '-':  return Symbol(TokenKind.MINUS, YYLocation(startPos, endPos));
+      case '*':  return Symbol(TokenKind.STAR, YYLocation(startPos, endPos));
+      case '/':  return Symbol(TokenKind.SLASH, YYLocation(startPos, endPos));
+      case '(':  return Symbol(TokenKind.LPAR, YYLocation(startPos, endPos));
+      case ')':  return Symbol(TokenKind.RPAR, YYLocation(startPos, endPos));
       case '\n':
       {
         end.line++;
         end.column = 1;
-        return Calc.Symbol(TokenKind.EOL, YYLocation(startPos, endPos));
+        return Symbol(TokenKind.EOL, YYLocation(startPos, endPos));
       }
       default: assert(0);
     }
diff --git a/examples/d/simple/calc.y b/examples/d/simple/calc.y
index ff20673d..de8da2a4 100644
--- a/examples/d/simple/calc.y
+++ b/examples/d/simple/calc.y
@@ -109,7 +109,7 @@ if (isInputRange!R && is(ElementType!R : dchar))
     return semanticVal_;
   }
 
-  Calc.Symbol yylex()
+  Symbol yylex()
   {
     import std.uni : isWhite, isNumber;
 
@@ -118,13 +118,13 @@ if (isInputRange!R && is(ElementType!R : dchar))
       input.popFront;
 
     if (input.empty)
-      return Calc.Symbol(TokenKind.YYEOF);
+      return Symbol(TokenKind.YYEOF);
 
     // Numbers.
     if (input.front.isNumber)
       {
         import std.conv : parse;
-        return Calc.Symbol(TokenKind.NUM, input.parse!int);
+        return Symbol(TokenKind.NUM, input.parse!int);
       }
 
     // Individual characters
@@ -132,13 +132,13 @@ if (isInputRange!R && is(ElementType!R : dchar))
     input.popFront;
     switch (ch)
       {
-      case '+':  return Calc.Symbol(TokenKind.PLUS);
-      case '-':  return Calc.Symbol(TokenKind.MINUS);
-      case '*':  return Calc.Symbol(TokenKind.STAR);
-      case '/':  return Calc.Symbol(TokenKind.SLASH);
-      case '(':  return Calc.Symbol(TokenKind.LPAR);
-      case ')':  return Calc.Symbol(TokenKind.RPAR);
-      case '\n': return Calc.Symbol(TokenKind.EOL);
+      case '+':  return Symbol(TokenKind.PLUS);
+      case '-':  return Symbol(TokenKind.MINUS);
+      case '*':  return Symbol(TokenKind.STAR);
+      case '/':  return Symbol(TokenKind.SLASH);
+      case '(':  return Symbol(TokenKind.LPAR);
+      case ')':  return Symbol(TokenKind.RPAR);
+      case '\n': return Symbol(TokenKind.EOL);
       default: assert(0);
       }
   }
diff --git a/tests/calc.at b/tests/calc.at
index c11ab5c3..1c51d58a 100644
--- a/tests/calc.at
+++ b/tests/calc.at
@@ -590,7 +590,7 @@ class CalcLexer(R) : Lexer
     return res;
   }
 
-  YYParser.Symbol yylex ()
+  Symbol yylex ()
   {]AT_LOCATION_IF([[
     location.begin = location.end;]])[
 
@@ -606,13 +606,13 @@ class CalcLexer(R) : Lexer
 
     // EOF.
     if (input.empty)
-      return YYParser.Symbol(TokenKind.]AT_TOKEN_PREFIX[EOF]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
+      return Symbol(TokenKind.]AT_TOKEN_PREFIX[EOF]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
 
     // Numbers.
     if (input.front.isNumber)
       {
         semanticVal_.ival = parseInt;
-        return YYParser.Symbol(TokenKind.]AT_TOKEN_PREFIX[NUM, semanticVal_.ival]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
+        return Symbol(TokenKind.]AT_TOKEN_PREFIX[NUM, semanticVal_.ival]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
       }
 
     // Individual characters
@@ -630,22 +630,22 @@ class CalcLexer(R) : Lexer
     if (c == '#')
       {
         stderr.writeln (]AT_LOCATION_IF([location, ": ", ])["syntax error: invalid character: '#'");
-        return YYParser.Symbol(TokenKind.]AT_TOKEN_PREFIX[YYerror]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
+        return Symbol(TokenKind.]AT_TOKEN_PREFIX[YYerror]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
       }
 
     switch (c)
     {
-      case '+':  return YYParser.Symbol(TokenKind.]AT_TOKEN_PREFIX[PLUS]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
-      case '-':  return YYParser.Symbol(TokenKind.]AT_TOKEN_PREFIX[MINUS]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
-      case '*':  return YYParser.Symbol(TokenKind.]AT_TOKEN_PREFIX[STAR]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
-      case '/':  return YYParser.Symbol(TokenKind.]AT_TOKEN_PREFIX[SLASH]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
-      case '(':  return YYParser.Symbol(TokenKind.]AT_TOKEN_PREFIX[LPAR]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
-      case ')':  return YYParser.Symbol(TokenKind.]AT_TOKEN_PREFIX[RPAR]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
-      case '\n': return YYParser.Symbol(TokenKind.]AT_TOKEN_PREFIX[EOL]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
-      case '=':  return YYParser.Symbol(TokenKind.]AT_TOKEN_PREFIX[EQUAL]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
-      case '^':  return YYParser.Symbol(TokenKind.]AT_TOKEN_PREFIX[POW]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
-      case '!':  return YYParser.Symbol(TokenKind.]AT_TOKEN_PREFIX[NOT]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
-      default:   return YYParser.Symbol(TokenKind.]AT_TOKEN_PREFIX[YYUNDEF]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
+      case '+':  return Symbol(TokenKind.]AT_TOKEN_PREFIX[PLUS]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
+      case '-':  return Symbol(TokenKind.]AT_TOKEN_PREFIX[MINUS]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
+      case '*':  return Symbol(TokenKind.]AT_TOKEN_PREFIX[STAR]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
+      case '/':  return Symbol(TokenKind.]AT_TOKEN_PREFIX[SLASH]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
+      case '(':  return Symbol(TokenKind.]AT_TOKEN_PREFIX[LPAR]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
+      case ')':  return Symbol(TokenKind.]AT_TOKEN_PREFIX[RPAR]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
+      case '\n': return Symbol(TokenKind.]AT_TOKEN_PREFIX[EOL]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
+      case '=':  return Symbol(TokenKind.]AT_TOKEN_PREFIX[EQUAL]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
+      case '^':  return Symbol(TokenKind.]AT_TOKEN_PREFIX[POW]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
+      case '!':  return Symbol(TokenKind.]AT_TOKEN_PREFIX[NOT]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
+      default:   return Symbol(TokenKind.]AT_TOKEN_PREFIX[YYUNDEF]AT_LOCATION_IF([[, YYLocation(startPos, endPos)]])[);
     }
   }
 }
diff --git a/tests/d.at b/tests/d.at
index 38268c4c..3e83a8af 100644
--- a/tests/d.at
+++ b/tests/d.at
@@ -81,7 +81,7 @@ class CalcLexer(R) : Lexer
   YYSemanticType semanticVal_;
   YYSemanticType semanticVal() @property { return semanticVal_; }
 
-  YYParser.Symbol yylex()
+  Symbol yylex()
   {
     $2
   }
@@ -143,16 +143,16 @@ AT_KEYWORDS([d])
 
 AT_CHECK_D_MINIMAL_W_LEXER([
 %define api.token.raw true
-%union { int ival; }], [return YYParser.Symbol(TokenKind.END);])
+%union { int ival; }], [return Symbol(TokenKind.END);])
 AT_CHECK_D_GREP([[  END = 3,]])
 
 AT_CHECK_D_MINIMAL_W_LEXER([
 %define api.token.raw false
-%union { int ival; }], [return YYParser.Symbol(TokenKind.END);])
+%union { int ival; }], [return Symbol(TokenKind.END);])
 AT_CHECK_D_GREP([[  END = 258,]])
 
 AT_CHECK_D_MINIMAL_W_LEXER([
-%union { int ival; }], [return YYParser.Symbol(TokenKind.END);])
+%union { int ival; }], [return Symbol(TokenKind.END);])
 AT_CHECK_D_GREP([[  END = 3,]])
 
 AT_CLEANUP
diff --git a/tests/scanner.at b/tests/scanner.at
index f19607ff..d0d3f390 100644
--- a/tests/scanner.at
+++ b/tests/scanner.at
@@ -121,12 +121,12 @@ class YYLexer(R) : Lexer
     return semanticVal_;
   }
 
-  YYParser.Symbol yylex ()
+  Symbol yylex ()
   {
     import std.uni : isNumber;
     // Handle EOF.
     if (input.empty)
-      return YYParser.Symbol(TokenKind.END);
+      return Symbol(TokenKind.END);
 
     auto c = input.front;
     input.popFront;
@@ -136,13 +136,13 @@ class YYLexer(R) : Lexer
     {
     case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
       semanticVal_.val = c - '0';
-      return YYParser.Symbol(TokenKind.NUM, semanticVal_.val);
-    case '+': return YYParser.Symbol(TokenKind.PLUS);
-    case '-': return YYParser.Symbol(TokenKind.MINUS);
-    case '*': return YYParser.Symbol(TokenKind.STAR);
-    case '/': return YYParser.Symbol(TokenKind.SLASH);
-    case '(': return YYParser.Symbol(TokenKind.LPAR);
-    case ')': return YYParser.Symbol(TokenKind.RPAR);
+      return Symbol(TokenKind.NUM, semanticVal_.val);
+    case '+': return Symbol(TokenKind.PLUS);
+    case '-': return Symbol(TokenKind.MINUS);
+    case '*': return Symbol(TokenKind.STAR);
+    case '/': return Symbol(TokenKind.SLASH);
+    case '(': return Symbol(TokenKind.LPAR);
+    case ')': return Symbol(TokenKind.RPAR);
     default: assert(0);
     }
   }
-- 
2.17.1

