From b1e43a46df923913bee74e71882cc094e6b488df Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Sun, 15 Dec 2019 22:08:39 +0100
Subject: [PATCH] fix bug with terminal nonterminal attributes, allow shadowing

---
 src/main/jastadd/Analysis.jrag | 5 +++++
 src/main/jastadd/Backend.jadd  | 3 +++
 src/main/jastadd/RelAst.ast    | 1 +
 src/main/jastadd/RelAst.parser | 4 ++--
 4 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/main/jastadd/Analysis.jrag b/src/main/jastadd/Analysis.jrag
index 27f3a7d..d03a679 100644
--- a/src/main/jastadd/Analysis.jrag
+++ b/src/main/jastadd/Analysis.jrag
@@ -105,6 +105,11 @@ aspect ComponentAnalysis {
   //--- isEqual ---
   syn boolean Component.isEqual(Component c) = this.getClass() == c.getClass() && getTypeUse().isEqual(c.getTypeUse());
 
+  /**
+   * TokenComponents may be specialized by NTATokenComponents and vice versa
+   */
+  eq TokenComponent.isEqual(Component c) = (c instanceof TokenComponent) && getTypeUse().isEqual(c.getTypeUse());
+
   syn boolean TypeUse.isEqual(TypeUse u);
   eq SimpleTypeUse.isEqual(TypeUse u) = u instanceof SimpleTypeUse && getID().equals(u.getID());
   eq ParameterizedTypeUse.isEqual(TypeUse u) {
diff --git a/src/main/jastadd/Backend.jadd b/src/main/jastadd/Backend.jadd
index 26591c0..cab17e1 100644
--- a/src/main/jastadd/Backend.jadd
+++ b/src/main/jastadd/Backend.jadd
@@ -111,6 +111,9 @@ aspect BackendAbstractGrammar {
   public String TokenComponent.generateAbstractGrammar() {
     return "<" + getID() + ":" + getTypeUse() + ">";
   }
+  public String NTATokenComponent.generateAbstractGrammar() {
+    return "/<" + getID() + ":" + getTypeUse() + ">/";
+  }
 
   public String RelationComponent.generateAbstractGrammar() {
     return "<" + getImplAttributeName() + ":" + ofTypeDecl() + ">";
diff --git a/src/main/jastadd/RelAst.ast b/src/main/jastadd/RelAst.ast
index f0132fc..31083b9 100644
--- a/src/main/jastadd/RelAst.ast
+++ b/src/main/jastadd/RelAst.ast
@@ -11,6 +11,7 @@ NTAComponent : SimpleTypeComponent;
 NTAOptComponent : SimpleTypeComponent;
 NTAListComponent : SimpleTypeComponent;
 TokenComponent : Component ::= TypeUse;
+NTATokenComponent : TokenComponent ::= TypeUse;
 
 abstract TypeUse ::= <ID>;
 SimpleTypeUse : TypeUse;
diff --git a/src/main/jastadd/RelAst.parser b/src/main/jastadd/RelAst.parser
index 6b138b9..f043efd 100644
--- a/src/main/jastadd/RelAst.parser
+++ b/src/main/jastadd/RelAst.parser
@@ -75,8 +75,8 @@ Component component =
   | SLASH ID COL s_type_use.u SLASH           {: return new NTAComponent(ID, u); :}
   | SLASH s_type_use.u SLASH                  {: return new NTAComponent(u.getID(), u); :}
   // NTA Token (same as NTA)
-  | SLASH LT ID COL s_type_use.u GT SLASH     {: return new NTAComponent(ID, u); :}
-  | SLASH LT s_type_use.u GT SLASH            {: return new NTAComponent(u.getID(), u); :}
+  | SLASH LT ID COL s_type_use.u GT SLASH     {: return new NTATokenComponent(ID, u); :}
+  | SLASH LT s_type_use.u GT SLASH            {: return new NTATokenComponent(u.getID(), u); :}
   // Token
   | LT ID COL type_use.u GT                   {: return new TokenComponent(ID, u); :}
   | LT ID GT                                  {: return new TokenComponent(ID, new SimpleTypeUse("String")); :}
-- 
GitLab