From b324cf25981a7d2112e34378912d96a496e0d103 Mon Sep 17 00:00:00 2001
From: dgelessus <dgelessus@users.noreply.github.com>
Date: Wed, 20 Apr 2022 11:24:36 +0200
Subject: [PATCH] Reimplement clone methods using copy constructors

This ensures that superclass fields are copied correctly, most
importantly node position info, which was previously lost when cloning.
---
 .../stups/sablecc/patch/PositionedNode.java   | 13 ++++
 .../java/org/sablecc/sablecc/GenAlts.java     |  6 +-
 .../java/org/sablecc/sablecc/node/AAlt.java   | 13 ++--
 .../sablecc/sablecc/node/AAltTransform.java   | 13 ++--
 .../java/org/sablecc/sablecc/node/AAst.java   |  9 ++-
 .../org/sablecc/sablecc/node/AAstAlt.java     | 11 +++-
 .../org/sablecc/sablecc/node/AAstProd.java    | 11 +++-
 .../org/sablecc/sablecc/node/ACharBasic.java  |  9 ++-
 .../org/sablecc/sablecc/node/ACharChar.java   |  9 ++-
 .../org/sablecc/sablecc/node/AConcat.java     |  9 ++-
 .../org/sablecc/sablecc/node/ADecChar.java    |  9 ++-
 .../java/org/sablecc/sablecc/node/AElem.java  | 15 +++--
 .../org/sablecc/sablecc/node/AGrammar.java    | 21 ++++---
 .../org/sablecc/sablecc/node/AHelperDef.java  | 11 +++-
 .../org/sablecc/sablecc/node/AHelpers.java    |  9 ++-
 .../org/sablecc/sablecc/node/AHexChar.java    |  9 ++-
 .../org/sablecc/sablecc/node/AIdBasic.java    |  9 ++-
 .../org/sablecc/sablecc/node/AIgnTokens.java  |  9 ++-
 .../sablecc/sablecc/node/AIntervalSet.java    | 11 +++-
 .../org/sablecc/sablecc/node/AListTerm.java   | 11 +++-
 .../org/sablecc/sablecc/node/AMinusBinOp.java |  7 ++-
 .../sablecc/sablecc/node/ANewListTerm.java    | 13 ++--
 .../org/sablecc/sablecc/node/ANewTerm.java    | 13 ++--
 .../org/sablecc/sablecc/node/ANullTerm.java   |  7 ++-
 .../sablecc/sablecc/node/AOperationSet.java   | 13 ++--
 .../org/sablecc/sablecc/node/APlusBinOp.java  |  7 ++-
 .../org/sablecc/sablecc/node/APlusUnOp.java   |  9 ++-
 .../java/org/sablecc/sablecc/node/AProd.java  | 15 +++--
 .../org/sablecc/sablecc/node/AProdName.java   | 11 +++-
 .../sablecc/node/AProductionSpecifier.java    |  7 ++-
 .../sablecc/sablecc/node/AProductions.java    |  9 ++-
 .../org/sablecc/sablecc/node/AQMarkUnOp.java  |  9 ++-
 .../org/sablecc/sablecc/node/ARegExp.java     |  9 ++-
 .../sablecc/sablecc/node/ARegExpBasic.java    |  9 ++-
 .../org/sablecc/sablecc/node/ASetBasic.java   |  9 ++-
 .../sablecc/sablecc/node/ASimpleListTerm.java | 13 ++--
 .../org/sablecc/sablecc/node/ASimpleTerm.java | 13 ++--
 .../org/sablecc/sablecc/node/AStarUnOp.java   |  9 ++-
 .../org/sablecc/sablecc/node/AStateList.java  | 13 ++--
 .../sablecc/sablecc/node/AStateListTail.java  | 11 +++-
 .../org/sablecc/sablecc/node/AStates.java     |  9 ++-
 .../sablecc/sablecc/node/AStringBasic.java    |  9 ++-
 .../org/sablecc/sablecc/node/ATokenDef.java   | 17 ++++--
 .../sablecc/sablecc/node/ATokenSpecifier.java |  7 ++-
 .../org/sablecc/sablecc/node/ATokens.java     |  9 ++-
 .../org/sablecc/sablecc/node/ATransition.java |  9 ++-
 .../java/org/sablecc/sablecc/node/AUnExp.java | 11 +++-
 .../java/org/sablecc/sablecc/node/EOF.java    | 13 ++--
 .../java/org/sablecc/sablecc/node/Node.java   | 11 ++++
 .../java/org/sablecc/sablecc/node/PAlt.java   |  8 +++
 .../sablecc/sablecc/node/PAltTransform.java   |  8 +++
 .../java/org/sablecc/sablecc/node/PAst.java   |  8 +++
 .../org/sablecc/sablecc/node/PAstAlt.java     |  8 +++
 .../org/sablecc/sablecc/node/PAstProd.java    |  8 +++
 .../java/org/sablecc/sablecc/node/PBasic.java |  8 +++
 .../java/org/sablecc/sablecc/node/PBinOp.java |  8 +++
 .../java/org/sablecc/sablecc/node/PChar.java  |  8 +++
 .../org/sablecc/sablecc/node/PConcat.java     |  8 +++
 .../java/org/sablecc/sablecc/node/PElem.java  |  8 +++
 .../org/sablecc/sablecc/node/PGrammar.java    |  8 +++
 .../org/sablecc/sablecc/node/PHelperDef.java  |  8 +++
 .../org/sablecc/sablecc/node/PHelpers.java    |  8 +++
 .../org/sablecc/sablecc/node/PIgnTokens.java  |  8 +++
 .../org/sablecc/sablecc/node/PListTerm.java   |  8 +++
 .../java/org/sablecc/sablecc/node/PProd.java  |  8 +++
 .../org/sablecc/sablecc/node/PProdName.java   |  8 +++
 .../sablecc/sablecc/node/PProductions.java    |  8 +++
 .../org/sablecc/sablecc/node/PRegExp.java     |  8 +++
 .../java/org/sablecc/sablecc/node/PSet.java   |  8 +++
 .../org/sablecc/sablecc/node/PSpecifier.java  |  8 +++
 .../org/sablecc/sablecc/node/PStateList.java  |  8 +++
 .../sablecc/sablecc/node/PStateListTail.java  |  8 +++
 .../org/sablecc/sablecc/node/PStates.java     |  8 +++
 .../java/org/sablecc/sablecc/node/PTerm.java  |  8 +++
 .../org/sablecc/sablecc/node/PTokenDef.java   |  8 +++
 .../org/sablecc/sablecc/node/PTokens.java     |  8 +++
 .../org/sablecc/sablecc/node/PTransition.java |  8 +++
 .../java/org/sablecc/sablecc/node/PUnExp.java |  8 +++
 .../java/org/sablecc/sablecc/node/PUnOp.java  |  8 +++
 .../java/org/sablecc/sablecc/node/Start.java  | 11 +++-
 .../org/sablecc/sablecc/node/TAbstract.java   | 13 ++--
 .../java/org/sablecc/sablecc/node/TArrow.java | 13 ++--
 .../java/org/sablecc/sablecc/node/TBar.java   | 13 ++--
 .../java/org/sablecc/sablecc/node/TBlank.java | 13 ++--
 .../java/org/sablecc/sablecc/node/TChar.java  | 13 ++--
 .../java/org/sablecc/sablecc/node/TColon.java | 13 ++--
 .../java/org/sablecc/sablecc/node/TComma.java | 13 ++--
 .../org/sablecc/sablecc/node/TComment.java    | 13 ++--
 .../java/org/sablecc/sablecc/node/TDDot.java  | 13 ++--
 .../org/sablecc/sablecc/node/TDecChar.java    | 13 ++--
 .../java/org/sablecc/sablecc/node/TDot.java   | 13 ++--
 .../java/org/sablecc/sablecc/node/TEqual.java | 13 ++--
 .../org/sablecc/sablecc/node/THelpers.java    | 13 ++--
 .../org/sablecc/sablecc/node/THexChar.java    | 13 ++--
 .../java/org/sablecc/sablecc/node/TId.java    | 13 ++--
 .../org/sablecc/sablecc/node/TIgnored.java    | 13 ++--
 .../java/org/sablecc/sablecc/node/TLBkt.java  | 13 ++--
 .../org/sablecc/sablecc/node/TLBrace.java     | 13 ++--
 .../java/org/sablecc/sablecc/node/TLPar.java  | 13 ++--
 .../java/org/sablecc/sablecc/node/TMinus.java | 13 ++--
 .../java/org/sablecc/sablecc/node/TNew.java   | 13 ++--
 .../java/org/sablecc/sablecc/node/TNull.java  | 13 ++--
 .../org/sablecc/sablecc/node/TPackage.java    | 13 ++--
 .../java/org/sablecc/sablecc/node/TPkgId.java | 13 ++--
 .../java/org/sablecc/sablecc/node/TPlus.java  | 13 ++--
 .../sablecc/node/TProductionSpecifier.java    | 13 ++--
 .../sablecc/sablecc/node/TProductions.java    | 13 ++--
 .../java/org/sablecc/sablecc/node/TQMark.java | 13 ++--
 .../java/org/sablecc/sablecc/node/TRBkt.java  | 13 ++--
 .../org/sablecc/sablecc/node/TRBrace.java     | 13 ++--
 .../java/org/sablecc/sablecc/node/TRPar.java  | 13 ++--
 .../org/sablecc/sablecc/node/TSemicolon.java  | 13 ++--
 .../java/org/sablecc/sablecc/node/TSlash.java | 13 ++--
 .../java/org/sablecc/sablecc/node/TStar.java  | 13 ++--
 .../org/sablecc/sablecc/node/TStates.java     | 13 ++--
 .../org/sablecc/sablecc/node/TString.java     | 13 ++--
 .../org/sablecc/sablecc/node/TSyntax.java     | 13 ++--
 .../sablecc/sablecc/node/TTokenSpecifier.java | 13 ++--
 .../org/sablecc/sablecc/node/TTokens.java     | 13 ++--
 .../java/org/sablecc/sablecc/node/TTree.java  | 13 ++--
 .../java/org/sablecc/sablecc/node/Token.java  | 25 ++++++++
 .../org/sablecc/sablecc/alternatives.txt      | 17 ++++--
 .../org/sablecc/sablecc/productions.txt       |  8 +++
 .../resources/org/sablecc/sablecc/tokens.txt  | 26 ++++----
 .../resources/org/sablecc/sablecc/utils.txt   | 60 ++++++++++++++++---
 125 files changed, 1065 insertions(+), 360 deletions(-)

diff --git a/sablecc-runtime/src/main/java/de/hhu/stups/sablecc/patch/PositionedNode.java b/sablecc-runtime/src/main/java/de/hhu/stups/sablecc/patch/PositionedNode.java
index d26abd4..574d0e9 100644
--- a/sablecc-runtime/src/main/java/de/hhu/stups/sablecc/patch/PositionedNode.java
+++ b/sablecc-runtime/src/main/java/de/hhu/stups/sablecc/patch/PositionedNode.java
@@ -10,6 +10,19 @@ public class PositionedNode {
   private SourcePosition startPos;
   private SourcePosition endPos;
 
+  public PositionedNode(final SourcePosition startPos, final SourcePosition endPos) {
+    this.startPos = startPos;
+    this.endPos = endPos;
+  }
+
+  public PositionedNode() {
+    this(null, null);
+  }
+
+  public PositionedNode(final PositionedNode node) {
+    this(node.startPos, node.endPos);
+  }
+
   public SourcePosition getStartPos() {
     /*
      * Special treatment for tokens because they don't get a position in the
diff --git a/src/main/java/org/sablecc/sablecc/GenAlts.java b/src/main/java/org/sablecc/sablecc/GenAlts.java
index 3edc043..8d92b5f 100644
--- a/src/main/java/org/sablecc/sablecc/GenAlts.java
+++ b/src/main/java/org/sablecc/sablecc/GenAlts.java
@@ -247,20 +247,20 @@ public class GenAlts extends DepthFirstAdapter
           case ElemInfo.NONE:
             {
               macros.apply(file, "CloneBodyNode",
-                           new String[] {info.type, nodeName(info.name), i.hasNext() ? "," : ""});
+                           new String[] {info.name, nodeName(info.name)});
             }
             break;
           case ElemInfo.STAR:
           case ElemInfo.PLUS:
             {
               macros.apply(file, "CloneBodyList",
-                           new String[] {nodeName(info.name), i.hasNext() ? "," : ""});
+                           new String[] {info.name, nodeName(info.name)});
             }
             break;
           }
       }
 
-      macros.apply(file, "CloneTail", null);
+      macros.apply(file, "CloneTail", new String[] {name});
 
       macros.apply(file, "Apply", new String[] {name});
 
diff --git a/src/main/java/org/sablecc/sablecc/node/AAlt.java b/src/main/java/org/sablecc/sablecc/node/AAlt.java
index 2d7f69f..144ab37 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAlt.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAlt.java
@@ -31,13 +31,18 @@ public final class AAlt extends PAlt
 
     }
 
+    public AAlt(AAlt node)
+    {
+        super(node);
+        setAltName(cloneNode(node._altName_));
+        setElems(cloneList(node._elems_));
+        setAltTransform(cloneNode(node._altTransform_));
+    }
+
     @Override
     public AAlt clone()
     {
-        return new AAlt(
-            cloneNode(this._altName_),
-            cloneList(this._elems_),
-            cloneNode(this._altTransform_));
+        return new AAlt(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AAltTransform.java b/src/main/java/org/sablecc/sablecc/node/AAltTransform.java
index 1693eda..16c9d4d 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAltTransform.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAltTransform.java
@@ -31,13 +31,18 @@ public final class AAltTransform extends PAltTransform
 
     }
 
+    public AAltTransform(AAltTransform node)
+    {
+        super(node);
+        setLBrace(cloneNode(node._lBrace_));
+        setTerms(cloneList(node._terms_));
+        setRBrace(cloneNode(node._rBrace_));
+    }
+
     @Override
     public AAltTransform clone()
     {
-        return new AAltTransform(
-            cloneNode(this._lBrace_),
-            cloneList(this._terms_),
-            cloneNode(this._rBrace_));
+        return new AAltTransform(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AAst.java b/src/main/java/org/sablecc/sablecc/node/AAst.java
index ae6e7e3..c5002df 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAst.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAst.java
@@ -23,11 +23,16 @@ public final class AAst extends PAst
 
     }
 
+    public AAst(AAst node)
+    {
+        super(node);
+        setProds(cloneList(node._prods_));
+    }
+
     @Override
     public AAst clone()
     {
-        return new AAst(
-            cloneList(this._prods_));
+        return new AAst(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AAstAlt.java b/src/main/java/org/sablecc/sablecc/node/AAstAlt.java
index e847561..ade7c7e 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAstAlt.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAstAlt.java
@@ -27,12 +27,17 @@ public final class AAstAlt extends PAstAlt
 
     }
 
+    public AAstAlt(AAstAlt node)
+    {
+        super(node);
+        setAltName(cloneNode(node._altName_));
+        setElems(cloneList(node._elems_));
+    }
+
     @Override
     public AAstAlt clone()
     {
-        return new AAstAlt(
-            cloneNode(this._altName_),
-            cloneList(this._elems_));
+        return new AAstAlt(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AAstProd.java b/src/main/java/org/sablecc/sablecc/node/AAstProd.java
index a261769f..bf451c6 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAstProd.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAstProd.java
@@ -27,12 +27,17 @@ public final class AAstProd extends PAstProd
 
     }
 
+    public AAstProd(AAstProd node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+        setAlts(cloneList(node._alts_));
+    }
+
     @Override
     public AAstProd clone()
     {
-        return new AAstProd(
-            cloneNode(this._id_),
-            cloneList(this._alts_));
+        return new AAstProd(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ACharBasic.java b/src/main/java/org/sablecc/sablecc/node/ACharBasic.java
index c4d4d2a..e2c2c29 100644
--- a/src/main/java/org/sablecc/sablecc/node/ACharBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/ACharBasic.java
@@ -22,11 +22,16 @@ public final class ACharBasic extends PBasic
 
     }
 
+    public ACharBasic(ACharBasic node)
+    {
+        super(node);
+        setChar(cloneNode(node._char_));
+    }
+
     @Override
     public ACharBasic clone()
     {
-        return new ACharBasic(
-            cloneNode(this._char_));
+        return new ACharBasic(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ACharChar.java b/src/main/java/org/sablecc/sablecc/node/ACharChar.java
index 37a29b8..c843556 100644
--- a/src/main/java/org/sablecc/sablecc/node/ACharChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/ACharChar.java
@@ -22,11 +22,16 @@ public final class ACharChar extends PChar
 
     }
 
+    public ACharChar(ACharChar node)
+    {
+        super(node);
+        setChar(cloneNode(node._char_));
+    }
+
     @Override
     public ACharChar clone()
     {
-        return new ACharChar(
-            cloneNode(this._char_));
+        return new ACharChar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AConcat.java b/src/main/java/org/sablecc/sablecc/node/AConcat.java
index 9b5977a..a3c666d 100644
--- a/src/main/java/org/sablecc/sablecc/node/AConcat.java
+++ b/src/main/java/org/sablecc/sablecc/node/AConcat.java
@@ -23,11 +23,16 @@ public final class AConcat extends PConcat
 
     }
 
+    public AConcat(AConcat node)
+    {
+        super(node);
+        setUnExps(cloneList(node._unExps_));
+    }
+
     @Override
     public AConcat clone()
     {
-        return new AConcat(
-            cloneList(this._unExps_));
+        return new AConcat(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ADecChar.java b/src/main/java/org/sablecc/sablecc/node/ADecChar.java
index 92025a2..31c5033 100644
--- a/src/main/java/org/sablecc/sablecc/node/ADecChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/ADecChar.java
@@ -22,11 +22,16 @@ public final class ADecChar extends PChar
 
     }
 
+    public ADecChar(ADecChar node)
+    {
+        super(node);
+        setDecChar(cloneNode(node._decChar_));
+    }
+
     @Override
     public ADecChar clone()
     {
-        return new ADecChar(
-            cloneNode(this._decChar_));
+        return new ADecChar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AElem.java b/src/main/java/org/sablecc/sablecc/node/AElem.java
index 9b1daba..70985fa 100644
--- a/src/main/java/org/sablecc/sablecc/node/AElem.java
+++ b/src/main/java/org/sablecc/sablecc/node/AElem.java
@@ -34,14 +34,19 @@ public final class AElem extends PElem
 
     }
 
+    public AElem(AElem node)
+    {
+        super(node);
+        setElemName(cloneNode(node._elemName_));
+        setSpecifier(cloneNode(node._specifier_));
+        setId(cloneNode(node._id_));
+        setUnOp(cloneNode(node._unOp_));
+    }
+
     @Override
     public AElem clone()
     {
-        return new AElem(
-            cloneNode(this._elemName_),
-            cloneNode(this._specifier_),
-            cloneNode(this._id_),
-            cloneNode(this._unOp_));
+        return new AElem(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AGrammar.java b/src/main/java/org/sablecc/sablecc/node/AGrammar.java
index 9a3c3b4..1408be1 100644
--- a/src/main/java/org/sablecc/sablecc/node/AGrammar.java
+++ b/src/main/java/org/sablecc/sablecc/node/AGrammar.java
@@ -47,17 +47,22 @@ public final class AGrammar extends PGrammar
 
     }
 
+    public AGrammar(AGrammar node)
+    {
+        super(node);
+        setPackage(cloneList(node._package_));
+        setHelpers(cloneNode(node._helpers_));
+        setStates(cloneNode(node._states_));
+        setTokens(cloneNode(node._tokens_));
+        setIgnTokens(cloneNode(node._ignTokens_));
+        setProductions(cloneNode(node._productions_));
+        setAst(cloneNode(node._ast_));
+    }
+
     @Override
     public AGrammar clone()
     {
-        return new AGrammar(
-            cloneList(this._package_),
-            cloneNode(this._helpers_),
-            cloneNode(this._states_),
-            cloneNode(this._tokens_),
-            cloneNode(this._ignTokens_),
-            cloneNode(this._productions_),
-            cloneNode(this._ast_));
+        return new AGrammar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AHelperDef.java b/src/main/java/org/sablecc/sablecc/node/AHelperDef.java
index 9b9a773..872f966 100644
--- a/src/main/java/org/sablecc/sablecc/node/AHelperDef.java
+++ b/src/main/java/org/sablecc/sablecc/node/AHelperDef.java
@@ -26,12 +26,17 @@ public final class AHelperDef extends PHelperDef
 
     }
 
+    public AHelperDef(AHelperDef node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+        setRegExp(cloneNode(node._regExp_));
+    }
+
     @Override
     public AHelperDef clone()
     {
-        return new AHelperDef(
-            cloneNode(this._id_),
-            cloneNode(this._regExp_));
+        return new AHelperDef(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AHelpers.java b/src/main/java/org/sablecc/sablecc/node/AHelpers.java
index 2205d2b..5b5f96a 100644
--- a/src/main/java/org/sablecc/sablecc/node/AHelpers.java
+++ b/src/main/java/org/sablecc/sablecc/node/AHelpers.java
@@ -23,11 +23,16 @@ public final class AHelpers extends PHelpers
 
     }
 
+    public AHelpers(AHelpers node)
+    {
+        super(node);
+        setHelperDefs(cloneList(node._helperDefs_));
+    }
+
     @Override
     public AHelpers clone()
     {
-        return new AHelpers(
-            cloneList(this._helperDefs_));
+        return new AHelpers(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AHexChar.java b/src/main/java/org/sablecc/sablecc/node/AHexChar.java
index d20a390..0391372 100644
--- a/src/main/java/org/sablecc/sablecc/node/AHexChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/AHexChar.java
@@ -22,11 +22,16 @@ public final class AHexChar extends PChar
 
     }
 
+    public AHexChar(AHexChar node)
+    {
+        super(node);
+        setHexChar(cloneNode(node._hexChar_));
+    }
+
     @Override
     public AHexChar clone()
     {
-        return new AHexChar(
-            cloneNode(this._hexChar_));
+        return new AHexChar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AIdBasic.java b/src/main/java/org/sablecc/sablecc/node/AIdBasic.java
index 8b90894..8ce3a09 100644
--- a/src/main/java/org/sablecc/sablecc/node/AIdBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/AIdBasic.java
@@ -22,11 +22,16 @@ public final class AIdBasic extends PBasic
 
     }
 
+    public AIdBasic(AIdBasic node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+    }
+
     @Override
     public AIdBasic clone()
     {
-        return new AIdBasic(
-            cloneNode(this._id_));
+        return new AIdBasic(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AIgnTokens.java b/src/main/java/org/sablecc/sablecc/node/AIgnTokens.java
index 5fad1bc..4e89102 100644
--- a/src/main/java/org/sablecc/sablecc/node/AIgnTokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/AIgnTokens.java
@@ -23,11 +23,16 @@ public final class AIgnTokens extends PIgnTokens
 
     }
 
+    public AIgnTokens(AIgnTokens node)
+    {
+        super(node);
+        setListId(cloneList(node._listId_));
+    }
+
     @Override
     public AIgnTokens clone()
     {
-        return new AIgnTokens(
-            cloneList(this._listId_));
+        return new AIgnTokens(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AIntervalSet.java b/src/main/java/org/sablecc/sablecc/node/AIntervalSet.java
index 4d18203..dbd1b00 100644
--- a/src/main/java/org/sablecc/sablecc/node/AIntervalSet.java
+++ b/src/main/java/org/sablecc/sablecc/node/AIntervalSet.java
@@ -26,12 +26,17 @@ public final class AIntervalSet extends PSet
 
     }
 
+    public AIntervalSet(AIntervalSet node)
+    {
+        super(node);
+        setLeft(cloneNode(node._left_));
+        setRight(cloneNode(node._right_));
+    }
+
     @Override
     public AIntervalSet clone()
     {
-        return new AIntervalSet(
-            cloneNode(this._left_),
-            cloneNode(this._right_));
+        return new AIntervalSet(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AListTerm.java b/src/main/java/org/sablecc/sablecc/node/AListTerm.java
index d8ac882..33ef29c 100644
--- a/src/main/java/org/sablecc/sablecc/node/AListTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/AListTerm.java
@@ -27,12 +27,17 @@ public final class AListTerm extends PTerm
 
     }
 
+    public AListTerm(AListTerm node)
+    {
+        super(node);
+        setLBkt(cloneNode(node._lBkt_));
+        setListTerms(cloneList(node._listTerms_));
+    }
+
     @Override
     public AListTerm clone()
     {
-        return new AListTerm(
-            cloneNode(this._lBkt_),
-            cloneList(this._listTerms_));
+        return new AListTerm(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AMinusBinOp.java b/src/main/java/org/sablecc/sablecc/node/AMinusBinOp.java
index 835b9ff..f83b25f 100644
--- a/src/main/java/org/sablecc/sablecc/node/AMinusBinOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/AMinusBinOp.java
@@ -13,10 +13,15 @@ public final class AMinusBinOp extends PBinOp
         // Constructor
     }
 
+    public AMinusBinOp(AMinusBinOp node)
+    {
+        super(node);
+    }
+
     @Override
     public AMinusBinOp clone()
     {
-        return new AMinusBinOp();
+        return new AMinusBinOp(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ANewListTerm.java b/src/main/java/org/sablecc/sablecc/node/ANewListTerm.java
index 43dd3b2..d90bcba 100644
--- a/src/main/java/org/sablecc/sablecc/node/ANewListTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ANewListTerm.java
@@ -31,13 +31,18 @@ public final class ANewListTerm extends PListTerm
 
     }
 
+    public ANewListTerm(ANewListTerm node)
+    {
+        super(node);
+        setProdName(cloneNode(node._prodName_));
+        setLPar(cloneNode(node._lPar_));
+        setParams(cloneList(node._params_));
+    }
+
     @Override
     public ANewListTerm clone()
     {
-        return new ANewListTerm(
-            cloneNode(this._prodName_),
-            cloneNode(this._lPar_),
-            cloneList(this._params_));
+        return new ANewListTerm(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ANewTerm.java b/src/main/java/org/sablecc/sablecc/node/ANewTerm.java
index be1dc74..5b15adb 100644
--- a/src/main/java/org/sablecc/sablecc/node/ANewTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ANewTerm.java
@@ -31,13 +31,18 @@ public final class ANewTerm extends PTerm
 
     }
 
+    public ANewTerm(ANewTerm node)
+    {
+        super(node);
+        setProdName(cloneNode(node._prodName_));
+        setLPar(cloneNode(node._lPar_));
+        setParams(cloneList(node._params_));
+    }
+
     @Override
     public ANewTerm clone()
     {
-        return new ANewTerm(
-            cloneNode(this._prodName_),
-            cloneNode(this._lPar_),
-            cloneList(this._params_));
+        return new ANewTerm(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ANullTerm.java b/src/main/java/org/sablecc/sablecc/node/ANullTerm.java
index 8a02cd2..7054505 100644
--- a/src/main/java/org/sablecc/sablecc/node/ANullTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ANullTerm.java
@@ -13,10 +13,15 @@ public final class ANullTerm extends PTerm
         // Constructor
     }
 
+    public ANullTerm(ANullTerm node)
+    {
+        super(node);
+    }
+
     @Override
     public ANullTerm clone()
     {
-        return new ANullTerm();
+        return new ANullTerm(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AOperationSet.java b/src/main/java/org/sablecc/sablecc/node/AOperationSet.java
index 3e89f90..d34ea90 100644
--- a/src/main/java/org/sablecc/sablecc/node/AOperationSet.java
+++ b/src/main/java/org/sablecc/sablecc/node/AOperationSet.java
@@ -30,13 +30,18 @@ public final class AOperationSet extends PSet
 
     }
 
+    public AOperationSet(AOperationSet node)
+    {
+        super(node);
+        setLeft(cloneNode(node._left_));
+        setBinOp(cloneNode(node._binOp_));
+        setRight(cloneNode(node._right_));
+    }
+
     @Override
     public AOperationSet clone()
     {
-        return new AOperationSet(
-            cloneNode(this._left_),
-            cloneNode(this._binOp_),
-            cloneNode(this._right_));
+        return new AOperationSet(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/APlusBinOp.java b/src/main/java/org/sablecc/sablecc/node/APlusBinOp.java
index 30b4a0c..37600cb 100644
--- a/src/main/java/org/sablecc/sablecc/node/APlusBinOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/APlusBinOp.java
@@ -13,10 +13,15 @@ public final class APlusBinOp extends PBinOp
         // Constructor
     }
 
+    public APlusBinOp(APlusBinOp node)
+    {
+        super(node);
+    }
+
     @Override
     public APlusBinOp clone()
     {
-        return new APlusBinOp();
+        return new APlusBinOp(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/APlusUnOp.java b/src/main/java/org/sablecc/sablecc/node/APlusUnOp.java
index 9ecf271..d31ac09 100644
--- a/src/main/java/org/sablecc/sablecc/node/APlusUnOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/APlusUnOp.java
@@ -22,11 +22,16 @@ public final class APlusUnOp extends PUnOp
 
     }
 
+    public APlusUnOp(APlusUnOp node)
+    {
+        super(node);
+        setPlus(cloneNode(node._plus_));
+    }
+
     @Override
     public APlusUnOp clone()
     {
-        return new APlusUnOp(
-            cloneNode(this._plus_));
+        return new APlusUnOp(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AProd.java b/src/main/java/org/sablecc/sablecc/node/AProd.java
index 829b66b..d058034 100644
--- a/src/main/java/org/sablecc/sablecc/node/AProd.java
+++ b/src/main/java/org/sablecc/sablecc/node/AProd.java
@@ -35,14 +35,19 @@ public final class AProd extends PProd
 
     }
 
+    public AProd(AProd node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+        setArrow(cloneNode(node._arrow_));
+        setProdTransform(cloneList(node._prodTransform_));
+        setAlts(cloneList(node._alts_));
+    }
+
     @Override
     public AProd clone()
     {
-        return new AProd(
-            cloneNode(this._id_),
-            cloneNode(this._arrow_),
-            cloneList(this._prodTransform_),
-            cloneList(this._alts_));
+        return new AProd(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AProdName.java b/src/main/java/org/sablecc/sablecc/node/AProdName.java
index 272d4a2..48d5ed2 100644
--- a/src/main/java/org/sablecc/sablecc/node/AProdName.java
+++ b/src/main/java/org/sablecc/sablecc/node/AProdName.java
@@ -26,12 +26,17 @@ public final class AProdName extends PProdName
 
     }
 
+    public AProdName(AProdName node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+        setProdNameTail(cloneNode(node._prodNameTail_));
+    }
+
     @Override
     public AProdName clone()
     {
-        return new AProdName(
-            cloneNode(this._id_),
-            cloneNode(this._prodNameTail_));
+        return new AProdName(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AProductionSpecifier.java b/src/main/java/org/sablecc/sablecc/node/AProductionSpecifier.java
index 3e958ec..df84feb 100644
--- a/src/main/java/org/sablecc/sablecc/node/AProductionSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/AProductionSpecifier.java
@@ -13,10 +13,15 @@ public final class AProductionSpecifier extends PSpecifier
         // Constructor
     }
 
+    public AProductionSpecifier(AProductionSpecifier node)
+    {
+        super(node);
+    }
+
     @Override
     public AProductionSpecifier clone()
     {
-        return new AProductionSpecifier();
+        return new AProductionSpecifier(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AProductions.java b/src/main/java/org/sablecc/sablecc/node/AProductions.java
index 3feac8c..d5078d5 100644
--- a/src/main/java/org/sablecc/sablecc/node/AProductions.java
+++ b/src/main/java/org/sablecc/sablecc/node/AProductions.java
@@ -23,11 +23,16 @@ public final class AProductions extends PProductions
 
     }
 
+    public AProductions(AProductions node)
+    {
+        super(node);
+        setProds(cloneList(node._prods_));
+    }
+
     @Override
     public AProductions clone()
     {
-        return new AProductions(
-            cloneList(this._prods_));
+        return new AProductions(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AQMarkUnOp.java b/src/main/java/org/sablecc/sablecc/node/AQMarkUnOp.java
index aa2b81f..da78e87 100644
--- a/src/main/java/org/sablecc/sablecc/node/AQMarkUnOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/AQMarkUnOp.java
@@ -22,11 +22,16 @@ public final class AQMarkUnOp extends PUnOp
 
     }
 
+    public AQMarkUnOp(AQMarkUnOp node)
+    {
+        super(node);
+        setQMark(cloneNode(node._qMark_));
+    }
+
     @Override
     public AQMarkUnOp clone()
     {
-        return new AQMarkUnOp(
-            cloneNode(this._qMark_));
+        return new AQMarkUnOp(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ARegExp.java b/src/main/java/org/sablecc/sablecc/node/ARegExp.java
index 18ca2e4..e9a9eed 100644
--- a/src/main/java/org/sablecc/sablecc/node/ARegExp.java
+++ b/src/main/java/org/sablecc/sablecc/node/ARegExp.java
@@ -23,11 +23,16 @@ public final class ARegExp extends PRegExp
 
     }
 
+    public ARegExp(ARegExp node)
+    {
+        super(node);
+        setConcats(cloneList(node._concats_));
+    }
+
     @Override
     public ARegExp clone()
     {
-        return new ARegExp(
-            cloneList(this._concats_));
+        return new ARegExp(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ARegExpBasic.java b/src/main/java/org/sablecc/sablecc/node/ARegExpBasic.java
index 50cec72..1c29eec 100644
--- a/src/main/java/org/sablecc/sablecc/node/ARegExpBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/ARegExpBasic.java
@@ -22,11 +22,16 @@ public final class ARegExpBasic extends PBasic
 
     }
 
+    public ARegExpBasic(ARegExpBasic node)
+    {
+        super(node);
+        setRegExp(cloneNode(node._regExp_));
+    }
+
     @Override
     public ARegExpBasic clone()
     {
-        return new ARegExpBasic(
-            cloneNode(this._regExp_));
+        return new ARegExpBasic(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ASetBasic.java b/src/main/java/org/sablecc/sablecc/node/ASetBasic.java
index 1c747e4..9c26ab0 100644
--- a/src/main/java/org/sablecc/sablecc/node/ASetBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/ASetBasic.java
@@ -22,11 +22,16 @@ public final class ASetBasic extends PBasic
 
     }
 
+    public ASetBasic(ASetBasic node)
+    {
+        super(node);
+        setSet(cloneNode(node._set_));
+    }
+
     @Override
     public ASetBasic clone()
     {
-        return new ASetBasic(
-            cloneNode(this._set_));
+        return new ASetBasic(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ASimpleListTerm.java b/src/main/java/org/sablecc/sablecc/node/ASimpleListTerm.java
index 4187c1e..7821735 100644
--- a/src/main/java/org/sablecc/sablecc/node/ASimpleListTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ASimpleListTerm.java
@@ -30,13 +30,18 @@ public final class ASimpleListTerm extends PListTerm
 
     }
 
+    public ASimpleListTerm(ASimpleListTerm node)
+    {
+        super(node);
+        setSpecifier(cloneNode(node._specifier_));
+        setId(cloneNode(node._id_));
+        setSimpleTermTail(cloneNode(node._simpleTermTail_));
+    }
+
     @Override
     public ASimpleListTerm clone()
     {
-        return new ASimpleListTerm(
-            cloneNode(this._specifier_),
-            cloneNode(this._id_),
-            cloneNode(this._simpleTermTail_));
+        return new ASimpleListTerm(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ASimpleTerm.java b/src/main/java/org/sablecc/sablecc/node/ASimpleTerm.java
index 7f7cd41..693bea1 100644
--- a/src/main/java/org/sablecc/sablecc/node/ASimpleTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ASimpleTerm.java
@@ -30,13 +30,18 @@ public final class ASimpleTerm extends PTerm
 
     }
 
+    public ASimpleTerm(ASimpleTerm node)
+    {
+        super(node);
+        setSpecifier(cloneNode(node._specifier_));
+        setId(cloneNode(node._id_));
+        setSimpleTermTail(cloneNode(node._simpleTermTail_));
+    }
+
     @Override
     public ASimpleTerm clone()
     {
-        return new ASimpleTerm(
-            cloneNode(this._specifier_),
-            cloneNode(this._id_),
-            cloneNode(this._simpleTermTail_));
+        return new ASimpleTerm(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStarUnOp.java b/src/main/java/org/sablecc/sablecc/node/AStarUnOp.java
index 3d6abe6..65146a4 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStarUnOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStarUnOp.java
@@ -22,11 +22,16 @@ public final class AStarUnOp extends PUnOp
 
     }
 
+    public AStarUnOp(AStarUnOp node)
+    {
+        super(node);
+        setStar(cloneNode(node._star_));
+    }
+
     @Override
     public AStarUnOp clone()
     {
-        return new AStarUnOp(
-            cloneNode(this._star_));
+        return new AStarUnOp(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStateList.java b/src/main/java/org/sablecc/sablecc/node/AStateList.java
index 0f76852..f24a890 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStateList.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStateList.java
@@ -31,13 +31,18 @@ public final class AStateList extends PStateList
 
     }
 
+    public AStateList(AStateList node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+        setTransition(cloneNode(node._transition_));
+        setStateLists(cloneList(node._stateLists_));
+    }
+
     @Override
     public AStateList clone()
     {
-        return new AStateList(
-            cloneNode(this._id_),
-            cloneNode(this._transition_),
-            cloneList(this._stateLists_));
+        return new AStateList(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStateListTail.java b/src/main/java/org/sablecc/sablecc/node/AStateListTail.java
index 5451020..b07fbfc 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStateListTail.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStateListTail.java
@@ -26,12 +26,17 @@ public final class AStateListTail extends PStateListTail
 
     }
 
+    public AStateListTail(AStateListTail node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+        setTransition(cloneNode(node._transition_));
+    }
+
     @Override
     public AStateListTail clone()
     {
-        return new AStateListTail(
-            cloneNode(this._id_),
-            cloneNode(this._transition_));
+        return new AStateListTail(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStates.java b/src/main/java/org/sablecc/sablecc/node/AStates.java
index 271b30f..1c8e4ee 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStates.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStates.java
@@ -23,11 +23,16 @@ public final class AStates extends PStates
 
     }
 
+    public AStates(AStates node)
+    {
+        super(node);
+        setListId(cloneList(node._listId_));
+    }
+
     @Override
     public AStates clone()
     {
-        return new AStates(
-            cloneList(this._listId_));
+        return new AStates(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStringBasic.java b/src/main/java/org/sablecc/sablecc/node/AStringBasic.java
index 5b96778..79963c2 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStringBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStringBasic.java
@@ -22,11 +22,16 @@ public final class AStringBasic extends PBasic
 
     }
 
+    public AStringBasic(AStringBasic node)
+    {
+        super(node);
+        setString(cloneNode(node._string_));
+    }
+
     @Override
     public AStringBasic clone()
     {
-        return new AStringBasic(
-            cloneNode(this._string_));
+        return new AStringBasic(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ATokenDef.java b/src/main/java/org/sablecc/sablecc/node/ATokenDef.java
index be7cb58..b2e423d 100644
--- a/src/main/java/org/sablecc/sablecc/node/ATokenDef.java
+++ b/src/main/java/org/sablecc/sablecc/node/ATokenDef.java
@@ -38,15 +38,20 @@ public final class ATokenDef extends PTokenDef
 
     }
 
+    public ATokenDef(ATokenDef node)
+    {
+        super(node);
+        setStateList(cloneNode(node._stateList_));
+        setId(cloneNode(node._id_));
+        setRegExp(cloneNode(node._regExp_));
+        setSlash(cloneNode(node._slash_));
+        setLookAhead(cloneNode(node._lookAhead_));
+    }
+
     @Override
     public ATokenDef clone()
     {
-        return new ATokenDef(
-            cloneNode(this._stateList_),
-            cloneNode(this._id_),
-            cloneNode(this._regExp_),
-            cloneNode(this._slash_),
-            cloneNode(this._lookAhead_));
+        return new ATokenDef(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ATokenSpecifier.java b/src/main/java/org/sablecc/sablecc/node/ATokenSpecifier.java
index 716ff3b..596e939 100644
--- a/src/main/java/org/sablecc/sablecc/node/ATokenSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/ATokenSpecifier.java
@@ -13,10 +13,15 @@ public final class ATokenSpecifier extends PSpecifier
         // Constructor
     }
 
+    public ATokenSpecifier(ATokenSpecifier node)
+    {
+        super(node);
+    }
+
     @Override
     public ATokenSpecifier clone()
     {
-        return new ATokenSpecifier();
+        return new ATokenSpecifier(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ATokens.java b/src/main/java/org/sablecc/sablecc/node/ATokens.java
index f770883..2ad3db7 100644
--- a/src/main/java/org/sablecc/sablecc/node/ATokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/ATokens.java
@@ -23,11 +23,16 @@ public final class ATokens extends PTokens
 
     }
 
+    public ATokens(ATokens node)
+    {
+        super(node);
+        setTokenDefs(cloneList(node._tokenDefs_));
+    }
+
     @Override
     public ATokens clone()
     {
-        return new ATokens(
-            cloneList(this._tokenDefs_));
+        return new ATokens(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ATransition.java b/src/main/java/org/sablecc/sablecc/node/ATransition.java
index f5ea0f3..e0c6328 100644
--- a/src/main/java/org/sablecc/sablecc/node/ATransition.java
+++ b/src/main/java/org/sablecc/sablecc/node/ATransition.java
@@ -22,11 +22,16 @@ public final class ATransition extends PTransition
 
     }
 
+    public ATransition(ATransition node)
+    {
+        super(node);
+        setId(cloneNode(node._id_));
+    }
+
     @Override
     public ATransition clone()
     {
-        return new ATransition(
-            cloneNode(this._id_));
+        return new ATransition(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AUnExp.java b/src/main/java/org/sablecc/sablecc/node/AUnExp.java
index bcd27d9..ea2d1e3 100644
--- a/src/main/java/org/sablecc/sablecc/node/AUnExp.java
+++ b/src/main/java/org/sablecc/sablecc/node/AUnExp.java
@@ -26,12 +26,17 @@ public final class AUnExp extends PUnExp
 
     }
 
+    public AUnExp(AUnExp node)
+    {
+        super(node);
+        setBasic(cloneNode(node._basic_));
+        setUnOp(cloneNode(node._unOp_));
+    }
+
     @Override
     public AUnExp clone()
     {
-        return new AUnExp(
-            cloneNode(this._basic_),
-            cloneNode(this._unOp_));
+        return new AUnExp(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/EOF.java b/src/main/java/org/sablecc/sablecc/node/EOF.java
index 20a719f..5097f39 100644
--- a/src/main/java/org/sablecc/sablecc/node/EOF.java
+++ b/src/main/java/org/sablecc/sablecc/node/EOF.java
@@ -9,20 +9,23 @@ public final class EOF extends Token
 {
     public EOF()
     {
-        setText("");
+        super("");
     }
 
     public EOF(int line, int pos)
     {
-        setText("");
-        setLine(line);
-        setPos(pos);
+        super("", line, pos);
+    }
+
+    public EOF(EOF token)
+    {
+        super(token);
     }
 
     @Override
     public EOF clone()
     {
-        return new EOF(getLine(), getPos());
+        return new EOF(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/Node.java b/src/main/java/org/sablecc/sablecc/node/Node.java
index b4c0c33..c04d51d 100644
--- a/src/main/java/org/sablecc/sablecc/node/Node.java
+++ b/src/main/java/org/sablecc/sablecc/node/Node.java
@@ -10,6 +10,17 @@ public abstract class Node extends PositionedNode implements Switchable, Cloneab
 {
     private Node parent;
 
+    public Node()
+    {}
+
+    public Node(Node node)
+    {
+        super(node);
+        // Copy constructor intentionally does not keep parent!
+        // The new copied node is not a child of the original parent anymore.
+        this.parent = null;
+    }
+
     @Override
     public abstract Node clone();
 
diff --git a/src/main/java/org/sablecc/sablecc/node/PAlt.java b/src/main/java/org/sablecc/sablecc/node/PAlt.java
index 0b5516f..805ab23 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAlt.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAlt.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PAlt extends Node
 {
+    public PAlt()
+    {}
+
+    public PAlt(PAlt node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PAlt clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PAltTransform.java b/src/main/java/org/sablecc/sablecc/node/PAltTransform.java
index 35b5362..f0eafa2 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAltTransform.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAltTransform.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PAltTransform extends Node
 {
+    public PAltTransform()
+    {}
+
+    public PAltTransform(PAltTransform node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PAltTransform clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PAst.java b/src/main/java/org/sablecc/sablecc/node/PAst.java
index ef1f009..04d7430 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAst.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAst.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PAst extends Node
 {
+    public PAst()
+    {}
+
+    public PAst(PAst node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PAst clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PAstAlt.java b/src/main/java/org/sablecc/sablecc/node/PAstAlt.java
index 4dc2c2b..7fa3763 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAstAlt.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAstAlt.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PAstAlt extends Node
 {
+    public PAstAlt()
+    {}
+
+    public PAstAlt(PAstAlt node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PAstAlt clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PAstProd.java b/src/main/java/org/sablecc/sablecc/node/PAstProd.java
index 6b85532..de12a50 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAstProd.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAstProd.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PAstProd extends Node
 {
+    public PAstProd()
+    {}
+
+    public PAstProd(PAstProd node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PAstProd clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PBasic.java b/src/main/java/org/sablecc/sablecc/node/PBasic.java
index 70bcd90..2a3b4b9 100644
--- a/src/main/java/org/sablecc/sablecc/node/PBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/PBasic.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PBasic extends Node
 {
+    public PBasic()
+    {}
+
+    public PBasic(PBasic node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PBasic clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PBinOp.java b/src/main/java/org/sablecc/sablecc/node/PBinOp.java
index 2b2e9ef..1d35acb 100644
--- a/src/main/java/org/sablecc/sablecc/node/PBinOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/PBinOp.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PBinOp extends Node
 {
+    public PBinOp()
+    {}
+
+    public PBinOp(PBinOp node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PBinOp clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PChar.java b/src/main/java/org/sablecc/sablecc/node/PChar.java
index bf0fc3c..1e1975c 100644
--- a/src/main/java/org/sablecc/sablecc/node/PChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/PChar.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PChar extends Node
 {
+    public PChar()
+    {}
+
+    public PChar(PChar node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PChar clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PConcat.java b/src/main/java/org/sablecc/sablecc/node/PConcat.java
index c5c9870..7c9ef83 100644
--- a/src/main/java/org/sablecc/sablecc/node/PConcat.java
+++ b/src/main/java/org/sablecc/sablecc/node/PConcat.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PConcat extends Node
 {
+    public PConcat()
+    {}
+
+    public PConcat(PConcat node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PConcat clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PElem.java b/src/main/java/org/sablecc/sablecc/node/PElem.java
index 9ead049..748f1bc 100644
--- a/src/main/java/org/sablecc/sablecc/node/PElem.java
+++ b/src/main/java/org/sablecc/sablecc/node/PElem.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PElem extends Node
 {
+    public PElem()
+    {}
+
+    public PElem(PElem node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PElem clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PGrammar.java b/src/main/java/org/sablecc/sablecc/node/PGrammar.java
index 3609b3d..8501e4c 100644
--- a/src/main/java/org/sablecc/sablecc/node/PGrammar.java
+++ b/src/main/java/org/sablecc/sablecc/node/PGrammar.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PGrammar extends Node
 {
+    public PGrammar()
+    {}
+
+    public PGrammar(PGrammar node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PGrammar clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PHelperDef.java b/src/main/java/org/sablecc/sablecc/node/PHelperDef.java
index 3c73a8c..b9e501d 100644
--- a/src/main/java/org/sablecc/sablecc/node/PHelperDef.java
+++ b/src/main/java/org/sablecc/sablecc/node/PHelperDef.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PHelperDef extends Node
 {
+    public PHelperDef()
+    {}
+
+    public PHelperDef(PHelperDef node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PHelperDef clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PHelpers.java b/src/main/java/org/sablecc/sablecc/node/PHelpers.java
index 66e7c21..a1ddbf2 100644
--- a/src/main/java/org/sablecc/sablecc/node/PHelpers.java
+++ b/src/main/java/org/sablecc/sablecc/node/PHelpers.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PHelpers extends Node
 {
+    public PHelpers()
+    {}
+
+    public PHelpers(PHelpers node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PHelpers clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PIgnTokens.java b/src/main/java/org/sablecc/sablecc/node/PIgnTokens.java
index 5af5223..fb53108 100644
--- a/src/main/java/org/sablecc/sablecc/node/PIgnTokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/PIgnTokens.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PIgnTokens extends Node
 {
+    public PIgnTokens()
+    {}
+
+    public PIgnTokens(PIgnTokens node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PIgnTokens clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PListTerm.java b/src/main/java/org/sablecc/sablecc/node/PListTerm.java
index da5bde5..d8e7a48 100644
--- a/src/main/java/org/sablecc/sablecc/node/PListTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/PListTerm.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PListTerm extends Node
 {
+    public PListTerm()
+    {}
+
+    public PListTerm(PListTerm node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PListTerm clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PProd.java b/src/main/java/org/sablecc/sablecc/node/PProd.java
index 5eae94a..2d9db40 100644
--- a/src/main/java/org/sablecc/sablecc/node/PProd.java
+++ b/src/main/java/org/sablecc/sablecc/node/PProd.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PProd extends Node
 {
+    public PProd()
+    {}
+
+    public PProd(PProd node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PProd clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PProdName.java b/src/main/java/org/sablecc/sablecc/node/PProdName.java
index eff659c..380e8da 100644
--- a/src/main/java/org/sablecc/sablecc/node/PProdName.java
+++ b/src/main/java/org/sablecc/sablecc/node/PProdName.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PProdName extends Node
 {
+    public PProdName()
+    {}
+
+    public PProdName(PProdName node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PProdName clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PProductions.java b/src/main/java/org/sablecc/sablecc/node/PProductions.java
index f12d223..98da826 100644
--- a/src/main/java/org/sablecc/sablecc/node/PProductions.java
+++ b/src/main/java/org/sablecc/sablecc/node/PProductions.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PProductions extends Node
 {
+    public PProductions()
+    {}
+
+    public PProductions(PProductions node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PProductions clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PRegExp.java b/src/main/java/org/sablecc/sablecc/node/PRegExp.java
index c9ae467..3ebc5a2 100644
--- a/src/main/java/org/sablecc/sablecc/node/PRegExp.java
+++ b/src/main/java/org/sablecc/sablecc/node/PRegExp.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PRegExp extends Node
 {
+    public PRegExp()
+    {}
+
+    public PRegExp(PRegExp node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PRegExp clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PSet.java b/src/main/java/org/sablecc/sablecc/node/PSet.java
index 5d2b31e..e9d6593 100644
--- a/src/main/java/org/sablecc/sablecc/node/PSet.java
+++ b/src/main/java/org/sablecc/sablecc/node/PSet.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PSet extends Node
 {
+    public PSet()
+    {}
+
+    public PSet(PSet node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PSet clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PSpecifier.java b/src/main/java/org/sablecc/sablecc/node/PSpecifier.java
index 787ba31..39fc626 100644
--- a/src/main/java/org/sablecc/sablecc/node/PSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/PSpecifier.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PSpecifier extends Node
 {
+    public PSpecifier()
+    {}
+
+    public PSpecifier(PSpecifier node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PSpecifier clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PStateList.java b/src/main/java/org/sablecc/sablecc/node/PStateList.java
index 24b52b2..b8509d1 100644
--- a/src/main/java/org/sablecc/sablecc/node/PStateList.java
+++ b/src/main/java/org/sablecc/sablecc/node/PStateList.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PStateList extends Node
 {
+    public PStateList()
+    {}
+
+    public PStateList(PStateList node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PStateList clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PStateListTail.java b/src/main/java/org/sablecc/sablecc/node/PStateListTail.java
index b50809e..3968b10 100644
--- a/src/main/java/org/sablecc/sablecc/node/PStateListTail.java
+++ b/src/main/java/org/sablecc/sablecc/node/PStateListTail.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PStateListTail extends Node
 {
+    public PStateListTail()
+    {}
+
+    public PStateListTail(PStateListTail node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PStateListTail clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PStates.java b/src/main/java/org/sablecc/sablecc/node/PStates.java
index df92627..c0f22d4 100644
--- a/src/main/java/org/sablecc/sablecc/node/PStates.java
+++ b/src/main/java/org/sablecc/sablecc/node/PStates.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PStates extends Node
 {
+    public PStates()
+    {}
+
+    public PStates(PStates node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PStates clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PTerm.java b/src/main/java/org/sablecc/sablecc/node/PTerm.java
index cea2601..e3e9373 100644
--- a/src/main/java/org/sablecc/sablecc/node/PTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/PTerm.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PTerm extends Node
 {
+    public PTerm()
+    {}
+
+    public PTerm(PTerm node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PTerm clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PTokenDef.java b/src/main/java/org/sablecc/sablecc/node/PTokenDef.java
index 96e71a7..783f742 100644
--- a/src/main/java/org/sablecc/sablecc/node/PTokenDef.java
+++ b/src/main/java/org/sablecc/sablecc/node/PTokenDef.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PTokenDef extends Node
 {
+    public PTokenDef()
+    {}
+
+    public PTokenDef(PTokenDef node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PTokenDef clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PTokens.java b/src/main/java/org/sablecc/sablecc/node/PTokens.java
index daa2a57..d0b4af8 100644
--- a/src/main/java/org/sablecc/sablecc/node/PTokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/PTokens.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PTokens extends Node
 {
+    public PTokens()
+    {}
+
+    public PTokens(PTokens node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PTokens clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PTransition.java b/src/main/java/org/sablecc/sablecc/node/PTransition.java
index e91c82d..d8b166d 100644
--- a/src/main/java/org/sablecc/sablecc/node/PTransition.java
+++ b/src/main/java/org/sablecc/sablecc/node/PTransition.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PTransition extends Node
 {
+    public PTransition()
+    {}
+
+    public PTransition(PTransition node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PTransition clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PUnExp.java b/src/main/java/org/sablecc/sablecc/node/PUnExp.java
index 1561ea6..28f0cba 100644
--- a/src/main/java/org/sablecc/sablecc/node/PUnExp.java
+++ b/src/main/java/org/sablecc/sablecc/node/PUnExp.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PUnExp extends Node
 {
+    public PUnExp()
+    {}
+
+    public PUnExp(PUnExp node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PUnExp clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/PUnOp.java b/src/main/java/org/sablecc/sablecc/node/PUnOp.java
index 45a73f9..fc09a33 100644
--- a/src/main/java/org/sablecc/sablecc/node/PUnOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/PUnOp.java
@@ -4,6 +4,14 @@ package org.sablecc.sablecc.node;
 
 public abstract class PUnOp extends Node
 {
+    public PUnOp()
+    {}
+
+    public PUnOp(PUnOp node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract PUnOp clone();
 }
diff --git a/src/main/java/org/sablecc/sablecc/node/Start.java b/src/main/java/org/sablecc/sablecc/node/Start.java
index 2626e78..0988c84 100644
--- a/src/main/java/org/sablecc/sablecc/node/Start.java
+++ b/src/main/java/org/sablecc/sablecc/node/Start.java
@@ -22,12 +22,17 @@ public final class Start extends Node
         setEOF(_eof_);
     }
 
+    public Start(Start node)
+    {
+        super(node);
+        setPGrammar(cloneNode(node._pGrammar_));
+        setEOF(cloneNode(node._eof_));
+    }
+
     @Override
     public Start clone()
     {
-        return new Start(
-            cloneNode(this._pGrammar_),
-            cloneNode(this._eof_));
+        return new Start(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TAbstract.java b/src/main/java/org/sablecc/sablecc/node/TAbstract.java
index a942340..dbccebb 100644
--- a/src/main/java/org/sablecc/sablecc/node/TAbstract.java
+++ b/src/main/java/org/sablecc/sablecc/node/TAbstract.java
@@ -9,20 +9,23 @@ public final class TAbstract extends Token
 {
     public TAbstract()
     {
-        super.setText("Abstract");
+        super("Abstract");
     }
 
     public TAbstract(int line, int pos)
     {
-        super.setText("Abstract");
-        setLine(line);
-        setPos(pos);
+        super("Abstract", line, pos);
+    }
+
+    public TAbstract(TAbstract token)
+    {
+        super(token);
     }
 
     @Override
     public TAbstract clone()
     {
-        return new TAbstract(getLine(), getPos());
+        return new TAbstract(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TArrow.java b/src/main/java/org/sablecc/sablecc/node/TArrow.java
index 4817c02..1ad0fb6 100644
--- a/src/main/java/org/sablecc/sablecc/node/TArrow.java
+++ b/src/main/java/org/sablecc/sablecc/node/TArrow.java
@@ -9,20 +9,23 @@ public final class TArrow extends Token
 {
     public TArrow()
     {
-        super.setText("->");
+        super("->");
     }
 
     public TArrow(int line, int pos)
     {
-        super.setText("->");
-        setLine(line);
-        setPos(pos);
+        super("->", line, pos);
+    }
+
+    public TArrow(TArrow token)
+    {
+        super(token);
     }
 
     @Override
     public TArrow clone()
     {
-        return new TArrow(getLine(), getPos());
+        return new TArrow(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TBar.java b/src/main/java/org/sablecc/sablecc/node/TBar.java
index ea2cccb..d6119ef 100644
--- a/src/main/java/org/sablecc/sablecc/node/TBar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TBar.java
@@ -9,20 +9,23 @@ public final class TBar extends Token
 {
     public TBar()
     {
-        super.setText("|");
+        super("|");
     }
 
     public TBar(int line, int pos)
     {
-        super.setText("|");
-        setLine(line);
-        setPos(pos);
+        super("|", line, pos);
+    }
+
+    public TBar(TBar token)
+    {
+        super(token);
     }
 
     @Override
     public TBar clone()
     {
-        return new TBar(getLine(), getPos());
+        return new TBar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TBlank.java b/src/main/java/org/sablecc/sablecc/node/TBlank.java
index bc36650..70b8ecf 100644
--- a/src/main/java/org/sablecc/sablecc/node/TBlank.java
+++ b/src/main/java/org/sablecc/sablecc/node/TBlank.java
@@ -9,20 +9,23 @@ public final class TBlank extends Token
 {
     public TBlank(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public TBlank(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public TBlank(TBlank token)
+    {
+        super(token);
     }
 
     @Override
     public TBlank clone()
     {
-        return new TBlank(getText(), getLine(), getPos());
+        return new TBlank(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TChar.java b/src/main/java/org/sablecc/sablecc/node/TChar.java
index 98b21a2..6f70e04 100644
--- a/src/main/java/org/sablecc/sablecc/node/TChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TChar.java
@@ -9,20 +9,23 @@ public final class TChar extends Token
 {
     public TChar(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public TChar(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public TChar(TChar token)
+    {
+        super(token);
     }
 
     @Override
     public TChar clone()
     {
-        return new TChar(getText(), getLine(), getPos());
+        return new TChar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TColon.java b/src/main/java/org/sablecc/sablecc/node/TColon.java
index 65692a4..cab5d5a 100644
--- a/src/main/java/org/sablecc/sablecc/node/TColon.java
+++ b/src/main/java/org/sablecc/sablecc/node/TColon.java
@@ -9,20 +9,23 @@ public final class TColon extends Token
 {
     public TColon()
     {
-        super.setText(":");
+        super(":");
     }
 
     public TColon(int line, int pos)
     {
-        super.setText(":");
-        setLine(line);
-        setPos(pos);
+        super(":", line, pos);
+    }
+
+    public TColon(TColon token)
+    {
+        super(token);
     }
 
     @Override
     public TColon clone()
     {
-        return new TColon(getLine(), getPos());
+        return new TColon(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TComma.java b/src/main/java/org/sablecc/sablecc/node/TComma.java
index 8b421b5..5b906b3 100644
--- a/src/main/java/org/sablecc/sablecc/node/TComma.java
+++ b/src/main/java/org/sablecc/sablecc/node/TComma.java
@@ -9,20 +9,23 @@ public final class TComma extends Token
 {
     public TComma()
     {
-        super.setText(",");
+        super(",");
     }
 
     public TComma(int line, int pos)
     {
-        super.setText(",");
-        setLine(line);
-        setPos(pos);
+        super(",", line, pos);
+    }
+
+    public TComma(TComma token)
+    {
+        super(token);
     }
 
     @Override
     public TComma clone()
     {
-        return new TComma(getLine(), getPos());
+        return new TComma(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TComment.java b/src/main/java/org/sablecc/sablecc/node/TComment.java
index 2834865..6727575 100644
--- a/src/main/java/org/sablecc/sablecc/node/TComment.java
+++ b/src/main/java/org/sablecc/sablecc/node/TComment.java
@@ -9,20 +9,23 @@ public final class TComment extends Token
 {
     public TComment(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public TComment(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public TComment(TComment token)
+    {
+        super(token);
     }
 
     @Override
     public TComment clone()
     {
-        return new TComment(getText(), getLine(), getPos());
+        return new TComment(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TDDot.java b/src/main/java/org/sablecc/sablecc/node/TDDot.java
index fd34621..68a47c7 100644
--- a/src/main/java/org/sablecc/sablecc/node/TDDot.java
+++ b/src/main/java/org/sablecc/sablecc/node/TDDot.java
@@ -9,20 +9,23 @@ public final class TDDot extends Token
 {
     public TDDot()
     {
-        super.setText("..");
+        super("..");
     }
 
     public TDDot(int line, int pos)
     {
-        super.setText("..");
-        setLine(line);
-        setPos(pos);
+        super("..", line, pos);
+    }
+
+    public TDDot(TDDot token)
+    {
+        super(token);
     }
 
     @Override
     public TDDot clone()
     {
-        return new TDDot(getLine(), getPos());
+        return new TDDot(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TDecChar.java b/src/main/java/org/sablecc/sablecc/node/TDecChar.java
index 9511c49..11fef1e 100644
--- a/src/main/java/org/sablecc/sablecc/node/TDecChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TDecChar.java
@@ -9,20 +9,23 @@ public final class TDecChar extends Token
 {
     public TDecChar(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public TDecChar(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public TDecChar(TDecChar token)
+    {
+        super(token);
     }
 
     @Override
     public TDecChar clone()
     {
-        return new TDecChar(getText(), getLine(), getPos());
+        return new TDecChar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TDot.java b/src/main/java/org/sablecc/sablecc/node/TDot.java
index ff56837..7915cfc 100644
--- a/src/main/java/org/sablecc/sablecc/node/TDot.java
+++ b/src/main/java/org/sablecc/sablecc/node/TDot.java
@@ -9,20 +9,23 @@ public final class TDot extends Token
 {
     public TDot()
     {
-        super.setText(".");
+        super(".");
     }
 
     public TDot(int line, int pos)
     {
-        super.setText(".");
-        setLine(line);
-        setPos(pos);
+        super(".", line, pos);
+    }
+
+    public TDot(TDot token)
+    {
+        super(token);
     }
 
     @Override
     public TDot clone()
     {
-        return new TDot(getLine(), getPos());
+        return new TDot(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TEqual.java b/src/main/java/org/sablecc/sablecc/node/TEqual.java
index 015aba3..990a8fb 100644
--- a/src/main/java/org/sablecc/sablecc/node/TEqual.java
+++ b/src/main/java/org/sablecc/sablecc/node/TEqual.java
@@ -9,20 +9,23 @@ public final class TEqual extends Token
 {
     public TEqual()
     {
-        super.setText("=");
+        super("=");
     }
 
     public TEqual(int line, int pos)
     {
-        super.setText("=");
-        setLine(line);
-        setPos(pos);
+        super("=", line, pos);
+    }
+
+    public TEqual(TEqual token)
+    {
+        super(token);
     }
 
     @Override
     public TEqual clone()
     {
-        return new TEqual(getLine(), getPos());
+        return new TEqual(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/THelpers.java b/src/main/java/org/sablecc/sablecc/node/THelpers.java
index 4c843ba..454b298 100644
--- a/src/main/java/org/sablecc/sablecc/node/THelpers.java
+++ b/src/main/java/org/sablecc/sablecc/node/THelpers.java
@@ -9,20 +9,23 @@ public final class THelpers extends Token
 {
     public THelpers()
     {
-        super.setText("Helpers");
+        super("Helpers");
     }
 
     public THelpers(int line, int pos)
     {
-        super.setText("Helpers");
-        setLine(line);
-        setPos(pos);
+        super("Helpers", line, pos);
+    }
+
+    public THelpers(THelpers token)
+    {
+        super(token);
     }
 
     @Override
     public THelpers clone()
     {
-        return new THelpers(getLine(), getPos());
+        return new THelpers(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/THexChar.java b/src/main/java/org/sablecc/sablecc/node/THexChar.java
index 852b578..be72cbc 100644
--- a/src/main/java/org/sablecc/sablecc/node/THexChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/THexChar.java
@@ -9,20 +9,23 @@ public final class THexChar extends Token
 {
     public THexChar(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public THexChar(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public THexChar(THexChar token)
+    {
+        super(token);
     }
 
     @Override
     public THexChar clone()
     {
-        return new THexChar(getText(), getLine(), getPos());
+        return new THexChar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TId.java b/src/main/java/org/sablecc/sablecc/node/TId.java
index fc64875..6ecb2e6 100644
--- a/src/main/java/org/sablecc/sablecc/node/TId.java
+++ b/src/main/java/org/sablecc/sablecc/node/TId.java
@@ -9,20 +9,23 @@ public final class TId extends Token
 {
     public TId(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public TId(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public TId(TId token)
+    {
+        super(token);
     }
 
     @Override
     public TId clone()
     {
-        return new TId(getText(), getLine(), getPos());
+        return new TId(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TIgnored.java b/src/main/java/org/sablecc/sablecc/node/TIgnored.java
index 55a4e7c..d250772 100644
--- a/src/main/java/org/sablecc/sablecc/node/TIgnored.java
+++ b/src/main/java/org/sablecc/sablecc/node/TIgnored.java
@@ -9,20 +9,23 @@ public final class TIgnored extends Token
 {
     public TIgnored()
     {
-        super.setText("Ignored");
+        super("Ignored");
     }
 
     public TIgnored(int line, int pos)
     {
-        super.setText("Ignored");
-        setLine(line);
-        setPos(pos);
+        super("Ignored", line, pos);
+    }
+
+    public TIgnored(TIgnored token)
+    {
+        super(token);
     }
 
     @Override
     public TIgnored clone()
     {
-        return new TIgnored(getLine(), getPos());
+        return new TIgnored(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TLBkt.java b/src/main/java/org/sablecc/sablecc/node/TLBkt.java
index 6060037..3cfb5e3 100644
--- a/src/main/java/org/sablecc/sablecc/node/TLBkt.java
+++ b/src/main/java/org/sablecc/sablecc/node/TLBkt.java
@@ -9,20 +9,23 @@ public final class TLBkt extends Token
 {
     public TLBkt()
     {
-        super.setText("[");
+        super("[");
     }
 
     public TLBkt(int line, int pos)
     {
-        super.setText("[");
-        setLine(line);
-        setPos(pos);
+        super("[", line, pos);
+    }
+
+    public TLBkt(TLBkt token)
+    {
+        super(token);
     }
 
     @Override
     public TLBkt clone()
     {
-        return new TLBkt(getLine(), getPos());
+        return new TLBkt(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TLBrace.java b/src/main/java/org/sablecc/sablecc/node/TLBrace.java
index c7c8c11..2717770 100644
--- a/src/main/java/org/sablecc/sablecc/node/TLBrace.java
+++ b/src/main/java/org/sablecc/sablecc/node/TLBrace.java
@@ -9,20 +9,23 @@ public final class TLBrace extends Token
 {
     public TLBrace()
     {
-        super.setText("{");
+        super("{");
     }
 
     public TLBrace(int line, int pos)
     {
-        super.setText("{");
-        setLine(line);
-        setPos(pos);
+        super("{", line, pos);
+    }
+
+    public TLBrace(TLBrace token)
+    {
+        super(token);
     }
 
     @Override
     public TLBrace clone()
     {
-        return new TLBrace(getLine(), getPos());
+        return new TLBrace(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TLPar.java b/src/main/java/org/sablecc/sablecc/node/TLPar.java
index 06b5aa9..0ce2f69 100644
--- a/src/main/java/org/sablecc/sablecc/node/TLPar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TLPar.java
@@ -9,20 +9,23 @@ public final class TLPar extends Token
 {
     public TLPar()
     {
-        super.setText("(");
+        super("(");
     }
 
     public TLPar(int line, int pos)
     {
-        super.setText("(");
-        setLine(line);
-        setPos(pos);
+        super("(", line, pos);
+    }
+
+    public TLPar(TLPar token)
+    {
+        super(token);
     }
 
     @Override
     public TLPar clone()
     {
-        return new TLPar(getLine(), getPos());
+        return new TLPar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TMinus.java b/src/main/java/org/sablecc/sablecc/node/TMinus.java
index 1d59154..9eaaffa 100644
--- a/src/main/java/org/sablecc/sablecc/node/TMinus.java
+++ b/src/main/java/org/sablecc/sablecc/node/TMinus.java
@@ -9,20 +9,23 @@ public final class TMinus extends Token
 {
     public TMinus()
     {
-        super.setText("-");
+        super("-");
     }
 
     public TMinus(int line, int pos)
     {
-        super.setText("-");
-        setLine(line);
-        setPos(pos);
+        super("-", line, pos);
+    }
+
+    public TMinus(TMinus token)
+    {
+        super(token);
     }
 
     @Override
     public TMinus clone()
     {
-        return new TMinus(getLine(), getPos());
+        return new TMinus(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TNew.java b/src/main/java/org/sablecc/sablecc/node/TNew.java
index 39bcc55..5bb658b 100644
--- a/src/main/java/org/sablecc/sablecc/node/TNew.java
+++ b/src/main/java/org/sablecc/sablecc/node/TNew.java
@@ -9,20 +9,23 @@ public final class TNew extends Token
 {
     public TNew()
     {
-        super.setText("New");
+        super("New");
     }
 
     public TNew(int line, int pos)
     {
-        super.setText("New");
-        setLine(line);
-        setPos(pos);
+        super("New", line, pos);
+    }
+
+    public TNew(TNew token)
+    {
+        super(token);
     }
 
     @Override
     public TNew clone()
     {
-        return new TNew(getLine(), getPos());
+        return new TNew(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TNull.java b/src/main/java/org/sablecc/sablecc/node/TNull.java
index 0e718da..80cb56a 100644
--- a/src/main/java/org/sablecc/sablecc/node/TNull.java
+++ b/src/main/java/org/sablecc/sablecc/node/TNull.java
@@ -9,20 +9,23 @@ public final class TNull extends Token
 {
     public TNull()
     {
-        super.setText("Null");
+        super("Null");
     }
 
     public TNull(int line, int pos)
     {
-        super.setText("Null");
-        setLine(line);
-        setPos(pos);
+        super("Null", line, pos);
+    }
+
+    public TNull(TNull token)
+    {
+        super(token);
     }
 
     @Override
     public TNull clone()
     {
-        return new TNull(getLine(), getPos());
+        return new TNull(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TPackage.java b/src/main/java/org/sablecc/sablecc/node/TPackage.java
index 2e6ff4f..dd8c3af 100644
--- a/src/main/java/org/sablecc/sablecc/node/TPackage.java
+++ b/src/main/java/org/sablecc/sablecc/node/TPackage.java
@@ -9,20 +9,23 @@ public final class TPackage extends Token
 {
     public TPackage()
     {
-        super.setText("Package");
+        super("Package");
     }
 
     public TPackage(int line, int pos)
     {
-        super.setText("Package");
-        setLine(line);
-        setPos(pos);
+        super("Package", line, pos);
+    }
+
+    public TPackage(TPackage token)
+    {
+        super(token);
     }
 
     @Override
     public TPackage clone()
     {
-        return new TPackage(getLine(), getPos());
+        return new TPackage(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TPkgId.java b/src/main/java/org/sablecc/sablecc/node/TPkgId.java
index 3913ccd..4a35d8f 100644
--- a/src/main/java/org/sablecc/sablecc/node/TPkgId.java
+++ b/src/main/java/org/sablecc/sablecc/node/TPkgId.java
@@ -9,20 +9,23 @@ public final class TPkgId extends Token
 {
     public TPkgId(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public TPkgId(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public TPkgId(TPkgId token)
+    {
+        super(token);
     }
 
     @Override
     public TPkgId clone()
     {
-        return new TPkgId(getText(), getLine(), getPos());
+        return new TPkgId(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TPlus.java b/src/main/java/org/sablecc/sablecc/node/TPlus.java
index d3fd88d..45fe180 100644
--- a/src/main/java/org/sablecc/sablecc/node/TPlus.java
+++ b/src/main/java/org/sablecc/sablecc/node/TPlus.java
@@ -9,20 +9,23 @@ public final class TPlus extends Token
 {
     public TPlus()
     {
-        super.setText("+");
+        super("+");
     }
 
     public TPlus(int line, int pos)
     {
-        super.setText("+");
-        setLine(line);
-        setPos(pos);
+        super("+", line, pos);
+    }
+
+    public TPlus(TPlus token)
+    {
+        super(token);
     }
 
     @Override
     public TPlus clone()
     {
-        return new TPlus(getLine(), getPos());
+        return new TPlus(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TProductionSpecifier.java b/src/main/java/org/sablecc/sablecc/node/TProductionSpecifier.java
index b73250d..df07e58 100644
--- a/src/main/java/org/sablecc/sablecc/node/TProductionSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/TProductionSpecifier.java
@@ -9,20 +9,23 @@ public final class TProductionSpecifier extends Token
 {
     public TProductionSpecifier()
     {
-        super.setText("P");
+        super("P");
     }
 
     public TProductionSpecifier(int line, int pos)
     {
-        super.setText("P");
-        setLine(line);
-        setPos(pos);
+        super("P", line, pos);
+    }
+
+    public TProductionSpecifier(TProductionSpecifier token)
+    {
+        super(token);
     }
 
     @Override
     public TProductionSpecifier clone()
     {
-        return new TProductionSpecifier(getLine(), getPos());
+        return new TProductionSpecifier(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TProductions.java b/src/main/java/org/sablecc/sablecc/node/TProductions.java
index bbcf9d4..707edf7 100644
--- a/src/main/java/org/sablecc/sablecc/node/TProductions.java
+++ b/src/main/java/org/sablecc/sablecc/node/TProductions.java
@@ -9,20 +9,23 @@ public final class TProductions extends Token
 {
     public TProductions()
     {
-        super.setText("Productions");
+        super("Productions");
     }
 
     public TProductions(int line, int pos)
     {
-        super.setText("Productions");
-        setLine(line);
-        setPos(pos);
+        super("Productions", line, pos);
+    }
+
+    public TProductions(TProductions token)
+    {
+        super(token);
     }
 
     @Override
     public TProductions clone()
     {
-        return new TProductions(getLine(), getPos());
+        return new TProductions(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TQMark.java b/src/main/java/org/sablecc/sablecc/node/TQMark.java
index 5b77234..6899c00 100644
--- a/src/main/java/org/sablecc/sablecc/node/TQMark.java
+++ b/src/main/java/org/sablecc/sablecc/node/TQMark.java
@@ -9,20 +9,23 @@ public final class TQMark extends Token
 {
     public TQMark()
     {
-        super.setText("?");
+        super("?");
     }
 
     public TQMark(int line, int pos)
     {
-        super.setText("?");
-        setLine(line);
-        setPos(pos);
+        super("?", line, pos);
+    }
+
+    public TQMark(TQMark token)
+    {
+        super(token);
     }
 
     @Override
     public TQMark clone()
     {
-        return new TQMark(getLine(), getPos());
+        return new TQMark(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TRBkt.java b/src/main/java/org/sablecc/sablecc/node/TRBkt.java
index a64429b..058d8e5 100644
--- a/src/main/java/org/sablecc/sablecc/node/TRBkt.java
+++ b/src/main/java/org/sablecc/sablecc/node/TRBkt.java
@@ -9,20 +9,23 @@ public final class TRBkt extends Token
 {
     public TRBkt()
     {
-        super.setText("]");
+        super("]");
     }
 
     public TRBkt(int line, int pos)
     {
-        super.setText("]");
-        setLine(line);
-        setPos(pos);
+        super("]", line, pos);
+    }
+
+    public TRBkt(TRBkt token)
+    {
+        super(token);
     }
 
     @Override
     public TRBkt clone()
     {
-        return new TRBkt(getLine(), getPos());
+        return new TRBkt(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TRBrace.java b/src/main/java/org/sablecc/sablecc/node/TRBrace.java
index 7a8a97b..6af214d 100644
--- a/src/main/java/org/sablecc/sablecc/node/TRBrace.java
+++ b/src/main/java/org/sablecc/sablecc/node/TRBrace.java
@@ -9,20 +9,23 @@ public final class TRBrace extends Token
 {
     public TRBrace()
     {
-        super.setText("}");
+        super("}");
     }
 
     public TRBrace(int line, int pos)
     {
-        super.setText("}");
-        setLine(line);
-        setPos(pos);
+        super("}", line, pos);
+    }
+
+    public TRBrace(TRBrace token)
+    {
+        super(token);
     }
 
     @Override
     public TRBrace clone()
     {
-        return new TRBrace(getLine(), getPos());
+        return new TRBrace(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TRPar.java b/src/main/java/org/sablecc/sablecc/node/TRPar.java
index b186f71..692be1b 100644
--- a/src/main/java/org/sablecc/sablecc/node/TRPar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TRPar.java
@@ -9,20 +9,23 @@ public final class TRPar extends Token
 {
     public TRPar()
     {
-        super.setText(")");
+        super(")");
     }
 
     public TRPar(int line, int pos)
     {
-        super.setText(")");
-        setLine(line);
-        setPos(pos);
+        super(")", line, pos);
+    }
+
+    public TRPar(TRPar token)
+    {
+        super(token);
     }
 
     @Override
     public TRPar clone()
     {
-        return new TRPar(getLine(), getPos());
+        return new TRPar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TSemicolon.java b/src/main/java/org/sablecc/sablecc/node/TSemicolon.java
index 65561a5..bf681ed 100644
--- a/src/main/java/org/sablecc/sablecc/node/TSemicolon.java
+++ b/src/main/java/org/sablecc/sablecc/node/TSemicolon.java
@@ -9,20 +9,23 @@ public final class TSemicolon extends Token
 {
     public TSemicolon()
     {
-        super.setText(";");
+        super(";");
     }
 
     public TSemicolon(int line, int pos)
     {
-        super.setText(";");
-        setLine(line);
-        setPos(pos);
+        super(";", line, pos);
+    }
+
+    public TSemicolon(TSemicolon token)
+    {
+        super(token);
     }
 
     @Override
     public TSemicolon clone()
     {
-        return new TSemicolon(getLine(), getPos());
+        return new TSemicolon(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TSlash.java b/src/main/java/org/sablecc/sablecc/node/TSlash.java
index 68eae04..0602691 100644
--- a/src/main/java/org/sablecc/sablecc/node/TSlash.java
+++ b/src/main/java/org/sablecc/sablecc/node/TSlash.java
@@ -9,20 +9,23 @@ public final class TSlash extends Token
 {
     public TSlash()
     {
-        super.setText("/");
+        super("/");
     }
 
     public TSlash(int line, int pos)
     {
-        super.setText("/");
-        setLine(line);
-        setPos(pos);
+        super("/", line, pos);
+    }
+
+    public TSlash(TSlash token)
+    {
+        super(token);
     }
 
     @Override
     public TSlash clone()
     {
-        return new TSlash(getLine(), getPos());
+        return new TSlash(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TStar.java b/src/main/java/org/sablecc/sablecc/node/TStar.java
index 37ff65d..eb5f04e 100644
--- a/src/main/java/org/sablecc/sablecc/node/TStar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TStar.java
@@ -9,20 +9,23 @@ public final class TStar extends Token
 {
     public TStar()
     {
-        super.setText("*");
+        super("*");
     }
 
     public TStar(int line, int pos)
     {
-        super.setText("*");
-        setLine(line);
-        setPos(pos);
+        super("*", line, pos);
+    }
+
+    public TStar(TStar token)
+    {
+        super(token);
     }
 
     @Override
     public TStar clone()
     {
-        return new TStar(getLine(), getPos());
+        return new TStar(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TStates.java b/src/main/java/org/sablecc/sablecc/node/TStates.java
index 6f4dd26..ac0705d 100644
--- a/src/main/java/org/sablecc/sablecc/node/TStates.java
+++ b/src/main/java/org/sablecc/sablecc/node/TStates.java
@@ -9,20 +9,23 @@ public final class TStates extends Token
 {
     public TStates()
     {
-        super.setText("States");
+        super("States");
     }
 
     public TStates(int line, int pos)
     {
-        super.setText("States");
-        setLine(line);
-        setPos(pos);
+        super("States", line, pos);
+    }
+
+    public TStates(TStates token)
+    {
+        super(token);
     }
 
     @Override
     public TStates clone()
     {
-        return new TStates(getLine(), getPos());
+        return new TStates(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TString.java b/src/main/java/org/sablecc/sablecc/node/TString.java
index f04e798..74779c4 100644
--- a/src/main/java/org/sablecc/sablecc/node/TString.java
+++ b/src/main/java/org/sablecc/sablecc/node/TString.java
@@ -9,20 +9,23 @@ public final class TString extends Token
 {
     public TString(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public TString(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public TString(TString token)
+    {
+        super(token);
     }
 
     @Override
     public TString clone()
     {
-        return new TString(getText(), getLine(), getPos());
+        return new TString(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TSyntax.java b/src/main/java/org/sablecc/sablecc/node/TSyntax.java
index 699ec81..292cdcb 100644
--- a/src/main/java/org/sablecc/sablecc/node/TSyntax.java
+++ b/src/main/java/org/sablecc/sablecc/node/TSyntax.java
@@ -9,20 +9,23 @@ public final class TSyntax extends Token
 {
     public TSyntax()
     {
-        super.setText("Syntax");
+        super("Syntax");
     }
 
     public TSyntax(int line, int pos)
     {
-        super.setText("Syntax");
-        setLine(line);
-        setPos(pos);
+        super("Syntax", line, pos);
+    }
+
+    public TSyntax(TSyntax token)
+    {
+        super(token);
     }
 
     @Override
     public TSyntax clone()
     {
-        return new TSyntax(getLine(), getPos());
+        return new TSyntax(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TTokenSpecifier.java b/src/main/java/org/sablecc/sablecc/node/TTokenSpecifier.java
index 98bc334..07c2414 100644
--- a/src/main/java/org/sablecc/sablecc/node/TTokenSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/TTokenSpecifier.java
@@ -9,20 +9,23 @@ public final class TTokenSpecifier extends Token
 {
     public TTokenSpecifier()
     {
-        super.setText("T");
+        super("T");
     }
 
     public TTokenSpecifier(int line, int pos)
     {
-        super.setText("T");
-        setLine(line);
-        setPos(pos);
+        super("T", line, pos);
+    }
+
+    public TTokenSpecifier(TTokenSpecifier token)
+    {
+        super(token);
     }
 
     @Override
     public TTokenSpecifier clone()
     {
-        return new TTokenSpecifier(getLine(), getPos());
+        return new TTokenSpecifier(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TTokens.java b/src/main/java/org/sablecc/sablecc/node/TTokens.java
index 0274048..04ef9e3 100644
--- a/src/main/java/org/sablecc/sablecc/node/TTokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/TTokens.java
@@ -9,20 +9,23 @@ public final class TTokens extends Token
 {
     public TTokens()
     {
-        super.setText("Tokens");
+        super("Tokens");
     }
 
     public TTokens(int line, int pos)
     {
-        super.setText("Tokens");
-        setLine(line);
-        setPos(pos);
+        super("Tokens", line, pos);
+    }
+
+    public TTokens(TTokens token)
+    {
+        super(token);
     }
 
     @Override
     public TTokens clone()
     {
-        return new TTokens(getLine(), getPos());
+        return new TTokens(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TTree.java b/src/main/java/org/sablecc/sablecc/node/TTree.java
index 4fb7688..4701d53 100644
--- a/src/main/java/org/sablecc/sablecc/node/TTree.java
+++ b/src/main/java/org/sablecc/sablecc/node/TTree.java
@@ -9,20 +9,23 @@ public final class TTree extends Token
 {
     public TTree()
     {
-        super.setText("Tree");
+        super("Tree");
     }
 
     public TTree(int line, int pos)
     {
-        super.setText("Tree");
-        setLine(line);
-        setPos(pos);
+        super("Tree", line, pos);
+    }
+
+    public TTree(TTree token)
+    {
+        super(token);
     }
 
     @Override
     public TTree clone()
     {
-        return new TTree(getLine(), getPos());
+        return new TTree(this);
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/Token.java b/src/main/java/org/sablecc/sablecc/node/Token.java
index cd88b31..861f498 100644
--- a/src/main/java/org/sablecc/sablecc/node/Token.java
+++ b/src/main/java/org/sablecc/sablecc/node/Token.java
@@ -12,6 +12,31 @@ public abstract class Token extends Node implements IToken
     private int line;
     private int pos;
 
+    public Token(String text, int line, int pos)
+    {
+        this.text = text;
+        this.line = line;
+        this.pos = pos;
+    }
+
+    public Token(String text)
+    {
+        this(text, 0, 0);
+    }
+
+    public Token()
+    {
+        this((String)null);
+    }
+
+    public Token(Token token)
+    {
+        super(token);
+        this.text = token.text;
+        this.line = token.line;
+        this.pos = token.pos;
+    }
+
     @Override
     public String getText()
     {
diff --git a/src/main/resources/org/sablecc/sablecc/alternatives.txt b/src/main/resources/org/sablecc/sablecc/alternatives.txt
index ef3c2d4..eb1569c 100644
--- a/src/main/resources/org/sablecc/sablecc/alternatives.txt
+++ b/src/main/resources/org/sablecc/sablecc/alternatives.txt
@@ -78,24 +78,29 @@ $
 
 Macro:CloneHeader
 
-    @Override
-    public $0$ clone()
+    public $0$($0$ node)
     {
-        return new $0$(
+        super(node);
+
 $
 
 Macro:CloneBodyNode
+        set$0$(cloneNode(node._$1$_));
 
-            cloneNode(this._$1$_)$2$
 $
 
 Macro:CloneBodyList
+        set$0$(cloneList(node._$1$_));
 
-            cloneList(this._$0$_)$1$
 $
 
 Macro:CloneTail
-);
+    }
+
+    @Override
+    public $0$ clone()
+    {
+        return new $0$(this);
     }
 
 $
diff --git a/src/main/resources/org/sablecc/sablecc/productions.txt b/src/main/resources/org/sablecc/sablecc/productions.txt
index 061f218..90b681f 100644
--- a/src/main/resources/org/sablecc/sablecc/productions.txt
+++ b/src/main/resources/org/sablecc/sablecc/productions.txt
@@ -12,6 +12,14 @@ package $0$;
 
 public abstract class $1$ extends Node
 {
+    public $1$()
+    {}
+
+    public $1$($1$ node)
+    {
+        super(node);
+    }
+
     @Override
     public abstract $1$ clone();
 }
diff --git a/src/main/resources/org/sablecc/sablecc/tokens.txt b/src/main/resources/org/sablecc/sablecc/tokens.txt
index f93224c..c26f643 100644
--- a/src/main/resources/org/sablecc/sablecc/tokens.txt
+++ b/src/main/resources/org/sablecc/sablecc/tokens.txt
@@ -20,20 +20,23 @@ public final class $2$ extends Token
 {
     public $2$(String text)
     {
-        setText(text);
+        super(text);
     }
 
     public $2$(String text, int line, int pos)
     {
-        setText(text);
-        setLine(line);
-        setPos(pos);
+        super(text, line, pos);
+    }
+
+    public $2$($2$ token)
+    {
+        super(token);
     }
 
     @Override
     public $2$ clone()
     {
-        return new $2$(getText(), getLine(), getPos());
+        return new $2$(this);
     }
 
     @Override
@@ -61,20 +64,23 @@ public final class $2$ extends Token
 {
     public $2$()
     {
-        super.setText("$3$");
+        super("$3$");
     }
 
     public $2$(int line, int pos)
     {
-        super.setText("$3$");
-        setLine(line);
-        setPos(pos);
+        super("$3$", line, pos);
+    }
+
+    public $2$($2$ token)
+    {
+        super(token);
     }
 
     @Override
     public $2$ clone()
     {
-        return new $2$(getLine(), getPos());
+        return new $2$(this);
     }
 
     @Override
diff --git a/src/main/resources/org/sablecc/sablecc/utils.txt b/src/main/resources/org/sablecc/sablecc/utils.txt
index 983fc3e..05a3036 100644
--- a/src/main/resources/org/sablecc/sablecc/utils.txt
+++ b/src/main/resources/org/sablecc/sablecc/utils.txt
@@ -30,12 +30,17 @@ public final class Start extends Node
         setEOF(_eof_);
     }
 
+    public Start(Start node)
+    {
+        super(node);
+        set$2$(cloneNode(node._$3$_));
+        setEOF(cloneNode(node._eof_));
+    }
+
     @Override
     public Start clone()
     {
-        return new Start(
-            cloneNode(this._$3$_),
-            cloneNode(this._eof_));
+        return new Start(this);
     }
 
     @Override
@@ -153,20 +158,23 @@ public final class EOF extends Token
 {
     public EOF()
     {
-        setText("");
+        super("");
     }
 
     public EOF(int line, int pos)
     {
-        setText("");
-        setLine(line);
-        setPos(pos);
+        super("", line, pos);
+    }
+
+    public EOF(EOF token)
+    {
+        super(token);
     }
 
     @Override
     public EOF clone()
     {
-        return new EOF(getLine(), getPos());
+        return new EOF(this);
     }
 
     @Override
@@ -193,6 +201,31 @@ public abstract class Token extends Node implements IToken
     private int line;
     private int pos;
 
+    public Token(String text, int line, int pos)
+    {
+        this.text = text;
+        this.line = line;
+        this.pos = pos;
+    }
+
+    public Token(String text)
+    {
+        this(text, 0, 0);
+    }
+
+    public Token()
+    {
+        this((String)null);
+    }
+
+    public Token(Token token)
+    {
+        super(token);
+        this.text = token.text;
+        this.line = token.line;
+        this.pos = token.pos;
+    }
+
     @Override
     public String getText()
     {
@@ -263,6 +296,17 @@ public abstract class Node extends PositionedNode implements Switchable, Cloneab
 {
     private Node parent;
 
+    public Node()
+    {}
+
+    public Node(Node node)
+    {
+        super(node);
+        // Copy constructor intentionally does not keep parent!
+        // The new copied node is not a child of the original parent anymore.
+        this.parent = null;
+    }
+
     @Override
     public abstract Node clone();
 
-- 
GitLab