diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a309194642e7c5d24a1d7ced2cd30f9532c3ce82..90e332a54767aaf8bb6e96e4cd51d8b40ff0c587 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -38,9 +38,9 @@ tests:jdk-21:
 publish:
   stage: deploy
   script:
-    - openssl aes-256-cbc -pass "env:ENCRYPTION_PASSWORD" -d -a -md md5 -in secring.gpg.enc -out secring.gpg
-    - openssl aes-256-cbc -pass "env:ENCRYPTION_PASSWORD" -d -a -md md5 -in pubring.gpg.enc -out pubring.gpg
-    - openssl aes-256-cbc -pass "env:ENCRYPTION_PASSWORD" -d -a -md md5 -in gradle.properties.enc -out gradle.properties
+    - openssl aes-256-cbc -d -base64 -pbkdf2 -pass "env:ENCRYPTION_PASSWORD" -in gradle.properties.enc -out gradle.properties
+    - openssl aes-256-cbc -d -base64 -pbkdf2 -pass "env:ENCRYPTION_PASSWORD" -in pubring.gpg.enc -out pubring.gpg
+    - openssl aes-256-cbc -d -base64 -pbkdf2 -pass "env:ENCRYPTION_PASSWORD" -in secring.gpg.enc -out secring.gpg
     - ./gradlew ${GRADLE_OPTIONS} publish
   only:
     - master@general/stups/sablecc-stups
diff --git a/build.gradle b/build.gradle
index 059f2c1239eaae07b683c7a6b79b4652287cb3da..dbf3fa55c9a6b64c5d9d8edf81fdbce4b83b9d80 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,7 +6,7 @@ apply plugin: 'signing'
 
 allprojects {
   project.group = 'de.hhu.stups'
-  project.version = '3.7.0'
+  project.version = '3.8.0'
   project.ext.isSnapshot = project.version.endsWith("-SNAPSHOT")
 
   ext."signing.secretKeyRingFile" = rootProject.file("secring.gpg").absolutePath
diff --git a/gradle.properties.enc b/gradle.properties.enc
index 83e084509404a88a304c64f23a26e07bf592c44d..c1867a27ac7d323a86ce3c5a2d8257a97a0a5b10 100644
--- a/gradle.properties.enc
+++ b/gradle.properties.enc
@@ -1,5 +1,4 @@
-U2FsdGVkX18nOHLNyyzYk3lwSF0IGgXp8ubFJuMWOPaMbTBmgRPWS/jQT4LO17HP
-W5yqIb+NzcYqzLBohg9s9r4XFyoS5ic3TIyPp87IXzgWNh3gKV+F+DfbggwMjiyJ
-0gZI+90cmkWXBDW7c3JijLOX2f0NATwuiwHFPau3FCKC0cp7uOArtqkbfZau2how
-oP8hzzAue50fahPuBfg8h3OtofJW9x9UCUxxD/NXzD8VZFQabICUjI8mcjEcvaea
-MqQn9JuoekIRPDUsUwZ9Er07OkzKXHB5c968S3DUP3w=
+U2FsdGVkX1+BEAbjRIB+mXtm8SXf7JkI+WHnEimPW4vLHWrbGs8PY7u+B9BCqO+3
+vmUhdJFfnwJglivtRmt3ecLUpSSG3pZFXrdtnR/eHdLIkbGIIjZRcRTokF66Z2CQ
+sWdDhhu2gsRxXOiKSQ/d5MknWHd+zlLoMiWJv3u+EQ3desH/cadBC1RAod7L6Kul
+UtSAw5pmAJFaBrRFoOJVvw7hi5ZkpcMB3JTZL2+1Tsxs50m7XAqc5PVdCHpMqVMb
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index d64cd4917707c1f8861d8cb53dd15194d4248596..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index a80b22ce5cffec8b48ee79b11c67945e91f99d5f..a4413138c96c6ed29b6e2f5e147cd77426ae4409 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
 networkTimeout=10000
 validateDistributionUrl=true
 zipStoreBase=GRADLE_USER_HOME
diff --git a/gradlew b/gradlew
index 1aa94a4269074199e6ed2c37e8db3e0826030965..b740cf13397ab16efc23cba3d6234ff8433403b1 100755
--- a/gradlew
+++ b/gradlew
@@ -55,7 +55,7 @@
 #       Darwin, MinGW, and NonStop.
 #
 #   (3) This script is generated from the Groovy template
-#       https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+#       https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
 #       within the Gradle project.
 #
 #       You can find Gradle at https://github.com/gradle/gradle/.
diff --git a/pubring.gpg.enc b/pubring.gpg.enc
index fb1dfb132bd34d077723753821aefdc42be64bc2..8ad11824421415e5455b09b4fc68af040a6c190f 100644
--- a/pubring.gpg.enc
+++ b/pubring.gpg.enc
@@ -1,26 +1,26 @@
-U2FsdGVkX1/MdPD8TmHygEYUS49v1M2eqrSgZK0x8pZ/mIO51EnU4UUelrxxyGN5
-NvnLUPVhm63e2EtzQ3Yhq8f5rb7+2rZ/vwlL6SteBhxH5G0bwb0gCdA2rUiyWKJw
-tKwAjizS1TYs1AgU4LpUIQ1iGmvg1WDmuyWpZvJ/2vR/v6rT/5OxHAKzk5MclbDq
-a7HfR3XiRmH0zZKMk38zD7id04pDstDO6jfLE1OOay9Rg8qIfUbenHzBlQLiqqz+
-lDsJtzT9UZmtKK0X89TQ7dfS7cmbgpJB11ibLAi+EEJqqkEP2U5BT5qRFsehTp/X
-Xh07xOnyMbQXo67cAZ6GkGhw3Wy/71JRRK2ynLg8NmxgTsTqxhcJX4bZ0gCKLome
-1QR5B1fhmo2IMpWE8shgk8gm3AKtlo7v8eGzVFmpchrog5HBFclupLUVD5rLj6ei
-dncq8jsJ0AlcjFsW+Cyg8/2Tncdi/uwiwsKJdligvXKECAcvuNhFBFPrlPB4Z1KY
-f6SQG2LAu5746zCQ29Hpkj5UKiCqCXqdYnG6PCx2ZNkbDSR31GeqK+GbYoahKGxb
-VDuBw033g5bvAIeRUuGYC5ua3LhW7Fs5ElUx3feAVjJALtA1FB9mtK2vVwVU/bmS
-2f02VBKvYVfZ2asILQJ2HuC157TBbAPEJAu4M+0YR5T9fUiDGLbhDHq4E4vZp+LJ
-7WKMecy+zXkvuF13TkxbzmAdh/pQvq8uhLvu24fPbHvzudasZA0n+VwRqg8whzxX
-2rodf86Zk3aVPwYPq/o/j1aXRE1zPZHIeZv7mmp+dNvhqS0sjr8fPziUS/MnwzJz
-J/K9Z7cXGE1wQIIHnTZGbAa6LI0keV/Ba5IgKLR0CifugjwU4vxHdHEzvo2YZIJI
-AVR9oVQMcAx73GWEYlO3SG9IktHamfo76U3FAUtthRZ2D46Us0+LuNsPL92OC7o8
-2+rdgtzulCuYbcVaAFJTrpg4NTHU5uJf8CsDrQKt+1frmV/+lFye7P1OJcREPuQ4
-RA7+1V3A2x8hOiDBo1BBr0MskLu+01l+Lh4YzPd8jTcngn6T7WO5P6689O6Nk4QS
-Dg9ubHo3BWdGdJ4nK44qGMa/GfZKG9pShn3Zoq2+1Y5jYCmyjs5/jtV0Zw7NDCTz
-5ZBqBU7lxrc0gAUy3dH5IYTmOBNUieZKDYG/sILtBs363am7tQ3sfqgIJEA2nRxI
-PnlYAy+JEYKz80zY1c4CFC2gfZzed8499pPMsSjRc8TX8wpe+iE/fL7rjpBdSRi1
-xBSK4BiSOQOLp5Rw5SHDzBpdK9aobNQECCUhkejYEfTi0Xw6v1QZ8U6tNjZQ9+M2
-56VH4wuvYXE++L3SUVEYTJPi3yYC8v+fo80hkm3KF/wIWmeZqmjsRVDHatHxEfld
-vzRhO0Lb1CsJo9aq+FAd5E/Ek9skQE1dXoQLRXgFkEJGbmo9hysxz2CB89CaaREW
-l/hRW/v3Zqw6giQfe8hOEpyg7yj6xGgEuCuv5Uiz3gLg4NAg8Wvbq0K40ne7ukIO
-DrbAkG2+0+TyIBv/ocZJykQ974SD+w0t3qIBeW0q9cxqTtKAX8OAaJhdXx5IiCcW
-KpRBcAzZBCC0hKdBTVp/50+ySfcBzHJDnxVzGaWx/DA=
+U2FsdGVkX1/ecmzt62K2yKsVlvmQKkfzExhaIo9Zm8/ZobX4Q9asbrssdDbfAdpX
+lyIp3wY65EPLcROlrNZqLTjAbcZrPnQyKgCYRr0+s5/0iy6noTWa52EZyPvmP3fw
+vsIM/MqFjZCBUhFfvvIb2qNz5+d84lvsOojzeYm+9xSKCx8k24XupcsWuMgfiNla
+vmpeUUCPHAYB1clTNn66YdChrQJCcrbnHUmBWms3lSU5waZ5i1dnteaLCLo6M58O
+H/7YKOb5cg/0WFE6/l28xFk49ACcAH6i3q3pf99XyPGk+/kvG/Zx+8HvaoG26MkM
+HrV60kJgh1t4LBtvadvHk0UyODZJzrH/4ka1XVJv18ZQ5pcLTI6sNEwkM9XjxaU0
+Ik7DIxf6onEaBlk1nRnhXi97gKa7+XjVR82pLXgPEn5HrAe+ObX1UL0VqfJw7EXs
+Nb2ZVciC/ugfi3UiHuOtFmImo+MRLXvvqkpW49VfO5GwBBpmjM9PcXdRzdtU8USp
+Z+KXXBoUPfZupCpty+ZCq8uBEMW93ifeqOLOqcr8B496LrPOC+T4D/MOh+1Pdpy+
+3YmzdfwttqKXNULhiW/loljKoKOBOjO6DDWwyEH+4LEuZYgXdC6nfedchU+F5ZQw
+ORtyrkznV7baoNR/UDT33qz0c3fEtoWmPtiuiClHN12CoXWamK7dwBKP64aPL5Xy
+UaYsrbjhMhW3/miVx6NgIv0iq8B/aUrJIXVdGWycVJVciRbgk1Px6z1lo3GOaZad
+APqExffMHUOQZCjv8AC9tKsy2heog97Q4jUwOCHdghfmKK16ksy4plDaVN322uOG
+S3mkfJLxw/2oUeAA8IFARCZ1FoCINPKxiRevPXhoizRNa7WzmQ4jT9C+BWDJeitn
+LrA7fMmTpW0z7oaQez2VTSFg5liDtozp7Dp+d5MBA9Rg4B69F121FIt3MXWACHFl
+5YW2+Sa6czh8P7eZQ4lRGOl8Y56NAE72n5l15HUdxrnEowwREuHAmWVdWCi16oTJ
+JUqcSv3vu4WZQo3XhoB36ll0gvYZezlzoxpSqekBwlDkKCqevhncyu0UefG9fApu
+g/2gDmQIVeAMfKytEyAomXCNiFriesqPBAyt3ZRivbWCMeBGT3KuMO2BIigfW7na
++BdpdeCF8KIEiOq69Ulaw6wo2lTOlP+utuD6D3iB0ATsvr18Bj9CXN7lloQD4tmw
+DTUxrYBFjjtK6/SINHq0CwCgY968QdL+muk1A1xIiOK4ELNSLK16qIHUKYN5G7pr
+eGNRD0KGeg64u42o+R1bZaYOWEqDHw9gWP9uuDp+M31T2uz3+NZS7JOmqpwh1VRy
+4hW7BEhLO+C/A+feWeuXq5PXlMaeEE0+L8QE0nvto3N3HqsiwXIgg54AsQEkRCxp
+uybDyfvAc4ni+GTd+8g0oUilzxa/oHGGzD386/aZDVWXhNiFZNXfr2LJljMW+lRT
+7A5z/IIegoN5lSNy4IwbJY4WSRMaZ3jX7zM/t5IAyeB2/BXuiKspJ+XKhNwib5Mo
+NKuwogypLpPux7968PkRHiOk3ndizKTUQj4RF52dWqW7ekbYelK1fcJXxILXDYi7
+8i/H7c7cUzvYvmnHe+2PArs2yVUL+fBrrsdXSaaswMs=
diff --git a/sablecc-runtime/build.gradle b/sablecc-runtime/build.gradle
index 04aef5c5b058f2adec7fc1c8b3f13a0736ee9e05..f70c48ac9ca1fe0a4ac21bed7b2e6802b7ffa4f7 100644
--- a/sablecc-runtime/build.gradle
+++ b/sablecc-runtime/build.gradle
@@ -29,6 +29,10 @@ publishing {
         url = 'https://gitlab.cs.uni-duesseldorf.de/general/stups/sablecc-stups'
         
         licenses {
+          license {
+            name = 'Eclipse Public License, Version 1.0'
+            url = 'http://www.eclipse.org/org/documents/epl-v10.html'
+          }
           license {
             name = 'GNU Lesser General Public License, Version 2.1'
             url = 'http://www.gnu.org/licenses/lgpl-2.1.html'
diff --git a/sablecc-runtime/epl-v10.html b/sablecc-runtime/epl-v10.html
new file mode 100644
index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1
--- /dev/null
+++ b/sablecc-runtime/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
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 dea3bfe839585b1d5d98d425f11f6895041752da..0a4b9af4ae40e31cc8f304639f3b066bce15ae92 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
@@ -19,10 +19,24 @@ public class PositionedNode {
     this(null, null);
   }
 
+  @Deprecated
   public PositionedNode(final PositionedNode node) {
     this(node.startPos, node.endPos);
   }
 
+  /**
+   * Copies the {@link SourcePosition}s from the given node to this node.
+   * This is an internal helper method for use in {@link Object#clone()} implementations.
+   * 
+   * @param node the node from which to copy the source positions
+   */
+  protected final void initSourcePositionsFrom(PositionedNode node) {
+    // Intentionally do not use the accessors (getStartPos, getEndPos) here
+    // so that cloning a Token does not trigger lazy creation of SourcePosition objects.
+    this.startPos = node.startPos;
+    this.endPos = node.endPos;
+  }
+
   public SourcePosition getStartPos() {
     return startPos;
   }
diff --git a/secring.gpg.enc b/secring.gpg.enc
index 048652a825198ed70f778f2b82600b83be9d5d3e..087d41d8e55ca33bbdbacc52334567604dfe3398 100644
--- a/secring.gpg.enc
+++ b/secring.gpg.enc
@@ -1,55 +1,55 @@
-U2FsdGVkX1+qD9zNt5PsTWUNPv0+h3MZr3LMQniTSXNJ70iaxTv8TOQ2EFQM42X0
-IKPutnofk+e17tRWJch3XTzTI95sU7s8NgtrorS9cNJQMMpZrMSNGt6jHbLGC6jL
-F4AWjk3fNg4s0OVPvVD4ZXbdLm1BJaNuz094kRGNNTYPrFapxkPr6WVDjnZsh3bh
-S5xhQ84hSAyfXKShs8HidN6Mf6XZvRgVsXg87SeCNQlTtyU+k8o5/COXZ35XhNjY
-NUEOSaSaBbhC16fNC8rWYTqcOsrypiikuZAT+qo2ZfMw3/SYUyc9q9qPfQvITJqb
-YtfQsdfQEarI0skRBZLuNs8OOWMh473YaMqicaNfOUTtPm3NPElZNAIVyM6wp3lh
-36Ovib377R0IAvsSg5ktSHWbkPOY1MqDusHRHW5s5jjrjAtKyi3iWjQ4L4Mf67lj
-ZJ9b2YQpdqQQOpZg8nRghk/Dqw2XGWc/84LgnaTCdSTsYSyZbDkYvLbyNzoNbcx1
-i2BOUqDaA9N3lGdgSqrHLjVdH3LegpCaEBsi3I8ZdDVfZMHckujYI7+/rDqzDxQ2
-btbHt9LKcciOpWZvrD83R5Uq4WewWrkx6vKUYwQAklKu4SkKUz/Q+P4esWWfgMcy
-XXhhzMhvhx9Hsham5AznWU5oXDhCxdrdpXtI56Jepa444M9e7JaoszaQ5V0rHFhA
-F2Ko7vDlk1LRjJ1f27T3Uaj26jspyCiaAi7kVBTriCVGp7yEoAJ5EBeOOPKSzzOa
-pxyzYuKQlf+nQoo5t8TPpgLIPJbip70n0HNkKDc2cj8102ZeKgGWkpnNawrtgkjs
-b5DK3f+SjuZCWGnXZ2pcM01NIAXOCnw7hCH06z5hXmzK/jDDbckWL/F7sVtO4n7Z
-yICynW0m2EkzMpU4yPC5f5h9iNpNgV1xirjZ5F2QbiguvtAZOo0YSGtE6lO/22uI
-jgXW5uMzkh3doBatbEsJYh8dGzrCqq1leC8b+MBOM8Xby4wkCgSSCOzclF9AIRe6
-axHGfFtO/wOv0Z/6CeuREvw38MIjozVIZomjddEj9KLW1/30ljksvhDnv2pS0vVm
-nAvYiXvtuvMwDzmFEpsAqinyFbzS3lCMzlqRoATFbjUGAh29Xz9PHsLHb0B9KjRD
-1/rz3BVhzNaYEvCMX8J0M5mzjAzTaB8eWkQnZ+wLfmUJlvt6XFxDuLbcNGmCZ2th
-8NNfvly6Awbkln2R3wism0oIDUnO8KrUJmVtCcbOIiEkrsOEq62oF3Ndof5jKHUx
-2KcjuzSrKiXoYoVH4uTh2HiKHVB71yZ8Fpwrbda16AMrmpA35urKeEmAjTsmT0iT
-Plxnd4cPfqSxAesGOpz5jhRjPc/3FqIYvewf1eINUHteduDwLqeA0SqBcDgW6YIO
-LRPQhJdsDnpmV5NKXbSHChRAsk+4CrCS68WNJ/RrY1NhuFktjHQ+mHyg886YMnmg
-bYRd9CKmlYDBVsgpFJFT7wDMoCWZ132flqegu8ojsdjXD/2i18kcyZgFx/YFimz9
-u2NRVOJnU0ec5tTk0HNi3q5wG/pgIWj8et2HDSDBr2dhBc5s+s9EhL3JXDr3SoEp
-bW41GA+G7l+FPKakOgDgiw2VBi5MmIPMwDRzhi/VD3mrI8SfKFDQxq1Ro91dy0sO
-cQ4Ku1esMojqNJO+sPUOm0LYj3BgL+bUQdc4Vj4gvo/uDEk7SrPloDaMPjzbQsQ4
-wJ+NRuF82NvagdA25vEMxLD3O3aD7wsQA/Fsbh04GLwbGkH+Kl9QGmMVMHJU2Dn/
-1owCuIvNRYZU587HQXDitM5Be7+EixE/90PLuAioe8iNDiCHUPwiYMHge5ZNZlbk
-agN4KjmkEpCh0XwOLvD9F5PDji8dAp6AOmZhQK+y0XTGGQCWD2k6tBFD94Ux4wOi
-J18zIEDeRJWZA/WiyqEihVIRNcq7NZQRfv3PsSbU8wFbVg379yJftfIdXj8fJFcI
-7gKK7gYv2A6K9kS6pNSN8kSWBsukiz0/njiPZH1wjyeSrONueacJ9guk9hzTeN68
-iD00zcdtukC6ZtxXRB9XOAbXTGhbyWrdb5ATCmJLFG8riUTJVo5DIyHzCg4rCRef
-2yq5Pe1MVsV8960AnkE1iyin2lMebzJJL8ridlHmzhaNIRSSGxstv1tnaZL1xVWV
-c2pLWkch6uEzdyC5Zyd5Xi56zyxUxxCYPEPA9lortKgW7KdYULUvTBHfRoGAUqjZ
-6yHl37DF1MWFHmV4Dk1yHNP7uVazF+7c1hJTvqop/ytFkgIEhLq8SHWBEHG/sGVi
-R11UfpoVHdkT3KJm6Y/tml9SLxES65ENzLGPTKVUAaHKImADXrMI9slU+lUMHDr8
-MwKx3+4xSgUUYWL2+YfayURNK6LIUskmsOlGy212z1B/pJc8DvrH9rqj6NtBaQlZ
-lR6A9eiG3i88N2PvibxMuHW+ye0zlbiktqArWQAhNgt9mM05BQSb2Ce55cl8yLCD
-+3eSAIFUKQhn4aHNaEutGD7q02bjX1pcUymM9NV2WxHtG5dQPa8eWRXKwJca3V6w
-WKC/ve1HXsCunjW5mc2FvtsqqKUANzRjTV2fkbQlMdVfdThy+MIxJs0P8XMbyxT7
-tjwt4tuq42ZAQkj8dLL2j1z+/otzH3LtfYjl3CjDjWPlfVFJn+1lISQDBdzWPYe/
-xnhNn2Gsx0jWv1vX0dbxD8gyXP68yS3KLPTBb6DoTbjW+0LraTLlHSw2rNJ/zTsM
-5hcf7PnuEr3c34bVjP2XLjrZ6qT0+TEXJ8vR6ptuUL/GFREG8ByfBG4SFphR1Nkr
-iuySq+4awgKwmXrfiVdBQPrn+UWfH/UQh6Jt2J0xvRwcs7/COO5LcWqjD4bSCw9a
-CfSkivrrEDmeE4aruA1eOeauVbRcqwtMuzCV7Gq282LKambmnKiWvrk9wJnF2IaQ
-wV8rjmBM08sf+93/P+TbYhY4e/z27+ml844HwoNsivuvmo70z8nYNnFXKKOewZby
-Vw0I3JX/2vkHllMFtLcJqnQLD8zJR2SclkUnWv4S519qR0sg9kzFvggTvB740KDu
-Ohu1wIeHkTv9ZnCfu/7gK3lxNobyV2+2UhgBB4/njI/9mb4BnOJkaTG7HvJA+Pks
-BpSL7jOrmTixSLzt6rsLeYpp8J+A2+uKL5Q1t97My/yhIKjC67LuWVfKovB+5/Bk
-/C/FuDqeKDeLOl/lBs1ntQM4TDtb8uVNSmKKdlj4h+dp7J5ZIzHuKDRRw7HcWIPw
-3ThPVLFQUoDUsnRxTkenqWA4yUov0UPwpwOBswZQFqFwoX9BQ8hqk13c9P2AhVMZ
-2wR5J5cbH3sum2Np/cZUOXuqvcoQGQNyKb1t8PXsvGc3LaMraxRNUcIVJJzUr/eC
-oja8ldCr68ZwD/M+CZgQNGr1/5+78tzKdD5432/pZ6W5ZOM36xzyI71b/tZkB4S6
-ATF+WE2brPM5g2Wr4T+xKA==
+U2FsdGVkX1/uZ2q881m1pVQtzJ0DILJqtO2ZEJOotiBebJg4SmSM4TkLeSgTDFoD
+m3fsZdrdbTrOqpNjdCySadS2IwibzJjG8cRFxnetJNUdfpWGFb67kKx/Han4QaIY
+d9bvEAkg02nL3suJTa4WKVl70gjiXSheOXgWHi+L3mEGzJewORIIYBv1BE60zxjB
+72SvpfrboYxFBCahZJ/GAiNvw4aqD0Wj9G5CJlM6xY0gGTn3dXuWkUC+sciQp9UI
+rRSF+r/RMRvbUAPZY3F2S07wMSzIBct9INyhc9kQptRwhuy9BAAdfxVaMxEK3a2P
+cM7mHacEmE242/4a28unvcDnsuyV3NW74pt7f2v+LFlPvM8Cw9tpeKtFCRXfREJR
+g32dDJBo+4zSa3qLx7n4gsUFaKTDJWPtAPe0pkMLa7GrdoEVIkaIl4m1ET8+M6t4
+sKrBKP7neVnjjkSPRroxpiSQ7MLECeyj3MNUB/r/hsLg1ZLc8n90b1vPKqd4DIpJ
+PtiIcamt6K8gvAIOwUZQqdpJNNTqCLV9DnKyj5I/U8RpHAXsBe5eawX2WDxA/Ywf
+INzBibO9yUpg25OtlsHRqdcyHNmDRMAVUOWtzqa+5lGWIF3h0qWOY8BEqHf7TkjO
+O/2qPBqLSmpRcOdgUg9G/5Snpb1xo4NXEZ2kj8GC+Rf61stI38QVScLTsPSR+QKK
+9VgCSg1cQTmhQnwZLQw5pB7SdsFPtwwq62YM5E2xzZwr9f9eJVXTfIQlwjM+t7cH
+nFbyC+3ywLnvlec/NEeA4DOH5QfJ2vRUQmcXuzmuBi0vGSriVd3U4CKiRKsq7umo
+nFpo6y8i7qr4Vj3oIgRIj3yyzYEnaSyJXRJ2mhp3e4fqrMMD7MFrAZ4syKgAJ1Xh
+qFbfovebhPbA4NtLrehmZ0r9F1ovowo1X8fwqpoqaKO1LVYQkWC1N/Tkg0ASUlTh
+pF0O94r7sMv6pD7vvBvwsfZWxt6qWHVD4H6JU4ySwWHOFiFs7YWPbQIcqaw1Y9R+
+sZncQ7Aul/8HGhYhQvklsrK2Yt5nKAQCibST8UinICyAbEWnHnRLaLleB45BiAUy
+injdzUjwy2PO7sOnUa7Nf37QuxZGMIMqETapc5ONIz+CAqGjfOC1BGSB6vZmUCNn
+W3kpFHbznGTe0zAoPYFhsfnwOWc/m2xUJRRwovVYGQc+PLGEUsMa9JhxwEyb6EUg
+bXMsyfk2RBZYEV7bWqML2Nyv71nBuMDjCkAju3gUCaWeG4OVjLTjvvTTNsKWqzKt
+vevEgTteynQrUi+CvsqY1fcwyZcmqTBIen+pUYz8mK+JXfL5ppafvuRGZBWMtJW0
+Q+3x7HLGtbNO6MNoaK+dPfp5ekQ7eztRFEwTPRTuvqnVBGmgot4HkkxB3noASlCb
+xEXEjSYmQJA8Y+B0OGG8CNyKnS/ZeHgqA0K9+xPLuWmJBSEGAgpe6knBdE2+5Qqp
+/OgfTKnrCjaVZPeWUG+EwbnUriUKJfTM0SIixJwla9ml+8pzTU1qkRLgD1aychM7
+91mxducI9ZsbGAa9aH4SZWU8PC3EPoMOxqN88kZNcfb7AjWMLOdCcgHUm+zRZ/46
+zJaS3MAXDdxLmTweT/seL/7VhKvfMSo+qKX1ALSneXpYtAT/XjrIOidhCr9et9eu
+SzPdQt24lwcyuGQPIBDYt9NuMBqjFmOE6X3O3CMr4G5d0YmDJuWDZvvCEtGrQjc1
+2fREnWTzgkIvOxlYlrR0cczUpzRiAgCfU3ujHRXV+Fqch3RpxmwWz4FGsoJfJ9+a
+LNRGtMn+X9Tt/Vx9J1RlPwHJ6U3gS853MXGLXzXFKobqZL3XrMhT00kN0sONCxvc
+L17s62zThzeENKZPQxSuA2GVeR3ucip4AhPgFsCCB3m/aIPNZ45/PpRMIFVbijIz
+u3XTxv6DN2tp7rDyerRvhfNkVxdu0G8AZ18immyT2wkxnuM4SZODBFK32C6iY2Sx
+LU5GgTCSvy/ze5/DRXFhG6mcC9iUWALpfYvCGGwpwdK0MM/Xqd4t7X/kVhcEGljF
+UPN09Ja6OqYO47yZUdTUp4L+0FkHnl3wqQaL23e92mb+LpqBYUsdH9PBMAHZ6YA6
+OlDNP9n0xwoPHSz4od/6lNA93AmpVOfcrJ2N9J4GMPX44AATDLbr3Hwd8lSxvVD8
+oITXp1lZcLzpDo8AHEF/t/MkahaIxTeyjX6jAy2HB5IIXFn5IopAO5gNLS1jmT0I
+4d+9u1JxArjQRCjV0c5103SLzVFrYbTVMT7iegCAXjQ0CR3RjGQNna0KMA7Yteoy
+gTb7lNDrBjfVk3LkqsBH7bpCQik9lqmcWhYP+ry7wbAK99v/FtzhHqBjyQYHmEBC
+Zepft6grJ1JiNOwhTs0/uLQNamuMD1qNGZfta/7CQYzLARvy78DXXyfiM0vc9HeI
+cdBwm0nmn2mL3xpKZbQFUNJtzTZTUM4K+H+4Ua166Plil4Gmb2p8BM/Ulby27xDM
+OvKgofUrWorPny3kPgjlNXpWAaxGPgcrC6/Zx2mwdUBSmsGAe9aGVMk1wIN/KKdz
+uvpAYnlQu26JK39BVVO3OR9v7S3kALxGlN9TCxszWfHiq9wR/BHrZzud1XoCuzZA
++YNDLIWIkie5B7WkF6o+7HnO6/G7arl2gmTBK/i5f/vfZsnj077kQz6TPxt+/k6I
+RLWVzUvUDtqSlAO9Wnbi0gajRcsjREVrGiS0kh120x4JRJfEdVmDs/MDPK+iM7ov
+mEOgGTIa73SxZZnwqG9j6uggY6M9m/ZO0uPNTEt+jsbQ0NZ9prpI+2/6A8QAX6RE
+ug7x+98jjXf7vboTEJLTHJxbuBxJLhJjOqY1Nq0I7GahpPGZMo9yo4Ty78bF4E57
+OpT/Q0/wTVSyK9fHPQrRr5zFjvwHmCCs2wWpc76Mv2OThmzVudgyJAoUPENxLSrA
+RylkDiihi4PacfjaClbKJJ7K7cgU7KqJQgwS9AM4H8sRqQsZZX/f5UMAVXPRj6u0
+qnoH9gxIYAzvm6ceVklagTk09IWCiWqY0NGELL6+plxzjkJuXX2LstfXiHY7g29P
+FLnneZ0kNWog2ynKUVBFkdEVdS6K0aQ0xqUFXAwbNvrcpiJeY9RufQcBUlZm/fPb
+m26i9V+sL3CcHRbX4qa/QRsQ7DdjdSpOJAt0GQUco3AGfW6Z1koIjSswr0IA41no
+1A35JdElJm+lt0pHA9QWBTewNfJkXPR/GHvqUdc1sTDDXa2binNHFWhb+ydX2aQ6
+z8ceydjxEt6I3mdK89GZsc/839ctCkeevrjLIC+wAxOviGNJanfyt25BirCgntpi
+sLyqYz1nesHZeheyKQBw6y5oYI0EAtVX1ifwSvYgAjbFb1rUmeZl+NWgU14eskyT
++0SdoUgo7WNuJelmyRRoIwTgaV5p3boreRWmdA0oiIKowo6dFE+PzU/cy0dBZtL+
+xkXQZ8J6POdTEt4A9Vw6BQ==
diff --git a/src/main/java/org/sablecc/sablecc/ConstructParserGenerationDatas.java b/src/main/java/org/sablecc/sablecc/ConstructParserGenerationDatas.java
index 41e525d22071ce5ba261c752203979f98be107a7..7741f2c0122ccc66f3b42135fabf8161e941ebf9 100644
--- a/src/main/java/org/sablecc/sablecc/ConstructParserGenerationDatas.java
+++ b/src/main/java/org/sablecc/sablecc/ConstructParserGenerationDatas.java
@@ -19,9 +19,9 @@ public class ConstructParserGenerationDatas extends DepthFirstAdapter
   private boolean processingAst;
   private String currentProd;
 
-  private Map<String, Node> alts;
+  private Map<String, AAlt> alts;
 
-  public ConstructParserGenerationDatas(ResolveIds ids, Map<String, Node> alts)
+  public ConstructParserGenerationDatas(ResolveIds ids, Map<String, AAlt> alts)
   {
     this.ids = ids;
     this.alts = alts;
diff --git a/src/main/java/org/sablecc/sablecc/GenParser.java b/src/main/java/org/sablecc/sablecc/GenParser.java
index 98bcc81d5b59ba2fbad6f9f45743472fa86fe8f6..ba7d077181ec9039f1ddfc380ec69c6d5c099398 100644
--- a/src/main/java/org/sablecc/sablecc/GenParser.java
+++ b/src/main/java/org/sablecc/sablecc/GenParser.java
@@ -81,7 +81,7 @@ public class GenParser extends DepthFirstAdapter
   //Those transformations was specified by the grammar-writer.
   private final Map<String, List<PElem>> mapProductionTransformations = new HashMap<>();
 
-  private Map<String, Node> alts;
+  private Map<String, AAlt> alts;
 
   public GenParser(ResolveIds ids, ResolveAltIds altIds, ResolveTransformIds transformIds,
                    String firstProductionName, boolean processInlining, boolean prettyPrinting)
@@ -382,7 +382,7 @@ public class GenParser extends DepthFirstAdapter
                        "" + productions[i].index,
                        productions[i].name});
 
-        final Node node = alts.get(productions[i].name);
+        final AAlt node = alts.get(productions[i].name);
 
         final BufferedWriter finalFile = file;
         final Deque<Element> stack = new LinkedList<>();
@@ -414,7 +414,8 @@ public class GenParser extends DepthFirstAdapter
                                                file, transformIds, CG, CTP,
                                                simpleTermTransform, macros,
                                                listSimpleTermTransform,
-                                               transformIds.simpleTermOrsimpleListTermTypes);
+                                               transformIds.simpleTermOrsimpleListTermTypes,
+                                               stack.size());
         node.apply(aParsedAltAdapter);
       }
 
diff --git a/src/main/java/org/sablecc/sablecc/GenerateAlternativeCodeForParser.java b/src/main/java/org/sablecc/sablecc/GenerateAlternativeCodeForParser.java
index a061b73b7e4dacc4bff771f23ebc8db88c677fc2..393b2b2ebaa9fa423a71d3c298ea02ced90e807a 100644
--- a/src/main/java/org/sablecc/sablecc/GenerateAlternativeCodeForParser.java
+++ b/src/main/java/org/sablecc/sablecc/GenerateAlternativeCodeForParser.java
@@ -30,7 +30,6 @@ public class GenerateAlternativeCodeForParser extends DepthFirstAdapter
   private Map<Node, String> simpleTermTransformMap;
   private List<Node> listSimpleTermTransform;
   private Map<Node, String> simpleTermOrsimpleListTermTypes;
-
   private int popCount;
 
   GenerateAlternativeCodeForParser(File pkgDir, String aParsedAltName,
@@ -42,7 +41,8 @@ public class GenerateAlternativeCodeForParser extends DepthFirstAdapter
                                    Map<Node, String> simpleTermTransformMap,
                                    MacroExpander macros,
                                    List<Node> listSimpleTermTransform,
-                                   Map<Node, String> simpleTermOrsimpleListTermTypes)
+                                   Map<Node, String> simpleTermOrsimpleListTermTypes,
+                                   int popCount)
   {
     this.pkgDir = pkgDir;
     this.file = file;
@@ -55,13 +55,7 @@ public class GenerateAlternativeCodeForParser extends DepthFirstAdapter
     this.macros = macros;
     this.listSimpleTermTransform = listSimpleTermTransform;
     this.simpleTermOrsimpleListTermTypes = simpleTermOrsimpleListTermTypes;
-
-    this.popCount = 0;
-  }
-
-  @Override
-  public void caseAElem(final AElem node) {
-    popCount++;
+    this.popCount = popCount;
   }
 
   private String lookupInternalTypeName(Node term) {
@@ -92,7 +86,7 @@ public class GenerateAlternativeCodeForParser extends DepthFirstAdapter
     }
     else
     {
-      return typeName.toLowerCase() + "Node" + position;
+      return typeName.substring(0, 1).toLowerCase() + typeName.substring(1) + "Node" + position;
     }
   }
 
@@ -134,27 +128,18 @@ public class GenerateAlternativeCodeForParser extends DepthFirstAdapter
       {
         macros.apply(file, "ParserNewTailEmpty", null);
       }
+      else if(node.getTerms().size() == 1)
+      {
+        macros.apply(file, "ParserNewTailSingle", new String[] {getVariableName(node.getTerms().get(0))});
+      }
       else
       {
-        PTerm firstTerm = node.getTerms().get(0);
-        if (popCount > 0) {
-          // The nodeArrayList variables are numbered starting at 1, so the first popped variable has the number popCount and not popCount-1.
-          macros.apply(file, "ParserNewCheck", new String[] {getVariableName(firstTerm), String.valueOf(popCount)});
-        }
-
-        if(node.getTerms().size() == 1)
+        macros.apply(file, "ParserNewTailMultiHead");
+        for(PTerm term : node.getTerms())
         {
-          macros.apply(file, "ParserNewTailSingle", new String[] {getVariableName(firstTerm)});
-        }
-        else
-        {
-          macros.apply(file, "ParserNewTailMultiHead");
-          for(PTerm term : node.getTerms())
-          {
-            macros.apply(file, "ParserNewTailMultiElement", new String[] {getVariableName(term)});
-          }
-          macros.apply(file, "ParserNewTailMultiTail");
+          macros.apply(file, "ParserNewTailMultiElement", new String[] {getVariableName(term)});
         }
+        macros.apply(file, "ParserNewTailMultiTail");
       }
     }
     catch(IOException e)
@@ -344,12 +329,14 @@ public class GenerateAlternativeCodeForParser extends DepthFirstAdapter
 
     try
     {
+      file.newLine();
       for(PTerm param : params)
       {
         param.apply(this);
       }
 
-      macros.apply(file, "ParserNewBodyNew", new String[] {newAltName, getVariableName(node)});
+      String destVariableName = getVariableName(node);
+      macros.apply(file, "ParserNewBodyNew", new String[] {newAltName, destVariableName});
 
       if(!params.isEmpty())
       {
@@ -363,6 +350,11 @@ public class GenerateAlternativeCodeForParser extends DepthFirstAdapter
         }
       }
       macros.apply(file, "ParserNewBodyNewTail");
+      if (popCount > 0) {
+        // The popped variables are numbered starting at 1, so the first popped variable has the number popCount and not popCount-1.
+        macros.apply(file, "ParserNewComputePositions", new String[] {destVariableName, String.valueOf(popCount)});
+      }
+      file.newLine();
     }
     catch(IOException e)
     {
diff --git a/src/main/java/org/sablecc/sablecc/ResolveAstIds.java b/src/main/java/org/sablecc/sablecc/ResolveAstIds.java
index cc98cbf1ee301440d8eb02a2bd0eb8a6ae544ee4..e0a2b1a7c4cd4285c0776633b98667e6210141af 100644
--- a/src/main/java/org/sablecc/sablecc/ResolveAstIds.java
+++ b/src/main/java/org/sablecc/sablecc/ResolveAstIds.java
@@ -231,7 +231,7 @@ public class ResolveAstIds extends DepthFirstAdapter
                    else
                    {
                      ATokenDef token = astIds.tokens.get("T" + name);
-                     Node ignToken = astIds.ignTokens.get("T" + name);
+                     TId ignToken = astIds.ignTokens.get("T" + name);
                      //Object production = astIds.prods.get("P" + name);
                      AAstProd ast_production = ast_prods.get("P" + name);
                      //if()
diff --git a/src/main/java/org/sablecc/sablecc/ResolveIds.java b/src/main/java/org/sablecc/sablecc/ResolveIds.java
index 6b6c4d0e85518b6efe784971fd514612b8f221ed..c302718455edce33b1bc2658d7ca91be6501d207 100644
--- a/src/main/java/org/sablecc/sablecc/ResolveIds.java
+++ b/src/main/java/org/sablecc/sablecc/ResolveIds.java
@@ -20,9 +20,9 @@ import org.sablecc.sablecc.node.*;
 public class ResolveIds extends DepthFirstAdapter
 {
   public final Map<String, AHelperDef> helpers = new TreeMap<>();
-  public final Map<String, Node> states = new TreeMap<>();
+  public final Map<String, TId> states = new TreeMap<>();
   public final Map<String, ATokenDef> tokens = new TreeMap<>();
-  public final Map<String, Node> ignTokens = new TreeMap<>();
+  public final Map<String, TId> ignTokens = new TreeMap<>();
   public final Map<String, AProd> prods = new TreeMap<>();
 
   public final Map<String, AAlt> alts = new HashMap<>();
@@ -31,8 +31,8 @@ public class ResolveIds extends DepthFirstAdapter
 
   public final Map<Node, String> names = new HashMap<>();
 
-  public final Map<Node, String> errorNames = new HashMap<>();
-  public final Map<Node, String> elemTypes = new HashMap<>();
+  public final Map<ATokenDef, String> errorNames = new HashMap<>();
+  public final Map<AElem, String> elemTypes = new HashMap<>();
 
   public final Map<String, String> altsElemNameTypes = new HashMap<>();
 
diff --git a/src/main/java/org/sablecc/sablecc/Transitions.java b/src/main/java/org/sablecc/sablecc/Transitions.java
index e612a83ae812a23fe697aa56889422b76ae02e8f..56fd8c0eac540dccf05b30aaf115b5bc90daa07a 100644
--- a/src/main/java/org/sablecc/sablecc/Transitions.java
+++ b/src/main/java/org/sablecc/sablecc/Transitions.java
@@ -73,13 +73,17 @@ public class Transitions extends DepthFirstAdapter
   @Override
   public void outAStateList(AStateList node)
   {
-    map.put(state, transition);
+    if (!state.equals(transition)) {
+      map.put(state, transition);
+    }
   }
 
   @Override
   public void outAStateListTail(AStateListTail node)
   {
-    map.put(state, transition);
+    if (!state.equals(transition)) {
+      map.put(state, transition);
+    }
   }
 
   @Override
diff --git a/src/main/java/org/sablecc/sablecc/lexer/Lexer.java b/src/main/java/org/sablecc/sablecc/lexer/Lexer.java
index 43c6fda5dfab8fdd431b3ac2a5e0675e8e774f16..c38142abd0ab59a90dc6849b637833b758bb01b7 100644
--- a/src/main/java/org/sablecc/sablecc/lexer/Lexer.java
+++ b/src/main/java/org/sablecc/sablecc/lexer/Lexer.java
@@ -61,15 +61,14 @@ public class Lexer
         int startPos = this.pos;
         int startLine = this.line;
 
-        int acceptState = -1;
         int acceptToken = -1;
         int acceptLength = -1;
         int acceptPos = -1;
         int acceptLine = -1;
         boolean acceptCr = false;
 
-        int[][][] gotoTable = Lexer.gotoTable[this.state.ordinal()];
-        int[] accept = Lexer.accept[this.state.ordinal()];
+        int[][][] gotoTableSub = Lexer.gotoTable[this.state.ordinal()];
+        int[] acceptSub = Lexer.accept[this.state.ordinal()];
         this.text.setLength(0);
 
         while(true)
@@ -126,7 +125,7 @@ public class Lexer
 
                     dfaState = -1;
 
-                    int[][] tmp1 =  gotoTable[oldState];
+                    int[][] tmp1 = gotoTableSub[oldState];
                     int low = 0;
                     int high = tmp1.length - 1;
 
@@ -160,10 +159,9 @@ public class Lexer
 
             if(dfaState >= 0)
             {
-                if(accept[dfaState] != -1)
+                if(acceptSub[dfaState] != -1)
                 {
-                    acceptState = dfaState;
-                    acceptToken = accept[dfaState];
+                    acceptToken = acceptSub[dfaState];
                     acceptLength = this.text.length();
                     acceptPos = this.pos;
                     acceptLine = this.line;
@@ -172,395 +170,193 @@ public class Lexer
             }
             else
             {
-                if(acceptState != -1)
+                Token tok;
+                switch(acceptToken)
                 {
-                    switch(acceptToken)
-                    {
-                        case 0:
-                        {
-                            Token token = new TPkgId(getText(acceptLength), startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            switch(state.ordinal())
-                            {
-                                case 1: state = State.PACKAGE; break;
-                            }
-                            return token;
-                        }
-                        case 1:
-                        {
-                            Token token = new TPackage(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            switch(state.ordinal())
-                            {
-                                case 0: state = State.PACKAGE; break;
-                            }
-                            return token;
-                        }
-                        case 2:
-                        {
-                            Token token = new TStates(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 3:
-                        {
-                            Token token = new THelpers(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 4:
-                        {
-                            Token token = new TTokens(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 5:
-                        {
-                            Token token = new TIgnored(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 6:
-                        {
-                            Token token = new TProductions(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 7:
-                        {
-                            Token token = new TAbstract(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 8:
-                        {
-                            Token token = new TSyntax(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 9:
-                        {
-                            Token token = new TTree(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 10:
-                        {
-                            Token token = new TNew(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 11:
-                        {
-                            Token token = new TNull(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 12:
-                        {
-                            Token token = new TTokenSpecifier(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 13:
-                        {
-                            Token token = new TProductionSpecifier(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 14:
-                        {
-                            Token token = new TDot(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 15:
-                        {
-                            Token token = new TDDot(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 16:
-                        {
-                            Token token = new TSemicolon(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            switch(state.ordinal())
-                            {
-                                case 0: state = State.NORMAL; break;
-                                case 1: state = State.NORMAL; break;
-                            }
-                            return token;
-                        }
-                        case 17:
-                        {
-                            Token token = new TEqual(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 18:
-                        {
-                            Token token = new TLBkt(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 19:
-                        {
-                            Token token = new TRBkt(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 20:
+                    case -1:
+                        if(this.text.length() > 0)
                         {
-                            Token token = new TLPar(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
+                            throw new LexerException("[" + (startLine + 1) + "," + (startPos + 1) + "] Unknown token: " + this.text);
                         }
-                        case 21:
-                        {
-                            Token token = new TRPar(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 22:
-                        {
-                            Token token = new TLBrace(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 23:
-                        {
-                            Token token = new TRBrace(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 24:
-                        {
-                            Token token = new TPlus(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 25:
-                        {
-                            Token token = new TMinus(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 26:
-                        {
-                            Token token = new TQMark(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 27:
-                        {
-                            Token token = new TStar(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 28:
-                        {
-                            Token token = new TBar(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 29:
-                        {
-                            Token token = new TComma(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 30:
-                        {
-                            Token token = new TSlash(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 31:
-                        {
-                            Token token = new TArrow(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 32:
-                        {
-                            Token token = new TColon(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 33:
-                        {
-                            Token token = new TId(getText(acceptLength), startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 34:
-                        {
-                            Token token = new TChar(getText(acceptLength), startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 35:
-                        {
-                            Token token = new TDecChar(getText(acceptLength), startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 36:
-                        {
-                            Token token = new THexChar(getText(acceptLength), startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 37:
-                        {
-                            Token token = new TString(getText(acceptLength), startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
-                        }
-                        case 38:
+
+                        return new EOF(startLine + 1, startPos + 1);
+
+                    case 0:
+                        tok = new TPkgId(getText(acceptLength), startLine + 1, startPos + 1);
+                        break;
+
+                    case 1:
+                        tok = new TPackage(startLine + 1, startPos + 1);
+                        switch(state.ordinal())
                         {
-                            Token token = new TBlank(getText(acceptLength), startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
+                            case 0: state = State.PACKAGE; break;
                         }
-                        case 39:
+                        break;
+
+                    case 2:
+                        tok = new TStates(startLine + 1, startPos + 1);
+                        break;
+
+                    case 3:
+                        tok = new THelpers(startLine + 1, startPos + 1);
+                        break;
+
+                    case 4:
+                        tok = new TTokens(startLine + 1, startPos + 1);
+                        break;
+
+                    case 5:
+                        tok = new TIgnored(startLine + 1, startPos + 1);
+                        break;
+
+                    case 6:
+                        tok = new TProductions(startLine + 1, startPos + 1);
+                        break;
+
+                    case 7:
+                        tok = new TAbstract(startLine + 1, startPos + 1);
+                        break;
+
+                    case 8:
+                        tok = new TSyntax(startLine + 1, startPos + 1);
+                        break;
+
+                    case 9:
+                        tok = new TTree(startLine + 1, startPos + 1);
+                        break;
+
+                    case 10:
+                        tok = new TNew(startLine + 1, startPos + 1);
+                        break;
+
+                    case 11:
+                        tok = new TNull(startLine + 1, startPos + 1);
+                        break;
+
+                    case 12:
+                        tok = new TTokenSpecifier(startLine + 1, startPos + 1);
+                        break;
+
+                    case 13:
+                        tok = new TProductionSpecifier(startLine + 1, startPos + 1);
+                        break;
+
+                    case 14:
+                        tok = new TDot(startLine + 1, startPos + 1);
+                        break;
+
+                    case 15:
+                        tok = new TDDot(startLine + 1, startPos + 1);
+                        break;
+
+                    case 16:
+                        tok = new TSemicolon(startLine + 1, startPos + 1);
+                        switch(state.ordinal())
                         {
-                            Token token = new TComment(getText(acceptLength), startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
-                            return token;
+                            case 1: state = State.NORMAL; break;
                         }
-                    }
-                }
-                else
-                {
-                    if(this.text.length() > 0)
-                    {
-                        throw new LexerException("[" + (startLine + 1) + "," + (startPos + 1) + "] Unknown token: " + this.text);
-                    }
+                        break;
+
+                    case 17:
+                        tok = new TEqual(startLine + 1, startPos + 1);
+                        break;
 
-                    EOF token = new EOF(startLine + 1, startPos + 1);
-                    return token;
+                    case 18:
+                        tok = new TLBkt(startLine + 1, startPos + 1);
+                        break;
+
+                    case 19:
+                        tok = new TRBkt(startLine + 1, startPos + 1);
+                        break;
+
+                    case 20:
+                        tok = new TLPar(startLine + 1, startPos + 1);
+                        break;
+
+                    case 21:
+                        tok = new TRPar(startLine + 1, startPos + 1);
+                        break;
+
+                    case 22:
+                        tok = new TLBrace(startLine + 1, startPos + 1);
+                        break;
+
+                    case 23:
+                        tok = new TRBrace(startLine + 1, startPos + 1);
+                        break;
+
+                    case 24:
+                        tok = new TPlus(startLine + 1, startPos + 1);
+                        break;
+
+                    case 25:
+                        tok = new TMinus(startLine + 1, startPos + 1);
+                        break;
+
+                    case 26:
+                        tok = new TQMark(startLine + 1, startPos + 1);
+                        break;
+
+                    case 27:
+                        tok = new TStar(startLine + 1, startPos + 1);
+                        break;
+
+                    case 28:
+                        tok = new TBar(startLine + 1, startPos + 1);
+                        break;
+
+                    case 29:
+                        tok = new TComma(startLine + 1, startPos + 1);
+                        break;
+
+                    case 30:
+                        tok = new TSlash(startLine + 1, startPos + 1);
+                        break;
+
+                    case 31:
+                        tok = new TArrow(startLine + 1, startPos + 1);
+                        break;
+
+                    case 32:
+                        tok = new TColon(startLine + 1, startPos + 1);
+                        break;
+
+                    case 33:
+                        tok = new TId(getText(acceptLength), startLine + 1, startPos + 1);
+                        break;
+
+                    case 34:
+                        tok = new TChar(getText(acceptLength), startLine + 1, startPos + 1);
+                        break;
+
+                    case 35:
+                        tok = new TDecChar(getText(acceptLength), startLine + 1, startPos + 1);
+                        break;
+
+                    case 36:
+                        tok = new THexChar(getText(acceptLength), startLine + 1, startPos + 1);
+                        break;
+
+                    case 37:
+                        tok = new TString(getText(acceptLength), startLine + 1, startPos + 1);
+                        break;
+
+                    case 38:
+                        tok = new TBlank(getText(acceptLength), startLine + 1, startPos + 1);
+                        break;
+
+                    case 39:
+                        tok = new TComment(getText(acceptLength), startLine + 1, startPos + 1);
+                        break;
+
+                    default:
+                        throw new LexerException("[" + (startLine + 1) + "," + (startPos + 1) + "] Internal lexer error: invalid accept table entry " + acceptToken + ", current text: " + this.text);
                 }
+                pushBack(acceptLength);
+                this.pos = acceptPos;
+                this.line = acceptLine;
+                this.cr = acceptCr;
+                return tok;
             }
         }
     }
@@ -594,25 +390,36 @@ public class Lexer
     }
 
     /**
-     * @deprecated This method doesn't restore line/column info correctly in some cases
-     *     (if a token begins in the middle of a CRLF newline pair).
-     *     There is no planned replacement.
+     * <p>
+     * Push the given token's text back onto the input.
+     * Note that the lexer state is <i>not</i> restored,
+     * so a following {@link #next()}/{@link #peek()} call may result in a different token.
+     * </p>
+     * <p>
+     * <b>Note:</b>
+     * If the token text contains newlines,
+     * the caller must ensure that CR+LF pairs are unread in their entirety.
+     * If only one half of a CR+LF pair is unread,
+     * the line numbers will be incorrect when it is lexed again.
+     * </p>
+     *
+     * @param tok the token to push back onto the input
+     * @throws IOException when thrown by {@link PushbackReader#unread(int)}
      */
-    @Deprecated
-    protected void unread(Token token) throws IOException
+    protected void unread(Token tok) throws IOException
     {
-        String text = token.getText();
-        int length = text.length();
+        String tokenText = tok.getText();
+        int length = tokenText.length();
 
         for(int i = length - 1; i >= 0; i--)
         {
             this.eof = false;
 
-            this.in.unread(text.charAt(i));
+            this.in.unread(tokenText.charAt(i));
         }
 
-        this.pos = token.getPos() - 1;
-        this.line = token.getLine() - 1;
+        this.pos = tok.getPos() - 1;
+        this.line = tok.getLine() - 1;
     }
 
     private String getText(int acceptLength)
@@ -620,7 +427,7 @@ public class Lexer
         return this.text.substring(0, acceptLength);
     }
 
-    private static int[][][][] gotoTable;
+    private static final int[][][][] gotoTable;
 /*  {
         { // NORMAL
             {{9, 9, 1}, {10, 10, 2}, {13, 13, 3}, {32, 32, 4}, {39, 39, 5}, {40, 40, 6}, {41, 41, 7}, {42, 42, 8}, {43, 43, 9}, {44, 44, 10}, {45, 45, 11}, {46, 46, 12}, {47, 47, 13}, {48, 48, 14}, {49, 57, 15}, {58, 58, 16}, {59, 59, 17}, {61, 61, 18}, {63, 63, 19}, {65, 65, 20}, {72, 72, 21}, {73, 73, 22}, {78, 78, 23}, {80, 80, 24}, {83, 83, 25}, {84, 84, 26}, {91, 91, 27}, {93, 93, 28}, {97, 122, 29}, {123, 123, 30}, {124, 124, 31}, {125, 125, 32}, },
@@ -872,7 +679,7 @@ public class Lexer
         }
     };*/
 
-    private static int[][] accept;
+    private static final int[][] accept;
 /*  {
         // NORMAL
         {-1, 38, 38, 38, 38, -1, 20, 21, 27, 24, 29, 25, 14, 30, 35, 35, 32, 16, 17, 26, -1, -1, -1, -1, 13, -1, 12, 18, 19, 33, 22, 28, 23, 38, -1, -1, 31, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 33, -1, 34, 34, -1, -1, -1, 39, 39, 36, -1, -1, -1, 10, -1, -1, -1, -1, -1, -1, -1, 33, 37, -1, 39, 39, -1, -1, -1, 11, -1, -1, -1, -1, -1, 9, 33, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 4, -1, 3, 5, 1, -1, 7, -1, -1, -1, 6, },
@@ -905,17 +712,17 @@ public class Lexer
             DataInputStream s = new DataInputStream(new BufferedInputStream(resStream));
 
             // read gotoTable
-            int length = s.readInt();
-            gotoTable = new int[length][][][];
-            for(int i = 0; i < gotoTable.length; i++)
+            int gotoTableLength1 = s.readInt();
+            gotoTable = new int[gotoTableLength1][][][];
+            for(int i = 0; i < gotoTableLength1; i++)
             {
-                length = s.readInt();
-                gotoTable[i] = new int[length][][];
-                for(int j = 0; j < gotoTable[i].length; j++)
+                int gotoTableLength2 = s.readInt();
+                gotoTable[i] = new int[gotoTableLength2][][];
+                for(int j = 0; j < gotoTableLength2; j++)
                 {
-                    length = s.readInt();
-                    gotoTable[i][j] = new int[length][3];
-                    for(int k = 0; k < gotoTable[i][j].length; k++)
+                    int gotoTableLength3 = s.readInt();
+                    gotoTable[i][j] = new int[gotoTableLength3][3];
+                    for(int k = 0; k < gotoTableLength3; k++)
                     {
                         for(int l = 0; l < 3; l++)
                         {
@@ -926,13 +733,13 @@ public class Lexer
             }
 
             // read accept
-            length = s.readInt();
-            accept = new int[length][];
-            for(int i = 0; i < accept.length; i++)
+            int acceptLength1 = s.readInt();
+            accept = new int[acceptLength1][];
+            for(int i = 0; i < acceptLength1; i++)
             {
-                length = s.readInt();
-                accept[i] = new int[length];
-                for(int j = 0; j < accept[i].length; j++)
+                int acceptLength2 = s.readInt();
+                accept[i] = new int[acceptLength2];
+                for(int j = 0; j < acceptLength2; j++)
                 {
                     accept[i][j] = s.readInt();
                 }
diff --git a/src/main/java/org/sablecc/sablecc/node/AAlt.java b/src/main/java/org/sablecc/sablecc/node/AAlt.java
index 868516db660840f4961534721cdb6c667a06f292..85c748f4757b8bb019f1d1d2c3b2907eef751504 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAlt.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAlt.java
@@ -31,18 +31,15 @@ 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(this);
+        AAlt cloned = new AAlt();
+        cloned.setAltName(cloneNode(this._altName_));
+        cloned.setElems(cloneList(this._elems_));
+        cloned.setAltTransform(cloneNode(this._altTransform_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AAltTransform.java b/src/main/java/org/sablecc/sablecc/node/AAltTransform.java
index 7a3711c2763428503b8dfce8a405def437f3d12a..d6e9126e496e6d334c4731bfa72a521958f1b4e5 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAltTransform.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAltTransform.java
@@ -31,18 +31,15 @@ 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(this);
+        AAltTransform cloned = new AAltTransform();
+        cloned.setLBrace(cloneNode(this._lBrace_));
+        cloned.setTerms(cloneList(this._terms_));
+        cloned.setRBrace(cloneNode(this._rBrace_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AAst.java b/src/main/java/org/sablecc/sablecc/node/AAst.java
index a0c94e04769204e21d4711f807a0ee2dec0a3232..b373a774e504f553b589e5d1252694bb55f102a3 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAst.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAst.java
@@ -23,16 +23,13 @@ public final class AAst extends PAst
 
     }
 
-    public AAst(AAst node)
-    {
-        super(node);
-        setProds(cloneList(node._prods_));
-    }
-
     @Override
     public AAst clone()
     {
-        return new AAst(this);
+        AAst cloned = new AAst();
+        cloned.setProds(cloneList(this._prods_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AAstAlt.java b/src/main/java/org/sablecc/sablecc/node/AAstAlt.java
index e08e5cf0de0682419983a2b1d1202cf7e6e621f4..1e7afed33ebc774d24b64ac79890c4a4b989b361 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAstAlt.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAstAlt.java
@@ -27,17 +27,14 @@ 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(this);
+        AAstAlt cloned = new AAstAlt();
+        cloned.setAltName(cloneNode(this._altName_));
+        cloned.setElems(cloneList(this._elems_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AAstProd.java b/src/main/java/org/sablecc/sablecc/node/AAstProd.java
index aaa856ecbdbe2f9eddd099795e7fe325e8ab6bb5..5c15b3dc7c8e0bf9c030e07b69a5637c5143def0 100644
--- a/src/main/java/org/sablecc/sablecc/node/AAstProd.java
+++ b/src/main/java/org/sablecc/sablecc/node/AAstProd.java
@@ -27,17 +27,14 @@ 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(this);
+        AAstProd cloned = new AAstProd();
+        cloned.setId(cloneNode(this._id_));
+        cloned.setAlts(cloneList(this._alts_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ACharBasic.java b/src/main/java/org/sablecc/sablecc/node/ACharBasic.java
index 925d9381efda3224f099ffe40c66b535d3286644..30775a7f065a9c0123633b4976f3673c28f5a16a 100644
--- a/src/main/java/org/sablecc/sablecc/node/ACharBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/ACharBasic.java
@@ -19,16 +19,13 @@ public final class ACharBasic extends PBasic
 
     }
 
-    public ACharBasic(ACharBasic node)
-    {
-        super(node);
-        setChar(cloneNode(node._char_));
-    }
-
     @Override
     public ACharBasic clone()
     {
-        return new ACharBasic(this);
+        ACharBasic cloned = new ACharBasic();
+        cloned.setChar(cloneNode(this._char_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ACharChar.java b/src/main/java/org/sablecc/sablecc/node/ACharChar.java
index 188050b861aa28e9180c78888efb583dd8620c6a..e8c8e61021fb918428bb83d2272cce6171cb65aa 100644
--- a/src/main/java/org/sablecc/sablecc/node/ACharChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/ACharChar.java
@@ -19,16 +19,13 @@ public final class ACharChar extends PChar
 
     }
 
-    public ACharChar(ACharChar node)
-    {
-        super(node);
-        setChar(cloneNode(node._char_));
-    }
-
     @Override
     public ACharChar clone()
     {
-        return new ACharChar(this);
+        ACharChar cloned = new ACharChar();
+        cloned.setChar(cloneNode(this._char_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AConcat.java b/src/main/java/org/sablecc/sablecc/node/AConcat.java
index 1ade31e73081c3137f1b76b7c769fe4231b486df..c83c0f7fa13db2ed89154dfc65527c59dc3c06d8 100644
--- a/src/main/java/org/sablecc/sablecc/node/AConcat.java
+++ b/src/main/java/org/sablecc/sablecc/node/AConcat.java
@@ -23,16 +23,13 @@ public final class AConcat extends PConcat
 
     }
 
-    public AConcat(AConcat node)
-    {
-        super(node);
-        setUnExps(cloneList(node._unExps_));
-    }
-
     @Override
     public AConcat clone()
     {
-        return new AConcat(this);
+        AConcat cloned = new AConcat();
+        cloned.setUnExps(cloneList(this._unExps_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ADecChar.java b/src/main/java/org/sablecc/sablecc/node/ADecChar.java
index e2743bd85b4f1ceefe1ee8fc7bca2c2d9b0e7c20..41091bfc36e955f59e5e17889dac37b22bb367a5 100644
--- a/src/main/java/org/sablecc/sablecc/node/ADecChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/ADecChar.java
@@ -19,16 +19,13 @@ public final class ADecChar extends PChar
 
     }
 
-    public ADecChar(ADecChar node)
-    {
-        super(node);
-        setDecChar(cloneNode(node._decChar_));
-    }
-
     @Override
     public ADecChar clone()
     {
-        return new ADecChar(this);
+        ADecChar cloned = new ADecChar();
+        cloned.setDecChar(cloneNode(this._decChar_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AElem.java b/src/main/java/org/sablecc/sablecc/node/AElem.java
index ef1d47c784b0c8cc31c97a9436b07f4451cf766e..5f9963f2a17f13c679528d12fbdcab5f08006736 100644
--- a/src/main/java/org/sablecc/sablecc/node/AElem.java
+++ b/src/main/java/org/sablecc/sablecc/node/AElem.java
@@ -31,19 +31,16 @@ 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(this);
+        AElem cloned = new AElem();
+        cloned.setElemName(cloneNode(this._elemName_));
+        cloned.setSpecifier(cloneNode(this._specifier_));
+        cloned.setId(cloneNode(this._id_));
+        cloned.setUnOp(cloneNode(this._unOp_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AGrammar.java b/src/main/java/org/sablecc/sablecc/node/AGrammar.java
index 6a2cd2adaf77c3f47e0aec2b6c1c2518d4d8ca60..07f40c987c091878d667bfff08d87a36b3fae56e 100644
--- a/src/main/java/org/sablecc/sablecc/node/AGrammar.java
+++ b/src/main/java/org/sablecc/sablecc/node/AGrammar.java
@@ -47,22 +47,19 @@ 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(this);
+        AGrammar cloned = new AGrammar();
+        cloned.setPackage(cloneList(this._package_));
+        cloned.setHelpers(cloneNode(this._helpers_));
+        cloned.setStates(cloneNode(this._states_));
+        cloned.setTokens(cloneNode(this._tokens_));
+        cloned.setIgnTokens(cloneNode(this._ignTokens_));
+        cloned.setProductions(cloneNode(this._productions_));
+        cloned.setAst(cloneNode(this._ast_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AHelperDef.java b/src/main/java/org/sablecc/sablecc/node/AHelperDef.java
index f19e5c7c146583b3dcd1c9cfe59e7e40f515f1b0..0cea09619ba2523287b7c6d0a331117515d9512d 100644
--- a/src/main/java/org/sablecc/sablecc/node/AHelperDef.java
+++ b/src/main/java/org/sablecc/sablecc/node/AHelperDef.java
@@ -23,17 +23,14 @@ 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(this);
+        AHelperDef cloned = new AHelperDef();
+        cloned.setId(cloneNode(this._id_));
+        cloned.setRegExp(cloneNode(this._regExp_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AHelpers.java b/src/main/java/org/sablecc/sablecc/node/AHelpers.java
index 772d6b8b20974d2082367109c1e41c6cb6b053e8..1cae38c307162b358e0d0a4ddbeb49041eccb636 100644
--- a/src/main/java/org/sablecc/sablecc/node/AHelpers.java
+++ b/src/main/java/org/sablecc/sablecc/node/AHelpers.java
@@ -23,16 +23,13 @@ public final class AHelpers extends PHelpers
 
     }
 
-    public AHelpers(AHelpers node)
-    {
-        super(node);
-        setHelperDefs(cloneList(node._helperDefs_));
-    }
-
     @Override
     public AHelpers clone()
     {
-        return new AHelpers(this);
+        AHelpers cloned = new AHelpers();
+        cloned.setHelperDefs(cloneList(this._helperDefs_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AHexChar.java b/src/main/java/org/sablecc/sablecc/node/AHexChar.java
index bde57e7bac6547a1b218db75d8d0cd8034554bed..9bba9d50dfeaca9c4e6bafcb920998fba27d9e76 100644
--- a/src/main/java/org/sablecc/sablecc/node/AHexChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/AHexChar.java
@@ -19,16 +19,13 @@ public final class AHexChar extends PChar
 
     }
 
-    public AHexChar(AHexChar node)
-    {
-        super(node);
-        setHexChar(cloneNode(node._hexChar_));
-    }
-
     @Override
     public AHexChar clone()
     {
-        return new AHexChar(this);
+        AHexChar cloned = new AHexChar();
+        cloned.setHexChar(cloneNode(this._hexChar_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AIdBasic.java b/src/main/java/org/sablecc/sablecc/node/AIdBasic.java
index 565e3200c6c0635c84a4f9db311fcede0765385a..7c394248f4fe07b2d0ebdb5fa8e6ba31f1f99db5 100644
--- a/src/main/java/org/sablecc/sablecc/node/AIdBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/AIdBasic.java
@@ -19,16 +19,13 @@ public final class AIdBasic extends PBasic
 
     }
 
-    public AIdBasic(AIdBasic node)
-    {
-        super(node);
-        setId(cloneNode(node._id_));
-    }
-
     @Override
     public AIdBasic clone()
     {
-        return new AIdBasic(this);
+        AIdBasic cloned = new AIdBasic();
+        cloned.setId(cloneNode(this._id_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AIgnTokens.java b/src/main/java/org/sablecc/sablecc/node/AIgnTokens.java
index 5290ee25abbc2384b93ae9462882821d7e17cd95..cd72f335b7b17e4a8536646dda1be03d9e65dee6 100644
--- a/src/main/java/org/sablecc/sablecc/node/AIgnTokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/AIgnTokens.java
@@ -23,16 +23,13 @@ public final class AIgnTokens extends PIgnTokens
 
     }
 
-    public AIgnTokens(AIgnTokens node)
-    {
-        super(node);
-        setListId(cloneList(node._listId_));
-    }
-
     @Override
     public AIgnTokens clone()
     {
-        return new AIgnTokens(this);
+        AIgnTokens cloned = new AIgnTokens();
+        cloned.setListId(cloneList(this._listId_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AIntervalSet.java b/src/main/java/org/sablecc/sablecc/node/AIntervalSet.java
index 9bff5aa293c556c43530f33f6cfcc8ce5a5f2706..2095404f049ae3485705cc1472e81fd95b586da4 100644
--- a/src/main/java/org/sablecc/sablecc/node/AIntervalSet.java
+++ b/src/main/java/org/sablecc/sablecc/node/AIntervalSet.java
@@ -23,17 +23,14 @@ 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(this);
+        AIntervalSet cloned = new AIntervalSet();
+        cloned.setLeft(cloneNode(this._left_));
+        cloned.setRight(cloneNode(this._right_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AListTerm.java b/src/main/java/org/sablecc/sablecc/node/AListTerm.java
index bfa2c59eb2bfbbe787c45463af461eb5cfa610e3..737a840ca1537602ed856b4f1733d44a21152a24 100644
--- a/src/main/java/org/sablecc/sablecc/node/AListTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/AListTerm.java
@@ -27,17 +27,14 @@ 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(this);
+        AListTerm cloned = new AListTerm();
+        cloned.setLBkt(cloneNode(this._lBkt_));
+        cloned.setListTerms(cloneList(this._listTerms_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AMinusBinOp.java b/src/main/java/org/sablecc/sablecc/node/AMinusBinOp.java
index fd1e1e56a1d82345c9369931217712c53fa28e7a..38822d8b677d2b2371b4fa87b990374ddf25e97d 100644
--- a/src/main/java/org/sablecc/sablecc/node/AMinusBinOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/AMinusBinOp.java
@@ -11,15 +11,12 @@ public final class AMinusBinOp extends PBinOp
     {
     }
 
-    public AMinusBinOp(AMinusBinOp node)
-    {
-        super(node);
-    }
-
     @Override
     public AMinusBinOp clone()
     {
-        return new AMinusBinOp(this);
+        AMinusBinOp cloned = new AMinusBinOp();
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ANewListTerm.java b/src/main/java/org/sablecc/sablecc/node/ANewListTerm.java
index b2c151bba0d1456c1839bf556146b852fb8f9db0..c630b91eb443be133da5e9ca6499622d3461aaaa 100644
--- a/src/main/java/org/sablecc/sablecc/node/ANewListTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ANewListTerm.java
@@ -31,18 +31,15 @@ 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(this);
+        ANewListTerm cloned = new ANewListTerm();
+        cloned.setProdName(cloneNode(this._prodName_));
+        cloned.setLPar(cloneNode(this._lPar_));
+        cloned.setParams(cloneList(this._params_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ANewTerm.java b/src/main/java/org/sablecc/sablecc/node/ANewTerm.java
index 4fb329bde1657a4b8a9dcc365ea68561c8049c1c..0c63475d9f9927768aafa2234baed8adc54a5eb8 100644
--- a/src/main/java/org/sablecc/sablecc/node/ANewTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ANewTerm.java
@@ -31,18 +31,15 @@ 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(this);
+        ANewTerm cloned = new ANewTerm();
+        cloned.setProdName(cloneNode(this._prodName_));
+        cloned.setLPar(cloneNode(this._lPar_));
+        cloned.setParams(cloneList(this._params_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ANullTerm.java b/src/main/java/org/sablecc/sablecc/node/ANullTerm.java
index e5846fc1a9468177ecffc92d822f42b4f79f8ac0..a8fc22ebe6fe6a922603c06e57c09ff8f573b539 100644
--- a/src/main/java/org/sablecc/sablecc/node/ANullTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ANullTerm.java
@@ -11,15 +11,12 @@ public final class ANullTerm extends PTerm
     {
     }
 
-    public ANullTerm(ANullTerm node)
-    {
-        super(node);
-    }
-
     @Override
     public ANullTerm clone()
     {
-        return new ANullTerm(this);
+        ANullTerm cloned = new ANullTerm();
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AOperationSet.java b/src/main/java/org/sablecc/sablecc/node/AOperationSet.java
index fc8b1c38ab58ee68996bd669753c5c3d52f1b00e..5ea786bc32f4d7cf639c013d3e56be9c9dcb6164 100644
--- a/src/main/java/org/sablecc/sablecc/node/AOperationSet.java
+++ b/src/main/java/org/sablecc/sablecc/node/AOperationSet.java
@@ -27,18 +27,15 @@ 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(this);
+        AOperationSet cloned = new AOperationSet();
+        cloned.setLeft(cloneNode(this._left_));
+        cloned.setBinOp(cloneNode(this._binOp_));
+        cloned.setRight(cloneNode(this._right_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/APlusBinOp.java b/src/main/java/org/sablecc/sablecc/node/APlusBinOp.java
index e7ac89e687070163a6398d5ccb52d2c318cf2a97..cfcb1896c580475f0e395fbc0987c2632924bdce 100644
--- a/src/main/java/org/sablecc/sablecc/node/APlusBinOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/APlusBinOp.java
@@ -11,15 +11,12 @@ public final class APlusBinOp extends PBinOp
     {
     }
 
-    public APlusBinOp(APlusBinOp node)
-    {
-        super(node);
-    }
-
     @Override
     public APlusBinOp clone()
     {
-        return new APlusBinOp(this);
+        APlusBinOp cloned = new APlusBinOp();
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/APlusUnOp.java b/src/main/java/org/sablecc/sablecc/node/APlusUnOp.java
index 06e6fa7f89f0f0f5e0e463cbcf8d43c62a1d3e28..c766c024844e316a051c8e3e7291c1c32ce138e7 100644
--- a/src/main/java/org/sablecc/sablecc/node/APlusUnOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/APlusUnOp.java
@@ -19,16 +19,13 @@ public final class APlusUnOp extends PUnOp
 
     }
 
-    public APlusUnOp(APlusUnOp node)
-    {
-        super(node);
-        setPlus(cloneNode(node._plus_));
-    }
-
     @Override
     public APlusUnOp clone()
     {
-        return new APlusUnOp(this);
+        APlusUnOp cloned = new APlusUnOp();
+        cloned.setPlus(cloneNode(this._plus_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AProd.java b/src/main/java/org/sablecc/sablecc/node/AProd.java
index cd2f5039ba8ba6f5122d25bc152b4af7ab7a4d44..ca5a37d268273779e72a09ddb165bb028dd6db63 100644
--- a/src/main/java/org/sablecc/sablecc/node/AProd.java
+++ b/src/main/java/org/sablecc/sablecc/node/AProd.java
@@ -35,19 +35,16 @@ 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(this);
+        AProd cloned = new AProd();
+        cloned.setId(cloneNode(this._id_));
+        cloned.setArrow(cloneNode(this._arrow_));
+        cloned.setProdTransform(cloneList(this._prodTransform_));
+        cloned.setAlts(cloneList(this._alts_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AProdName.java b/src/main/java/org/sablecc/sablecc/node/AProdName.java
index a11a3803e86b1b8d6894da74c0163dd092f452f3..8e4681837fdb1cc953d5f77b3c14538212fde9bd 100644
--- a/src/main/java/org/sablecc/sablecc/node/AProdName.java
+++ b/src/main/java/org/sablecc/sablecc/node/AProdName.java
@@ -23,17 +23,14 @@ 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(this);
+        AProdName cloned = new AProdName();
+        cloned.setId(cloneNode(this._id_));
+        cloned.setProdNameTail(cloneNode(this._prodNameTail_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AProductionSpecifier.java b/src/main/java/org/sablecc/sablecc/node/AProductionSpecifier.java
index cd822a61eb245bbb9cfa679aba3ef760477fd790..74304a394f4a62023eecf90b515c7546933017b7 100644
--- a/src/main/java/org/sablecc/sablecc/node/AProductionSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/AProductionSpecifier.java
@@ -11,15 +11,12 @@ public final class AProductionSpecifier extends PSpecifier
     {
     }
 
-    public AProductionSpecifier(AProductionSpecifier node)
-    {
-        super(node);
-    }
-
     @Override
     public AProductionSpecifier clone()
     {
-        return new AProductionSpecifier(this);
+        AProductionSpecifier cloned = new AProductionSpecifier();
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AProductions.java b/src/main/java/org/sablecc/sablecc/node/AProductions.java
index 4e73e965ea600e0f15e424066ea88f1eb4df0f90..569464abf6dfc6b3b44aa9802c64dc948a9bd2fe 100644
--- a/src/main/java/org/sablecc/sablecc/node/AProductions.java
+++ b/src/main/java/org/sablecc/sablecc/node/AProductions.java
@@ -23,16 +23,13 @@ public final class AProductions extends PProductions
 
     }
 
-    public AProductions(AProductions node)
-    {
-        super(node);
-        setProds(cloneList(node._prods_));
-    }
-
     @Override
     public AProductions clone()
     {
-        return new AProductions(this);
+        AProductions cloned = new AProductions();
+        cloned.setProds(cloneList(this._prods_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AQMarkUnOp.java b/src/main/java/org/sablecc/sablecc/node/AQMarkUnOp.java
index c78c19fc5b0468841366b32a02353e0b760ae2d5..ec754fc330de4e8722aa938e3fa568797d7d52e6 100644
--- a/src/main/java/org/sablecc/sablecc/node/AQMarkUnOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/AQMarkUnOp.java
@@ -19,16 +19,13 @@ public final class AQMarkUnOp extends PUnOp
 
     }
 
-    public AQMarkUnOp(AQMarkUnOp node)
-    {
-        super(node);
-        setQMark(cloneNode(node._qMark_));
-    }
-
     @Override
     public AQMarkUnOp clone()
     {
-        return new AQMarkUnOp(this);
+        AQMarkUnOp cloned = new AQMarkUnOp();
+        cloned.setQMark(cloneNode(this._qMark_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ARegExp.java b/src/main/java/org/sablecc/sablecc/node/ARegExp.java
index 7b604e5ddbe31e34039e8310248785e8029b45f7..6ebe5769d7747c89a3fff36fc5067b588dcb73fb 100644
--- a/src/main/java/org/sablecc/sablecc/node/ARegExp.java
+++ b/src/main/java/org/sablecc/sablecc/node/ARegExp.java
@@ -23,16 +23,13 @@ public final class ARegExp extends PRegExp
 
     }
 
-    public ARegExp(ARegExp node)
-    {
-        super(node);
-        setConcats(cloneList(node._concats_));
-    }
-
     @Override
     public ARegExp clone()
     {
-        return new ARegExp(this);
+        ARegExp cloned = new ARegExp();
+        cloned.setConcats(cloneList(this._concats_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ARegExpBasic.java b/src/main/java/org/sablecc/sablecc/node/ARegExpBasic.java
index 4978f8948f4f2ae400ede54cfcc72541ed16599f..3f615ba4621568df38f651475dae0afafd6ec6e1 100644
--- a/src/main/java/org/sablecc/sablecc/node/ARegExpBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/ARegExpBasic.java
@@ -19,16 +19,13 @@ public final class ARegExpBasic extends PBasic
 
     }
 
-    public ARegExpBasic(ARegExpBasic node)
-    {
-        super(node);
-        setRegExp(cloneNode(node._regExp_));
-    }
-
     @Override
     public ARegExpBasic clone()
     {
-        return new ARegExpBasic(this);
+        ARegExpBasic cloned = new ARegExpBasic();
+        cloned.setRegExp(cloneNode(this._regExp_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ASetBasic.java b/src/main/java/org/sablecc/sablecc/node/ASetBasic.java
index 53a957cb18e2da018bf57bafe8c31a794bd3d1fe..b45847e9e15e5c887bd53584146fcb56cc476396 100644
--- a/src/main/java/org/sablecc/sablecc/node/ASetBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/ASetBasic.java
@@ -19,16 +19,13 @@ public final class ASetBasic extends PBasic
 
     }
 
-    public ASetBasic(ASetBasic node)
-    {
-        super(node);
-        setSet(cloneNode(node._set_));
-    }
-
     @Override
     public ASetBasic clone()
     {
-        return new ASetBasic(this);
+        ASetBasic cloned = new ASetBasic();
+        cloned.setSet(cloneNode(this._set_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ASimpleListTerm.java b/src/main/java/org/sablecc/sablecc/node/ASimpleListTerm.java
index de072dddfccca3cf48bde6b7263bcc14b740dfc7..b2e1b6426a3793a9e1f0dddb7a7406b3f2219e5e 100644
--- a/src/main/java/org/sablecc/sablecc/node/ASimpleListTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ASimpleListTerm.java
@@ -27,18 +27,15 @@ 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(this);
+        ASimpleListTerm cloned = new ASimpleListTerm();
+        cloned.setSpecifier(cloneNode(this._specifier_));
+        cloned.setId(cloneNode(this._id_));
+        cloned.setSimpleTermTail(cloneNode(this._simpleTermTail_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ASimpleTerm.java b/src/main/java/org/sablecc/sablecc/node/ASimpleTerm.java
index 801c48c2137f889c56e203d6c8dc86caa6734f45..54cfa95c6cb4f81f78cb1daefec90df46e76ef10 100644
--- a/src/main/java/org/sablecc/sablecc/node/ASimpleTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/ASimpleTerm.java
@@ -27,18 +27,15 @@ 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(this);
+        ASimpleTerm cloned = new ASimpleTerm();
+        cloned.setSpecifier(cloneNode(this._specifier_));
+        cloned.setId(cloneNode(this._id_));
+        cloned.setSimpleTermTail(cloneNode(this._simpleTermTail_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStarUnOp.java b/src/main/java/org/sablecc/sablecc/node/AStarUnOp.java
index 626ff012036ea7c35177c470a56d78b0536f5a18..429335d44413e4c4a87ecb3d47947a3c2dc2f33b 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStarUnOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStarUnOp.java
@@ -19,16 +19,13 @@ public final class AStarUnOp extends PUnOp
 
     }
 
-    public AStarUnOp(AStarUnOp node)
-    {
-        super(node);
-        setStar(cloneNode(node._star_));
-    }
-
     @Override
     public AStarUnOp clone()
     {
-        return new AStarUnOp(this);
+        AStarUnOp cloned = new AStarUnOp();
+        cloned.setStar(cloneNode(this._star_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStateList.java b/src/main/java/org/sablecc/sablecc/node/AStateList.java
index 706d3c7ddeaed996c9c69bd7a0351661519fb6f4..8ac649a07461ed89a81777c55dc4c3f8a32b5d93 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStateList.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStateList.java
@@ -31,18 +31,15 @@ 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(this);
+        AStateList cloned = new AStateList();
+        cloned.setId(cloneNode(this._id_));
+        cloned.setTransition(cloneNode(this._transition_));
+        cloned.setStateLists(cloneList(this._stateLists_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStateListTail.java b/src/main/java/org/sablecc/sablecc/node/AStateListTail.java
index 6f5222864c45d681ec832a2430f8519a444e86b8..d769f961dbdc6ef47e05da3fc4a5c6806e2c8697 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStateListTail.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStateListTail.java
@@ -23,17 +23,14 @@ 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(this);
+        AStateListTail cloned = new AStateListTail();
+        cloned.setId(cloneNode(this._id_));
+        cloned.setTransition(cloneNode(this._transition_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStates.java b/src/main/java/org/sablecc/sablecc/node/AStates.java
index a5bd2e06f6ce99e7f00f662fc8e062c53cfab678..634dbf6e397af84e77f585052cdcd4cb3e4fc8e2 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStates.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStates.java
@@ -23,16 +23,13 @@ public final class AStates extends PStates
 
     }
 
-    public AStates(AStates node)
-    {
-        super(node);
-        setListId(cloneList(node._listId_));
-    }
-
     @Override
     public AStates clone()
     {
-        return new AStates(this);
+        AStates cloned = new AStates();
+        cloned.setListId(cloneList(this._listId_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AStringBasic.java b/src/main/java/org/sablecc/sablecc/node/AStringBasic.java
index ff1dd0a0d49bd4a47c9417cb9c8e706e8e9b8bb3..5ea18ba0f098812720737786888a10ff4d0e370d 100644
--- a/src/main/java/org/sablecc/sablecc/node/AStringBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/AStringBasic.java
@@ -19,16 +19,13 @@ public final class AStringBasic extends PBasic
 
     }
 
-    public AStringBasic(AStringBasic node)
-    {
-        super(node);
-        setString(cloneNode(node._string_));
-    }
-
     @Override
     public AStringBasic clone()
     {
-        return new AStringBasic(this);
+        AStringBasic cloned = new AStringBasic();
+        cloned.setString(cloneNode(this._string_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ATokenDef.java b/src/main/java/org/sablecc/sablecc/node/ATokenDef.java
index b7af9703df8e7beb6eb767b1ffe14b14d41b0681..85868b13476ca8a5538e62c85d9dbce74b68540b 100644
--- a/src/main/java/org/sablecc/sablecc/node/ATokenDef.java
+++ b/src/main/java/org/sablecc/sablecc/node/ATokenDef.java
@@ -35,20 +35,17 @@ 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(this);
+        ATokenDef cloned = new ATokenDef();
+        cloned.setStateList(cloneNode(this._stateList_));
+        cloned.setId(cloneNode(this._id_));
+        cloned.setRegExp(cloneNode(this._regExp_));
+        cloned.setSlash(cloneNode(this._slash_));
+        cloned.setLookAhead(cloneNode(this._lookAhead_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ATokenSpecifier.java b/src/main/java/org/sablecc/sablecc/node/ATokenSpecifier.java
index b4223d8a7e03f741fb066afc2d5f9c209fb60c6d..13242e877e8967dbd85b5bf90deaa1be5f90c316 100644
--- a/src/main/java/org/sablecc/sablecc/node/ATokenSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/ATokenSpecifier.java
@@ -11,15 +11,12 @@ public final class ATokenSpecifier extends PSpecifier
     {
     }
 
-    public ATokenSpecifier(ATokenSpecifier node)
-    {
-        super(node);
-    }
-
     @Override
     public ATokenSpecifier clone()
     {
-        return new ATokenSpecifier(this);
+        ATokenSpecifier cloned = new ATokenSpecifier();
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ATokens.java b/src/main/java/org/sablecc/sablecc/node/ATokens.java
index d07b76d12cf03bb4245035872f64cf858325afc8..29e09905844a0b8b31211f37956b3d588936e5d9 100644
--- a/src/main/java/org/sablecc/sablecc/node/ATokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/ATokens.java
@@ -23,16 +23,13 @@ public final class ATokens extends PTokens
 
     }
 
-    public ATokens(ATokens node)
-    {
-        super(node);
-        setTokenDefs(cloneList(node._tokenDefs_));
-    }
-
     @Override
     public ATokens clone()
     {
-        return new ATokens(this);
+        ATokens cloned = new ATokens();
+        cloned.setTokenDefs(cloneList(this._tokenDefs_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/ATransition.java b/src/main/java/org/sablecc/sablecc/node/ATransition.java
index 0e5499fb16083f7fb555f486833e752fc9bf4d8e..e13d1cbd44c30a837ddbdb3c1918aed5d7e2b6bf 100644
--- a/src/main/java/org/sablecc/sablecc/node/ATransition.java
+++ b/src/main/java/org/sablecc/sablecc/node/ATransition.java
@@ -19,16 +19,13 @@ public final class ATransition extends PTransition
 
     }
 
-    public ATransition(ATransition node)
-    {
-        super(node);
-        setId(cloneNode(node._id_));
-    }
-
     @Override
     public ATransition clone()
     {
-        return new ATransition(this);
+        ATransition cloned = new ATransition();
+        cloned.setId(cloneNode(this._id_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/AUnExp.java b/src/main/java/org/sablecc/sablecc/node/AUnExp.java
index 6d7d40d738e775435094d94a6065bcae51b2aa65..2fcf0268ddbf597fd41f470dc30d90a20a171461 100644
--- a/src/main/java/org/sablecc/sablecc/node/AUnExp.java
+++ b/src/main/java/org/sablecc/sablecc/node/AUnExp.java
@@ -23,17 +23,14 @@ 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(this);
+        AUnExp cloned = new AUnExp();
+        cloned.setBasic(cloneNode(this._basic_));
+        cloned.setUnOp(cloneNode(this._unOp_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/EOF.java b/src/main/java/org/sablecc/sablecc/node/EOF.java
index 8d7e017e119d18af04ebeca9e6e6f910dcd7a282..7def3d3b7921c4ee689fd634a4cd043c3c2cb3e4 100644
--- a/src/main/java/org/sablecc/sablecc/node/EOF.java
+++ b/src/main/java/org/sablecc/sablecc/node/EOF.java
@@ -16,15 +16,12 @@ public final class EOF extends Token
         super("", line, pos);
     }
 
-    public EOF(EOF token)
-    {
-        super(token);
-    }
-
     @Override
     public EOF clone()
     {
-        return new EOF(this);
+        EOF cloned = new EOF(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/Node.java b/src/main/java/org/sablecc/sablecc/node/Node.java
index f37caa17aa10369ec626ddc9a28edc095347f5e2..625a97e1b9c16d16cfa072d767d4fd651a4fa26f 100644
--- a/src/main/java/org/sablecc/sablecc/node/Node.java
+++ b/src/main/java/org/sablecc/sablecc/node/Node.java
@@ -14,14 +14,8 @@ public abstract class Node extends PositionedNode implements Switchable, Cloneab
     protected Node()
     {}
 
-    protected 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;
-    }
-
+    // clone intentionally does not keep parent!
+    // The new copied node is not a child of the original parent anymore.
     @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 805ab230e329fd4693a7994ac3b49cd7e3f32695..335c44afacb91a9f85d25c1c6a22d126759d4c13 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAlt.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAlt.java
@@ -7,11 +7,6 @@ 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 f0eafa2ea20ba7bc6895e3f410c8c79566b18ac5..91fdd2ff024d0132d8856ddcc8d8eab87c355d52 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAltTransform.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAltTransform.java
@@ -7,11 +7,6 @@ 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 04d7430515d9fa82ccfb32cb04b3783329803d63..7d930110c5e879d86048bb7fe2bad88bdfae3b8e 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAst.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAst.java
@@ -7,11 +7,6 @@ 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 7fa3763890d2b5441d693633db0c2d3526a8b452..68d31598c945084493bedad7568b43040faa6465 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAstAlt.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAstAlt.java
@@ -7,11 +7,6 @@ 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 de12a50aa730b3d35c761e96a8a20b47a192de19..d472b417416ba6d542bd06612a773acd60b887ee 100644
--- a/src/main/java/org/sablecc/sablecc/node/PAstProd.java
+++ b/src/main/java/org/sablecc/sablecc/node/PAstProd.java
@@ -7,11 +7,6 @@ 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 2a3b4b9c02c9a6371c9a782958d8f2bd31fabd80..d2dce6ef952642bf8c18275125bb61e3adf840b0 100644
--- a/src/main/java/org/sablecc/sablecc/node/PBasic.java
+++ b/src/main/java/org/sablecc/sablecc/node/PBasic.java
@@ -7,11 +7,6 @@ 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 1d35acb71ff9a10a68dfa8bf74677218ba20bd86..4e0f60584b94ca30b0ee54265420e4ed6cfaf23b 100644
--- a/src/main/java/org/sablecc/sablecc/node/PBinOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/PBinOp.java
@@ -7,11 +7,6 @@ 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 1e1975cc9edebdde7462b3d85320c5e4b857a8f1..429049b23b87c0d313325b9e1abccaceebe830a3 100644
--- a/src/main/java/org/sablecc/sablecc/node/PChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/PChar.java
@@ -7,11 +7,6 @@ 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 7c9ef83e1a5faa05761ed20a792560264a01ea72..20dce0e6b3a8dedc385ffd865acae6e38d4727b2 100644
--- a/src/main/java/org/sablecc/sablecc/node/PConcat.java
+++ b/src/main/java/org/sablecc/sablecc/node/PConcat.java
@@ -7,11 +7,6 @@ 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 748f1bc5ec9b069d99b54db2d2a361af026991c5..b7ec72420bce7a324a1ccd07feea281c51d43835 100644
--- a/src/main/java/org/sablecc/sablecc/node/PElem.java
+++ b/src/main/java/org/sablecc/sablecc/node/PElem.java
@@ -7,11 +7,6 @@ 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 8501e4c0b95d2135664b18fb021ad9742313759e..aadfe6a6dd10c48823d15294ee04d10a1f64236e 100644
--- a/src/main/java/org/sablecc/sablecc/node/PGrammar.java
+++ b/src/main/java/org/sablecc/sablecc/node/PGrammar.java
@@ -7,11 +7,6 @@ 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 b9e501dc3ebc011a5faf44dd0934345c69fa6740..7a2a876ea1f7d6e3b547065e03d194d826b43449 100644
--- a/src/main/java/org/sablecc/sablecc/node/PHelperDef.java
+++ b/src/main/java/org/sablecc/sablecc/node/PHelperDef.java
@@ -7,11 +7,6 @@ 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 a1ddbf2b92fa1914726da310f944720600c43a22..bbff36bc1c3559d2ae9bb3f756c8ebfba3e45a16 100644
--- a/src/main/java/org/sablecc/sablecc/node/PHelpers.java
+++ b/src/main/java/org/sablecc/sablecc/node/PHelpers.java
@@ -7,11 +7,6 @@ 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 fb53108b47c422f028ac881a09990a31f790c53c..68cee2aa92ed7da9618a6f471ff3297e2e6ec16e 100644
--- a/src/main/java/org/sablecc/sablecc/node/PIgnTokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/PIgnTokens.java
@@ -7,11 +7,6 @@ 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 d8e7a48fc7537f0a1ca95dfc1a9eec33df44497b..5003121a98afea2aa37585c621f803d69638b38d 100644
--- a/src/main/java/org/sablecc/sablecc/node/PListTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/PListTerm.java
@@ -7,11 +7,6 @@ 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 2d9db40db2087d7b65bc2e48ba491854392625a8..74e3accd24b645260b2dfba3e96042aa058b59f6 100644
--- a/src/main/java/org/sablecc/sablecc/node/PProd.java
+++ b/src/main/java/org/sablecc/sablecc/node/PProd.java
@@ -7,11 +7,6 @@ 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 380e8da86d939305a4353354040908258a3175e7..04b99c52c94d6566e06c02784525d71cefbfe329 100644
--- a/src/main/java/org/sablecc/sablecc/node/PProdName.java
+++ b/src/main/java/org/sablecc/sablecc/node/PProdName.java
@@ -7,11 +7,6 @@ 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 98da82638503ce58f7d0a5dcab776c74d0f75a45..d908b9b0352032c364b530ee25c5e77f870d8005 100644
--- a/src/main/java/org/sablecc/sablecc/node/PProductions.java
+++ b/src/main/java/org/sablecc/sablecc/node/PProductions.java
@@ -7,11 +7,6 @@ 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 3ebc5a202aafbe5c3b3c9eeb7876811385bff89e..93ddece2d97a84b2d1f1cd8f6b19d7810b739821 100644
--- a/src/main/java/org/sablecc/sablecc/node/PRegExp.java
+++ b/src/main/java/org/sablecc/sablecc/node/PRegExp.java
@@ -7,11 +7,6 @@ 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 e9d659382aa480c0e48ba2bc7cecb37981d8a5f4..a4ca9c14a66e5b4469c6b88d42786a7729b21696 100644
--- a/src/main/java/org/sablecc/sablecc/node/PSet.java
+++ b/src/main/java/org/sablecc/sablecc/node/PSet.java
@@ -7,11 +7,6 @@ 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 39fc6267212ab15aa372725b0867cca14da46a45..ded4e7da3bfcffa9d05dddad0134a000c9dc3de8 100644
--- a/src/main/java/org/sablecc/sablecc/node/PSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/PSpecifier.java
@@ -7,11 +7,6 @@ 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 b8509d11053b69d32c20260b72b11cb4af5e9d2d..42a20d56da71d12c7dd7f5bf65d3445eff0879a8 100644
--- a/src/main/java/org/sablecc/sablecc/node/PStateList.java
+++ b/src/main/java/org/sablecc/sablecc/node/PStateList.java
@@ -7,11 +7,6 @@ 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 3968b1082c1f172e094d050aea9c395ceea9be7a..efe93dfa741c6349f4093a46554a7756511a76d6 100644
--- a/src/main/java/org/sablecc/sablecc/node/PStateListTail.java
+++ b/src/main/java/org/sablecc/sablecc/node/PStateListTail.java
@@ -7,11 +7,6 @@ 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 c0f22d478a1f94a32d4197f128defd220ab886fe..d0e1df0d189d06a5504d9b8785c58538efe5ad92 100644
--- a/src/main/java/org/sablecc/sablecc/node/PStates.java
+++ b/src/main/java/org/sablecc/sablecc/node/PStates.java
@@ -7,11 +7,6 @@ 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 e3e93730dcc61b39ac3fa36b010370dca07f8e4f..cef531ebece54066edc765544cd10a68eaca2e88 100644
--- a/src/main/java/org/sablecc/sablecc/node/PTerm.java
+++ b/src/main/java/org/sablecc/sablecc/node/PTerm.java
@@ -7,11 +7,6 @@ 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 783f7429f527e3eedcf317914e7b161f270ee6a2..b5d33a2875891d85c22f0b33af8617b359bb9a70 100644
--- a/src/main/java/org/sablecc/sablecc/node/PTokenDef.java
+++ b/src/main/java/org/sablecc/sablecc/node/PTokenDef.java
@@ -7,11 +7,6 @@ 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 d0b4af8c15e5b50afc3796e6d741b82361346bb3..bf5b1007e15bed318aeead1f49dcb7fab01d2b81 100644
--- a/src/main/java/org/sablecc/sablecc/node/PTokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/PTokens.java
@@ -7,11 +7,6 @@ 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 d8b166d4d497dbacadd8f8227dfb0788a3d1b68d..a03a228450fd9c0832ccbebfae46daeec446d082 100644
--- a/src/main/java/org/sablecc/sablecc/node/PTransition.java
+++ b/src/main/java/org/sablecc/sablecc/node/PTransition.java
@@ -7,11 +7,6 @@ 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 28f0cbadbcaa0433cdd6501c21abaeab6d660806..202c34923d65959d29d2c498596e4f0732169d4d 100644
--- a/src/main/java/org/sablecc/sablecc/node/PUnExp.java
+++ b/src/main/java/org/sablecc/sablecc/node/PUnExp.java
@@ -7,11 +7,6 @@ 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 fc09a3313178fcab10351741575164f30ca6bfe3..8df12aa95d50dd318c033a493cc1caa55486a54d 100644
--- a/src/main/java/org/sablecc/sablecc/node/PUnOp.java
+++ b/src/main/java/org/sablecc/sablecc/node/PUnOp.java
@@ -7,11 +7,6 @@ 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 751cb6f4ecd20d226a1d28f993d4b4846325ee64..a94f2e8a8b6e7a45b88077c3923a9411856f5ed8 100644
--- a/src/main/java/org/sablecc/sablecc/node/Start.java
+++ b/src/main/java/org/sablecc/sablecc/node/Start.java
@@ -20,17 +20,14 @@ 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(this);
+        Start cloned = new Start();
+        cloned.setPGrammar(cloneNode(this._pGrammar_));
+        cloned.setEOF(cloneNode(this._eof_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TAbstract.java b/src/main/java/org/sablecc/sablecc/node/TAbstract.java
index ba9a91097dae626ad254bf4d4e5d9b7f11885fa6..9eb16f496b73be1c2112d0ecde65cce6c5ee6708 100644
--- a/src/main/java/org/sablecc/sablecc/node/TAbstract.java
+++ b/src/main/java/org/sablecc/sablecc/node/TAbstract.java
@@ -16,15 +16,12 @@ public final class TAbstract extends Token
         super("Abstract", line, pos);
     }
 
-    public TAbstract(TAbstract token)
-    {
-        super(token);
-    }
-
     @Override
     public TAbstract clone()
     {
-        return new TAbstract(this);
+        TAbstract cloned = new TAbstract(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TArrow.java b/src/main/java/org/sablecc/sablecc/node/TArrow.java
index 9a2221108eff3e2ff7d6c4408d976f51f442fdb5..e57d2dd6b135339e5c1414ba5cf9b1a81ad535ec 100644
--- a/src/main/java/org/sablecc/sablecc/node/TArrow.java
+++ b/src/main/java/org/sablecc/sablecc/node/TArrow.java
@@ -16,15 +16,12 @@ public final class TArrow extends Token
         super("->", line, pos);
     }
 
-    public TArrow(TArrow token)
-    {
-        super(token);
-    }
-
     @Override
     public TArrow clone()
     {
-        return new TArrow(this);
+        TArrow cloned = new TArrow(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TBar.java b/src/main/java/org/sablecc/sablecc/node/TBar.java
index 36d967f0f6ad392ed88026d04571a2e369b8b088..a8a646b8010f150f66a951a296cdecfccc669060 100644
--- a/src/main/java/org/sablecc/sablecc/node/TBar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TBar.java
@@ -16,15 +16,12 @@ public final class TBar extends Token
         super("|", line, pos);
     }
 
-    public TBar(TBar token)
-    {
-        super(token);
-    }
-
     @Override
     public TBar clone()
     {
-        return new TBar(this);
+        TBar cloned = new TBar(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TBlank.java b/src/main/java/org/sablecc/sablecc/node/TBlank.java
index de51cb91f026c3706c08738e36dad023cca4f31c..c5d52b6e2605dd4fbf2e17cc551bbf048b3a7c89 100644
--- a/src/main/java/org/sablecc/sablecc/node/TBlank.java
+++ b/src/main/java/org/sablecc/sablecc/node/TBlank.java
@@ -16,15 +16,12 @@ public final class TBlank extends Token
         super(text, line, pos);
     }
 
-    public TBlank(TBlank token)
-    {
-        super(token);
-    }
-
     @Override
     public TBlank clone()
     {
-        return new TBlank(this);
+        TBlank cloned = new TBlank(this.getText(), this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TChar.java b/src/main/java/org/sablecc/sablecc/node/TChar.java
index aecb775ca04dbf1cb0fa709c0c80c37adbdd289e..1a7cef393bf415bf4fd60aaad4ec69eee7b5e81f 100644
--- a/src/main/java/org/sablecc/sablecc/node/TChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TChar.java
@@ -16,15 +16,12 @@ public final class TChar extends Token
         super(text, line, pos);
     }
 
-    public TChar(TChar token)
-    {
-        super(token);
-    }
-
     @Override
     public TChar clone()
     {
-        return new TChar(this);
+        TChar cloned = new TChar(this.getText(), this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TColon.java b/src/main/java/org/sablecc/sablecc/node/TColon.java
index 76e6ae69214ea2345d1683deb945ac071769d75f..34eb313cc71856ddeb66e141b1123924f9e01008 100644
--- a/src/main/java/org/sablecc/sablecc/node/TColon.java
+++ b/src/main/java/org/sablecc/sablecc/node/TColon.java
@@ -16,15 +16,12 @@ public final class TColon extends Token
         super(":", line, pos);
     }
 
-    public TColon(TColon token)
-    {
-        super(token);
-    }
-
     @Override
     public TColon clone()
     {
-        return new TColon(this);
+        TColon cloned = new TColon(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TComma.java b/src/main/java/org/sablecc/sablecc/node/TComma.java
index 485b422a4c9a088306c527ebaab3286e13c1a010..2f21c7deaf81ac39132a6b0b76b9776bb4995a9e 100644
--- a/src/main/java/org/sablecc/sablecc/node/TComma.java
+++ b/src/main/java/org/sablecc/sablecc/node/TComma.java
@@ -16,15 +16,12 @@ public final class TComma extends Token
         super(",", line, pos);
     }
 
-    public TComma(TComma token)
-    {
-        super(token);
-    }
-
     @Override
     public TComma clone()
     {
-        return new TComma(this);
+        TComma cloned = new TComma(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TComment.java b/src/main/java/org/sablecc/sablecc/node/TComment.java
index 9f9f1a52e64a25d5f27e6d676d6c53908a02f3eb..106474b5d9682aec5334d8464f74f1b822a7326e 100644
--- a/src/main/java/org/sablecc/sablecc/node/TComment.java
+++ b/src/main/java/org/sablecc/sablecc/node/TComment.java
@@ -16,15 +16,12 @@ public final class TComment extends Token
         super(text, line, pos);
     }
 
-    public TComment(TComment token)
-    {
-        super(token);
-    }
-
     @Override
     public TComment clone()
     {
-        return new TComment(this);
+        TComment cloned = new TComment(this.getText(), this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TDDot.java b/src/main/java/org/sablecc/sablecc/node/TDDot.java
index 0c2dd1f54cec3ca9429da62499093792f12fcec5..a3651ae666355bd895b42ec5aae0aa35d6f9907e 100644
--- a/src/main/java/org/sablecc/sablecc/node/TDDot.java
+++ b/src/main/java/org/sablecc/sablecc/node/TDDot.java
@@ -16,15 +16,12 @@ public final class TDDot extends Token
         super("..", line, pos);
     }
 
-    public TDDot(TDDot token)
-    {
-        super(token);
-    }
-
     @Override
     public TDDot clone()
     {
-        return new TDDot(this);
+        TDDot cloned = new TDDot(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TDecChar.java b/src/main/java/org/sablecc/sablecc/node/TDecChar.java
index 22104e3f91115ac6cb8f78933abdab1619c149dd..5e7204f20585ff8018dad961cccb4102a63c1094 100644
--- a/src/main/java/org/sablecc/sablecc/node/TDecChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TDecChar.java
@@ -16,15 +16,12 @@ public final class TDecChar extends Token
         super(text, line, pos);
     }
 
-    public TDecChar(TDecChar token)
-    {
-        super(token);
-    }
-
     @Override
     public TDecChar clone()
     {
-        return new TDecChar(this);
+        TDecChar cloned = new TDecChar(this.getText(), this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TDot.java b/src/main/java/org/sablecc/sablecc/node/TDot.java
index 394e43fad398c48a2557843d1629672b62febd73..fae4247bc794ea0a10ed0e728e0b3363ada8a34b 100644
--- a/src/main/java/org/sablecc/sablecc/node/TDot.java
+++ b/src/main/java/org/sablecc/sablecc/node/TDot.java
@@ -16,15 +16,12 @@ public final class TDot extends Token
         super(".", line, pos);
     }
 
-    public TDot(TDot token)
-    {
-        super(token);
-    }
-
     @Override
     public TDot clone()
     {
-        return new TDot(this);
+        TDot cloned = new TDot(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TEqual.java b/src/main/java/org/sablecc/sablecc/node/TEqual.java
index c5b4c7c7ebfacb1cfb3fe71b159263b20eb0ad58..ae88febdc0b362698448d20da1cab3c8a126fcad 100644
--- a/src/main/java/org/sablecc/sablecc/node/TEqual.java
+++ b/src/main/java/org/sablecc/sablecc/node/TEqual.java
@@ -16,15 +16,12 @@ public final class TEqual extends Token
         super("=", line, pos);
     }
 
-    public TEqual(TEqual token)
-    {
-        super(token);
-    }
-
     @Override
     public TEqual clone()
     {
-        return new TEqual(this);
+        TEqual cloned = new TEqual(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/THelpers.java b/src/main/java/org/sablecc/sablecc/node/THelpers.java
index 27b296643b6d1d6a265ce6c282a7eaf899f833e5..9f75a089a0a0d873551a9444d7096eb8692aae06 100644
--- a/src/main/java/org/sablecc/sablecc/node/THelpers.java
+++ b/src/main/java/org/sablecc/sablecc/node/THelpers.java
@@ -16,15 +16,12 @@ public final class THelpers extends Token
         super("Helpers", line, pos);
     }
 
-    public THelpers(THelpers token)
-    {
-        super(token);
-    }
-
     @Override
     public THelpers clone()
     {
-        return new THelpers(this);
+        THelpers cloned = new THelpers(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/THexChar.java b/src/main/java/org/sablecc/sablecc/node/THexChar.java
index 2b09dc0d88ab19560397df0b41dbfab78b8c5ccc..3f1273f41fd65646feb9e9602d7380e73c6b8e9b 100644
--- a/src/main/java/org/sablecc/sablecc/node/THexChar.java
+++ b/src/main/java/org/sablecc/sablecc/node/THexChar.java
@@ -16,15 +16,12 @@ public final class THexChar extends Token
         super(text, line, pos);
     }
 
-    public THexChar(THexChar token)
-    {
-        super(token);
-    }
-
     @Override
     public THexChar clone()
     {
-        return new THexChar(this);
+        THexChar cloned = new THexChar(this.getText(), this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TId.java b/src/main/java/org/sablecc/sablecc/node/TId.java
index 4323e68cb24f7454b0efae7c78019c850a5a2ea7..1919e4978152707e08d2cb93ba45578a5b7211e0 100644
--- a/src/main/java/org/sablecc/sablecc/node/TId.java
+++ b/src/main/java/org/sablecc/sablecc/node/TId.java
@@ -16,15 +16,12 @@ public final class TId extends Token
         super(text, line, pos);
     }
 
-    public TId(TId token)
-    {
-        super(token);
-    }
-
     @Override
     public TId clone()
     {
-        return new TId(this);
+        TId cloned = new TId(this.getText(), this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TIgnored.java b/src/main/java/org/sablecc/sablecc/node/TIgnored.java
index 3512dee9b0c0362c7c73071d6776b4aa7d20b318..17d14137992fa72c501c48dd8524abc4d523a051 100644
--- a/src/main/java/org/sablecc/sablecc/node/TIgnored.java
+++ b/src/main/java/org/sablecc/sablecc/node/TIgnored.java
@@ -16,15 +16,12 @@ public final class TIgnored extends Token
         super("Ignored", line, pos);
     }
 
-    public TIgnored(TIgnored token)
-    {
-        super(token);
-    }
-
     @Override
     public TIgnored clone()
     {
-        return new TIgnored(this);
+        TIgnored cloned = new TIgnored(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TLBkt.java b/src/main/java/org/sablecc/sablecc/node/TLBkt.java
index 8e5a83766b396eb6532f5fc8d0f6f8a0c97fb9b2..831576ba0ce398a9809a4fc9b2e6da40ebe26fde 100644
--- a/src/main/java/org/sablecc/sablecc/node/TLBkt.java
+++ b/src/main/java/org/sablecc/sablecc/node/TLBkt.java
@@ -16,15 +16,12 @@ public final class TLBkt extends Token
         super("[", line, pos);
     }
 
-    public TLBkt(TLBkt token)
-    {
-        super(token);
-    }
-
     @Override
     public TLBkt clone()
     {
-        return new TLBkt(this);
+        TLBkt cloned = new TLBkt(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TLBrace.java b/src/main/java/org/sablecc/sablecc/node/TLBrace.java
index a3dcb1575de2416c633b7d8db73928ab2aa42c47..0647fe873bc8d00def4dc94468e17a3806b50040 100644
--- a/src/main/java/org/sablecc/sablecc/node/TLBrace.java
+++ b/src/main/java/org/sablecc/sablecc/node/TLBrace.java
@@ -16,15 +16,12 @@ public final class TLBrace extends Token
         super("{", line, pos);
     }
 
-    public TLBrace(TLBrace token)
-    {
-        super(token);
-    }
-
     @Override
     public TLBrace clone()
     {
-        return new TLBrace(this);
+        TLBrace cloned = new TLBrace(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TLPar.java b/src/main/java/org/sablecc/sablecc/node/TLPar.java
index 8ba1e87a8b3fa02e5c843ad25c5ce11c91ab1b14..3f4c1abf01f459059c288c4962c3ec67d0ff7916 100644
--- a/src/main/java/org/sablecc/sablecc/node/TLPar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TLPar.java
@@ -16,15 +16,12 @@ public final class TLPar extends Token
         super("(", line, pos);
     }
 
-    public TLPar(TLPar token)
-    {
-        super(token);
-    }
-
     @Override
     public TLPar clone()
     {
-        return new TLPar(this);
+        TLPar cloned = new TLPar(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TMinus.java b/src/main/java/org/sablecc/sablecc/node/TMinus.java
index 044d65cb72357e26aff5acb55e533c398e16b61e..65589eee518ba65d7446b79b33468a99dd7016b3 100644
--- a/src/main/java/org/sablecc/sablecc/node/TMinus.java
+++ b/src/main/java/org/sablecc/sablecc/node/TMinus.java
@@ -16,15 +16,12 @@ public final class TMinus extends Token
         super("-", line, pos);
     }
 
-    public TMinus(TMinus token)
-    {
-        super(token);
-    }
-
     @Override
     public TMinus clone()
     {
-        return new TMinus(this);
+        TMinus cloned = new TMinus(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TNew.java b/src/main/java/org/sablecc/sablecc/node/TNew.java
index fcbcd3051c396bbedb10d79dcaeeba73e9f77c2b..38dff6e096eb919b51843e5d523613451766713e 100644
--- a/src/main/java/org/sablecc/sablecc/node/TNew.java
+++ b/src/main/java/org/sablecc/sablecc/node/TNew.java
@@ -16,15 +16,12 @@ public final class TNew extends Token
         super("New", line, pos);
     }
 
-    public TNew(TNew token)
-    {
-        super(token);
-    }
-
     @Override
     public TNew clone()
     {
-        return new TNew(this);
+        TNew cloned = new TNew(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TNull.java b/src/main/java/org/sablecc/sablecc/node/TNull.java
index 47800bb7583b204c45f4d5bca5239993d1678724..16042a48ef03f5f128d775b37913810296d71019 100644
--- a/src/main/java/org/sablecc/sablecc/node/TNull.java
+++ b/src/main/java/org/sablecc/sablecc/node/TNull.java
@@ -16,15 +16,12 @@ public final class TNull extends Token
         super("Null", line, pos);
     }
 
-    public TNull(TNull token)
-    {
-        super(token);
-    }
-
     @Override
     public TNull clone()
     {
-        return new TNull(this);
+        TNull cloned = new TNull(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TPackage.java b/src/main/java/org/sablecc/sablecc/node/TPackage.java
index b2854d6dd99d1a3fc4ca87afcb3917aa14a52a5e..4b9ebe82436d33e36acd9f14334719d26a3ffb72 100644
--- a/src/main/java/org/sablecc/sablecc/node/TPackage.java
+++ b/src/main/java/org/sablecc/sablecc/node/TPackage.java
@@ -16,15 +16,12 @@ public final class TPackage extends Token
         super("Package", line, pos);
     }
 
-    public TPackage(TPackage token)
-    {
-        super(token);
-    }
-
     @Override
     public TPackage clone()
     {
-        return new TPackage(this);
+        TPackage cloned = new TPackage(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TPkgId.java b/src/main/java/org/sablecc/sablecc/node/TPkgId.java
index 63fd17a18c15cba74a84fd15acf5fb0993984f36..f156efe8ea8f4b4e1e491d1ddd8be87b929f45c9 100644
--- a/src/main/java/org/sablecc/sablecc/node/TPkgId.java
+++ b/src/main/java/org/sablecc/sablecc/node/TPkgId.java
@@ -16,15 +16,12 @@ public final class TPkgId extends Token
         super(text, line, pos);
     }
 
-    public TPkgId(TPkgId token)
-    {
-        super(token);
-    }
-
     @Override
     public TPkgId clone()
     {
-        return new TPkgId(this);
+        TPkgId cloned = new TPkgId(this.getText(), this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TPlus.java b/src/main/java/org/sablecc/sablecc/node/TPlus.java
index 5098ea0560ef1e54035439e42cf132fcb4afcc76..e12da0e1da7d34660aec1dcd49f4d6771cd1d829 100644
--- a/src/main/java/org/sablecc/sablecc/node/TPlus.java
+++ b/src/main/java/org/sablecc/sablecc/node/TPlus.java
@@ -16,15 +16,12 @@ public final class TPlus extends Token
         super("+", line, pos);
     }
 
-    public TPlus(TPlus token)
-    {
-        super(token);
-    }
-
     @Override
     public TPlus clone()
     {
-        return new TPlus(this);
+        TPlus cloned = new TPlus(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TProductionSpecifier.java b/src/main/java/org/sablecc/sablecc/node/TProductionSpecifier.java
index 35a585fa6be8e2e87fc5f860682ba4b287f3b1ef..e8a1615654d92c748326fb225597e24a30df5495 100644
--- a/src/main/java/org/sablecc/sablecc/node/TProductionSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/TProductionSpecifier.java
@@ -16,15 +16,12 @@ public final class TProductionSpecifier extends Token
         super("P", line, pos);
     }
 
-    public TProductionSpecifier(TProductionSpecifier token)
-    {
-        super(token);
-    }
-
     @Override
     public TProductionSpecifier clone()
     {
-        return new TProductionSpecifier(this);
+        TProductionSpecifier cloned = new TProductionSpecifier(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TProductions.java b/src/main/java/org/sablecc/sablecc/node/TProductions.java
index 7f402c305d92a37de0e92f4eabe7fb87c7626215..246be7f46335b9fed24ff75d307df647f4dce0fc 100644
--- a/src/main/java/org/sablecc/sablecc/node/TProductions.java
+++ b/src/main/java/org/sablecc/sablecc/node/TProductions.java
@@ -16,15 +16,12 @@ public final class TProductions extends Token
         super("Productions", line, pos);
     }
 
-    public TProductions(TProductions token)
-    {
-        super(token);
-    }
-
     @Override
     public TProductions clone()
     {
-        return new TProductions(this);
+        TProductions cloned = new TProductions(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TQMark.java b/src/main/java/org/sablecc/sablecc/node/TQMark.java
index aebf492424c824f49c0e2c0d80dc133174d7d1e1..76b9f4de3cf8817d82a8149fde75f5c3a275d0ec 100644
--- a/src/main/java/org/sablecc/sablecc/node/TQMark.java
+++ b/src/main/java/org/sablecc/sablecc/node/TQMark.java
@@ -16,15 +16,12 @@ public final class TQMark extends Token
         super("?", line, pos);
     }
 
-    public TQMark(TQMark token)
-    {
-        super(token);
-    }
-
     @Override
     public TQMark clone()
     {
-        return new TQMark(this);
+        TQMark cloned = new TQMark(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TRBkt.java b/src/main/java/org/sablecc/sablecc/node/TRBkt.java
index 30552da69e821b2614bd4c7e1ca175c4aeac9f2e..83aafaa438825a05ea64f493fb7df2a50eb9993e 100644
--- a/src/main/java/org/sablecc/sablecc/node/TRBkt.java
+++ b/src/main/java/org/sablecc/sablecc/node/TRBkt.java
@@ -16,15 +16,12 @@ public final class TRBkt extends Token
         super("]", line, pos);
     }
 
-    public TRBkt(TRBkt token)
-    {
-        super(token);
-    }
-
     @Override
     public TRBkt clone()
     {
-        return new TRBkt(this);
+        TRBkt cloned = new TRBkt(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TRBrace.java b/src/main/java/org/sablecc/sablecc/node/TRBrace.java
index 04be2a1ce6914e3e527354e4998b865d82334a22..79868e287da33dd98c3d54fdc937a4ac2d564c4b 100644
--- a/src/main/java/org/sablecc/sablecc/node/TRBrace.java
+++ b/src/main/java/org/sablecc/sablecc/node/TRBrace.java
@@ -16,15 +16,12 @@ public final class TRBrace extends Token
         super("}", line, pos);
     }
 
-    public TRBrace(TRBrace token)
-    {
-        super(token);
-    }
-
     @Override
     public TRBrace clone()
     {
-        return new TRBrace(this);
+        TRBrace cloned = new TRBrace(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TRPar.java b/src/main/java/org/sablecc/sablecc/node/TRPar.java
index c797774a6b97505a112fcae761b2c370b85d0253..84445c248be9b23111d50f5208148c955aff3323 100644
--- a/src/main/java/org/sablecc/sablecc/node/TRPar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TRPar.java
@@ -16,15 +16,12 @@ public final class TRPar extends Token
         super(")", line, pos);
     }
 
-    public TRPar(TRPar token)
-    {
-        super(token);
-    }
-
     @Override
     public TRPar clone()
     {
-        return new TRPar(this);
+        TRPar cloned = new TRPar(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TSemicolon.java b/src/main/java/org/sablecc/sablecc/node/TSemicolon.java
index 144ab07845bd29b7997b497c862c3b5eaecfa03f..92ebc8406dc51db50101dd54ae0246661dca3162 100644
--- a/src/main/java/org/sablecc/sablecc/node/TSemicolon.java
+++ b/src/main/java/org/sablecc/sablecc/node/TSemicolon.java
@@ -16,15 +16,12 @@ public final class TSemicolon extends Token
         super(";", line, pos);
     }
 
-    public TSemicolon(TSemicolon token)
-    {
-        super(token);
-    }
-
     @Override
     public TSemicolon clone()
     {
-        return new TSemicolon(this);
+        TSemicolon cloned = new TSemicolon(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TSlash.java b/src/main/java/org/sablecc/sablecc/node/TSlash.java
index 6b2fd73cabe1766d0ed39edc1709bf805171707e..91eccb84701cb02d1da835514a12b5c0fc7ffc8c 100644
--- a/src/main/java/org/sablecc/sablecc/node/TSlash.java
+++ b/src/main/java/org/sablecc/sablecc/node/TSlash.java
@@ -16,15 +16,12 @@ public final class TSlash extends Token
         super("/", line, pos);
     }
 
-    public TSlash(TSlash token)
-    {
-        super(token);
-    }
-
     @Override
     public TSlash clone()
     {
-        return new TSlash(this);
+        TSlash cloned = new TSlash(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TStar.java b/src/main/java/org/sablecc/sablecc/node/TStar.java
index c6835917372b09655346de4ac99dcb25049a9e9a..951f1b255771c30df51e2cab3833670375f27a60 100644
--- a/src/main/java/org/sablecc/sablecc/node/TStar.java
+++ b/src/main/java/org/sablecc/sablecc/node/TStar.java
@@ -16,15 +16,12 @@ public final class TStar extends Token
         super("*", line, pos);
     }
 
-    public TStar(TStar token)
-    {
-        super(token);
-    }
-
     @Override
     public TStar clone()
     {
-        return new TStar(this);
+        TStar cloned = new TStar(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TStates.java b/src/main/java/org/sablecc/sablecc/node/TStates.java
index 45a75a7d67ae34613f9fef0e7097ae668e90b4b2..44c82ac9378589fdd3a3add9b976814742068e9c 100644
--- a/src/main/java/org/sablecc/sablecc/node/TStates.java
+++ b/src/main/java/org/sablecc/sablecc/node/TStates.java
@@ -16,15 +16,12 @@ public final class TStates extends Token
         super("States", line, pos);
     }
 
-    public TStates(TStates token)
-    {
-        super(token);
-    }
-
     @Override
     public TStates clone()
     {
-        return new TStates(this);
+        TStates cloned = new TStates(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TString.java b/src/main/java/org/sablecc/sablecc/node/TString.java
index 452162ec67d17fcc5919c4dcf653914157854a8f..c48a3a0fae5f8f460827a6901220925ada1244c0 100644
--- a/src/main/java/org/sablecc/sablecc/node/TString.java
+++ b/src/main/java/org/sablecc/sablecc/node/TString.java
@@ -16,15 +16,12 @@ public final class TString extends Token
         super(text, line, pos);
     }
 
-    public TString(TString token)
-    {
-        super(token);
-    }
-
     @Override
     public TString clone()
     {
-        return new TString(this);
+        TString cloned = new TString(this.getText(), this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TSyntax.java b/src/main/java/org/sablecc/sablecc/node/TSyntax.java
index 4e7340f7cc74d3296083ecbf6b18d32ed6c93df2..daa350432ef75c511972a90908ffebed322ed91c 100644
--- a/src/main/java/org/sablecc/sablecc/node/TSyntax.java
+++ b/src/main/java/org/sablecc/sablecc/node/TSyntax.java
@@ -16,15 +16,12 @@ public final class TSyntax extends Token
         super("Syntax", line, pos);
     }
 
-    public TSyntax(TSyntax token)
-    {
-        super(token);
-    }
-
     @Override
     public TSyntax clone()
     {
-        return new TSyntax(this);
+        TSyntax cloned = new TSyntax(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TTokenSpecifier.java b/src/main/java/org/sablecc/sablecc/node/TTokenSpecifier.java
index b37b101e402c4fa9ab8c59732cbdebfbf3d63945..c58dcb73a6f8a9b5378e11818cc10575d6e14d12 100644
--- a/src/main/java/org/sablecc/sablecc/node/TTokenSpecifier.java
+++ b/src/main/java/org/sablecc/sablecc/node/TTokenSpecifier.java
@@ -16,15 +16,12 @@ public final class TTokenSpecifier extends Token
         super("T", line, pos);
     }
 
-    public TTokenSpecifier(TTokenSpecifier token)
-    {
-        super(token);
-    }
-
     @Override
     public TTokenSpecifier clone()
     {
-        return new TTokenSpecifier(this);
+        TTokenSpecifier cloned = new TTokenSpecifier(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TTokens.java b/src/main/java/org/sablecc/sablecc/node/TTokens.java
index fac6c7a7fa5c7d2d5aa8fe141bfe7efc54438817..3234e79c24c62116f5cc51fb10750aaf2b392db1 100644
--- a/src/main/java/org/sablecc/sablecc/node/TTokens.java
+++ b/src/main/java/org/sablecc/sablecc/node/TTokens.java
@@ -16,15 +16,12 @@ public final class TTokens extends Token
         super("Tokens", line, pos);
     }
 
-    public TTokens(TTokens token)
-    {
-        super(token);
-    }
-
     @Override
     public TTokens clone()
     {
-        return new TTokens(this);
+        TTokens cloned = new TTokens(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/TTree.java b/src/main/java/org/sablecc/sablecc/node/TTree.java
index 91100d31f153e753b65ce43dc2265debaae123a4..e101e4436b7d520e7d3fdfdec613ebf38404d1a0 100644
--- a/src/main/java/org/sablecc/sablecc/node/TTree.java
+++ b/src/main/java/org/sablecc/sablecc/node/TTree.java
@@ -16,15 +16,12 @@ public final class TTree extends Token
         super("Tree", line, pos);
     }
 
-    public TTree(TTree token)
-    {
-        super(token);
-    }
-
     @Override
     public TTree clone()
     {
-        return new TTree(this);
+        TTree cloned = new TTree(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/java/org/sablecc/sablecc/node/Token.java b/src/main/java/org/sablecc/sablecc/node/Token.java
index 628077f9e1f2c706c0bbed22a466a799d2ed5686..6ff16df3964fe96670987e994885616a31c83d0d 100644
--- a/src/main/java/org/sablecc/sablecc/node/Token.java
+++ b/src/main/java/org/sablecc/sablecc/node/Token.java
@@ -23,19 +23,6 @@ public abstract class Token extends Node implements IToken
         this(text, 0, 0);
     }
 
-    protected Token()
-    {
-        this((String)null);
-    }
-
-    protected Token(Token token)
-    {
-        super(token);
-        this.text = token.text;
-        this.line = token.line;
-        this.pos = token.pos;
-    }
-
     @Override
     public abstract Token clone();
 
diff --git a/src/main/java/org/sablecc/sablecc/parser/Parser.java b/src/main/java/org/sablecc/sablecc/parser/Parser.java
index 85092dbeb734e2c16f8a831dccf3e6ca2bea0ff2..6f04f9d70c21b0cf4e7c0004b3f8fefd6ad4b23d 100644
--- a/src/main/java/org/sablecc/sablecc/parser/Parser.java
+++ b/src/main/java/org/sablecc/sablecc/parser/Parser.java
@@ -14,7 +14,6 @@ import java.util.ListIterator;
 
 import de.hhu.stups.sablecc.patch.IParser;
 import de.hhu.stups.sablecc.patch.PositionedNode;
-import de.hhu.stups.sablecc.patch.SourcePosition;
 
 import org.sablecc.sablecc.lexer.Lexer;
 import org.sablecc.sablecc.lexer.LexerException;
@@ -27,73 +26,40 @@ public class Parser implements IParser
     private final ListIterator<State> stack = new LinkedList<State>().listIterator();
     private final TokenIndex converter = new TokenIndex();
 
-    private final static int SHIFT = 0;
-    private final static int REDUCE = 1;
-    private final static int ACCEPT = 2;
-    private final static int ERROR = 3;
+    private static final int SHIFT = 0;
+    private static final int REDUCE = 1;
+    private static final int ACCEPT = 2;
+    private static final int ERROR = 3;
 
     public Parser(Lexer lexer)
     {
         this.lexer = lexer;
     }
 
-    private void checkResult(Object elementToCheck, List<?> beginNodeList, List<?> endNodeList) {
-        if (elementToCheck instanceof List<?>) {
-            /*
-             * special case: this is a list of nodes, for example an identifier
-             * list, so we don't want to check the list but the last element
-             * added to it
-             */
-            final List<?> nodeList = (List<?>) elementToCheck;
-            if (nodeList.isEmpty()) {
-                // no positions for empty lists...
-                return;
-            }
-            elementToCheck = nodeList.get(nodeList.size() - 1);
-        }
+    private static void computePositions(PositionedNode node, List<?> beginNodeList, List<?> endNodeList) {
+        // This method should only ever be called for newly created AST nodes (that are not tokens).
+        assert !(node instanceof Token);
+        assert node.getStartPos() == null;
+        assert node.getEndPos() == null;
 
-        final PositionedNode node = (PositionedNode) elementToCheck;
-
-        // Add node positions if they haven't been calculated yet.
-        // Tokens are skipped because they always have positions -
-        // this avoids creating unnecessary SourcePosition objects.
-        if (!(node instanceof Token) && node.getStartPos() == null) {
-            assert node.getEndPos() == null;
-            PositionedNode beginNode = findBeginNode(beginNodeList);
-            if (beginNode == null) {
-                /*
-                 * Sometimes (haven't found out why) we get empty list here. In
-                 * the only observed cases we were looking for the source range
-                 * of the whole parse unit. Then the start pos is the first char.
-                 */
-                node.setStartPos(new SourcePosition(1, 1));
-            } else {
-                node.setStartPos(beginNode.getStartPos());
-            }
+        PositionedNode beginNode = findBeginNode(beginNodeList);
+        node.setStartPos(beginNode.getStartPos());
 
-            PositionedNode endNode = findEndNode(endNodeList);
-            node.setEndPos(endNode.getEndPos());
-        } else {
-            assert node.getEndPos() != null;
-        }
+        PositionedNode endNode = findEndNode(endNodeList);
+        node.setEndPos(endNode.getEndPos());
     }
 
-    private PositionedNode findBeginNode(final List<?> list) {
+    private static PositionedNode findBeginNode(final List<?> list) {
         Object first = list.get(0);
         if (first instanceof List<?>) {
             List<?> list2 = (List<?>) first;
-
-            if (!list2.isEmpty()) {
-                return (PositionedNode)list2.get(0);
-            } else {
-                return null;
-            }
+            return (PositionedNode)list2.get(0);
         }
 
         return (PositionedNode)first;
     }
 
-    private PositionedNode findEndNode(final List<?> list) {
+    private static PositionedNode findEndNode(final List<?> list) {
         Object last = list.get(list.size() - 1);
         if (last instanceof List<?>) {
             final List<?> list2 = (List<?>) last;
@@ -212,11 +178,9 @@ public class Parser implements IParser
             switch(action)
             {
                 case SHIFT:
-                {
-                    List<?> list = Collections.singletonList(this.lexer.next());
-                    push(destination, list);
-                }
-                break;
+                    push(destination, Collections.singletonList(this.lexer.next()));
+                    break;
+
                 case REDUCE:
                     switch(destination)
                     {
@@ -1834,19 +1798,23 @@ public class Parser implements IParser
                             push(goTo(64), list);
                         }
                         break;
+                        default:
+                            throw new ParserException(lastToken, "[" + lastToken.getLine() + "," + lastToken.getPos() + "] Internal parser error: invalid action table REDUCE destination " + destination + ", current state " + state());
                     }
                     break;
+
                 case ACCEPT:
-                {
-                    EOF node2 = (EOF) this.lexer.next();
-                    PGrammar node1 = (PGrammar) pop().get(0);
-                    Start node = new Start(node1, node2);
-                    return node;
-                }
+                    EOF eof = (EOF) this.lexer.next();
+                    PGrammar top = (PGrammar) pop().get(0);
+                    return new Start(top, eof);
+
                 case ERROR:
                     throw new ParserException(lastToken,
                         "[" + lastToken.getLine() + "," + lastToken.getPos() + "] " ,
                         Parser.errorMessages[Parser.errors[destination]]);
+
+                default:
+                    throw new ParserException(lastToken, "[" + lastToken.getLine() + "," + lastToken.getPos() + "] Internal parser error: invalid action table entry " + action + ", destination " + destination + ", current state " + state());
             }
         }
     }
@@ -1854,3902 +1822,4057 @@ public class Parser implements IParser
 
     private List<?> new0() /* reduce AAgrammar1Grammar */
     {
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, null, null, null);
 
-        return Collections.singletonList(pgrammarNode1);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, null, null, null);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new1() /* reduce AAgrammar2Grammar */
     {
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, null, null, null, null);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, null, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped1);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new2() /* reduce AAgrammar3Grammar */
     {
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, null, null, null, null);
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, null, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped1);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new3() /* reduce AAgrammar4Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, null, null, null, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, null, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped2);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new4() /* reduce AAgrammar5Grammar */
     {
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, null, null, null, null);
+        List<?> popped1 = pop();
+
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, null, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped1);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new5() /* reduce AAgrammar6Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, null, null, null, null);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, null, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped2);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new6() /* reduce AAgrammar7Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, null, null, null, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, null, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped2);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new7() /* reduce AAgrammar8Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, null, null, null, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, null, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new8() /* reduce AAgrammar9Grammar */
     {
-        List<?> nodeArrayList1 = pop();
-        PTokens ptokensNode5 = (PTokens)nodeArrayList1.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, ptokensNode5, null, null, null);
+        List<?> popped1 = pop();
+
+        PTokens pTokensNode5 = (PTokens)popped1.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, pTokensNode5, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped1);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new9() /* reduce AAgrammar10Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PTokens ptokensNode6 = (PTokens)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, ptokensNode6, null, null, null);
+        PTokens pTokensNode6 = (PTokens)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, pTokensNode6, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped2);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new10() /* reduce AAgrammar11Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, ptokensNode5, null, null, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, pTokensNode5, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped2);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new11() /* reduce AAgrammar12Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, ptokensNode6, null, null, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, pTokensNode6, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new12() /* reduce AAgrammar13Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, ptokensNode5, null, null, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, pTokensNode5, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped2);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new13() /* reduce AAgrammar14Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, ptokensNode6, null, null, null);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, pTokensNode6, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new14() /* reduce AAgrammar15Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, ptokensNode5, null, null, null);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PTokens pTokensNode5 = (PTokens)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, pTokensNode5, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped3);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new15() /* reduce AAgrammar16Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, ptokensNode6, null, null, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PTokens pTokensNode6 = (PTokens)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, pTokensNode6, null, null, null);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new16() /* reduce AAgrammar17Grammar */
     {
-        List<?> nodeArrayList1 = pop();
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList1.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, pigntokensNode6, null, null);
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pgrammarNode1);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped1.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, pIgnTokensNode6, null, null);
+        computePositions(pGrammarNode1, popped1, popped1);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new17() /* reduce AAgrammar18Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, null, pigntokensNode7, null, null);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, null, pIgnTokensNode7, null, null);
+        computePositions(pGrammarNode1, popped1, popped2);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new18() /* reduce AAgrammar19Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, null, pigntokensNode6, null, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, null, pIgnTokensNode6, null, null);
+        computePositions(pGrammarNode1, popped1, popped2);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new19() /* reduce AAgrammar20Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, null, pigntokensNode7, null, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, null, pIgnTokensNode7, null, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new20() /* reduce AAgrammar21Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, null, pigntokensNode6, null, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, null, pIgnTokensNode6, null, null);
+        computePositions(pGrammarNode1, popped1, popped2);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new21() /* reduce AAgrammar22Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, null, pigntokensNode7, null, null);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, null, pIgnTokensNode7, null, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new22() /* reduce AAgrammar23Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, null, pigntokensNode6, null, null);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, null, pIgnTokensNode6, null, null);
+        computePositions(pGrammarNode1, popped1, popped3);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new23() /* reduce AAgrammar24Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, null, pigntokensNode7, null, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, null, pIgnTokensNode7, null, null);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new24() /* reduce AAgrammar25Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PTokens ptokensNode5 = (PTokens)nodeArrayList1.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, ptokensNode5, pigntokensNode6, null, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        PTokens pTokensNode5 = (PTokens)popped1.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, pTokensNode5, pIgnTokensNode6, null, null);
+        computePositions(pGrammarNode1, popped1, popped2);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new25() /* reduce AAgrammar26Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PTokens ptokensNode6 = (PTokens)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, ptokensNode6, pigntokensNode7, null, null);
+        PTokens pTokensNode6 = (PTokens)popped2.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, pTokensNode6, pIgnTokensNode7, null, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new26() /* reduce AAgrammar27Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, ptokensNode5, pigntokensNode6, null, null);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, pTokensNode5, pIgnTokensNode6, null, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new27() /* reduce AAgrammar28Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, ptokensNode6, pigntokensNode7, null, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, pTokensNode6, pIgnTokensNode7, null, null);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new28() /* reduce AAgrammar29Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, ptokensNode5, pigntokensNode6, null, null);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, pTokensNode5, pIgnTokensNode6, null, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new29() /* reduce AAgrammar30Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, ptokensNode6, pigntokensNode7, null, null);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, pTokensNode6, pIgnTokensNode7, null, null);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new30() /* reduce AAgrammar31Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, ptokensNode5, pigntokensNode6, null, null);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PTokens pTokensNode5 = (PTokens)popped3.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, pTokensNode5, pIgnTokensNode6, null, null);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new31() /* reduce AAgrammar32Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList4.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, ptokensNode6, pigntokensNode7, null, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PTokens pTokensNode6 = (PTokens)popped4.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, pTokensNode6, pIgnTokensNode7, null, null);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new32() /* reduce AAgrammar33Grammar */
     {
-        List<?> nodeArrayList1 = pop();
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList1.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, null, pproductionsNode7, null);
+        List<?> popped1 = pop();
+
+        PProductions pProductionsNode7 = (PProductions)popped1.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, null, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped1);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new33() /* reduce AAgrammar34Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, null, null, pproductionsNode8, null);
+        PProductions pProductionsNode8 = (PProductions)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, null, null, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped2);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new34() /* reduce AAgrammar35Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, null, null, pproductionsNode7, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, null, null, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped2);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new35() /* reduce AAgrammar36Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, null, null, pproductionsNode8, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, null, null, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new36() /* reduce AAgrammar37Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, null, null, pproductionsNode7, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, null, null, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped2);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new37() /* reduce AAgrammar38Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, null, null, pproductionsNode8, null);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, null, null, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new38() /* reduce AAgrammar39Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, null, null, pproductionsNode7, null);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, null, null, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped3);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new39() /* reduce AAgrammar40Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, null, null, pproductionsNode8, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, null, null, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new40() /* reduce AAgrammar41Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PTokens ptokensNode5 = (PTokens)nodeArrayList1.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, ptokensNode5, null, pproductionsNode7, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PTokens pTokensNode5 = (PTokens)popped1.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, pTokensNode5, null, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped2);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new41() /* reduce AAgrammar42Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PTokens ptokensNode6 = (PTokens)nodeArrayList2.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, ptokensNode6, null, pproductionsNode8, null);
+        PTokens pTokensNode6 = (PTokens)popped2.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, pTokensNode6, null, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new42() /* reduce AAgrammar43Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, ptokensNode5, null, pproductionsNode7, null);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, pTokensNode5, null, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new43() /* reduce AAgrammar44Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, ptokensNode6, null, pproductionsNode8, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, pTokensNode6, null, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new44() /* reduce AAgrammar45Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, ptokensNode5, null, pproductionsNode7, null);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, pTokensNode5, null, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new45() /* reduce AAgrammar46Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, ptokensNode6, null, pproductionsNode8, null);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, pTokensNode6, null, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new46() /* reduce AAgrammar47Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, ptokensNode5, null, pproductionsNode7, null);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PTokens pTokensNode5 = (PTokens)popped3.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, pTokensNode5, null, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new47() /* reduce AAgrammar48Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList4.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, ptokensNode6, null, pproductionsNode8, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PTokens pTokensNode6 = (PTokens)popped4.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, pTokensNode6, null, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new48() /* reduce AAgrammar49Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList1.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, pigntokensNode6, pproductionsNode7, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped1.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, pIgnTokensNode6, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped2);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new49() /* reduce AAgrammar50Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList2.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, null, pigntokensNode7, pproductionsNode8, null);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped2.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, null, pIgnTokensNode7, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new50() /* reduce AAgrammar51Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList2.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, null, pigntokensNode6, pproductionsNode7, null);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped2.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, null, pIgnTokensNode6, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new51() /* reduce AAgrammar52Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, null, pigntokensNode7, pproductionsNode8, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped3.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, null, pIgnTokensNode7, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new52() /* reduce AAgrammar53Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList2.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, null, pigntokensNode6, pproductionsNode7, null);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped2.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, null, pIgnTokensNode6, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new53() /* reduce AAgrammar54Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, null, pigntokensNode7, pproductionsNode8, null);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped3.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, null, pIgnTokensNode7, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new54() /* reduce AAgrammar55Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, null, pigntokensNode6, pproductionsNode7, null);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped3.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, null, pIgnTokensNode6, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new55() /* reduce AAgrammar56Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList4.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, null, pigntokensNode7, pproductionsNode8, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped4.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, null, pIgnTokensNode7, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new56() /* reduce AAgrammar57Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PTokens ptokensNode5 = (PTokens)nodeArrayList1.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList2.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, ptokensNode5, pigntokensNode6, pproductionsNode7, null);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        PTokens pTokensNode5 = (PTokens)popped1.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped2.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, pTokensNode5, pIgnTokensNode6, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped3);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new57() /* reduce AAgrammar58Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PTokens ptokensNode6 = (PTokens)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, ptokensNode6, pigntokensNode7, pproductionsNode8, null);
+        PTokens pTokensNode6 = (PTokens)popped2.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped3.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, pTokensNode6, pIgnTokensNode7, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new58() /* reduce AAgrammar59Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, ptokensNode5, pigntokensNode6, pproductionsNode7, null);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped3.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, pTokensNode5, pIgnTokensNode6, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped4);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new59() /* reduce AAgrammar60Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList4.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, ptokensNode6, pigntokensNode7, pproductionsNode8, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped4.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, pTokensNode6, pIgnTokensNode7, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new60() /* reduce AAgrammar61Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, ptokensNode5, pigntokensNode6, pproductionsNode7, null);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped3.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, pTokensNode5, pIgnTokensNode6, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped4);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new61() /* reduce AAgrammar62Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList4.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, ptokensNode6, pigntokensNode7, pproductionsNode8, null);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped4.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, pTokensNode6, pIgnTokensNode7, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new62() /* reduce AAgrammar63Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList4.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, ptokensNode5, pigntokensNode6, pproductionsNode7, null);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PTokens pTokensNode5 = (PTokens)popped3.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped4.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, pTokensNode5, pIgnTokensNode6, pProductionsNode7, null);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new63() /* reduce AAgrammar64Grammar */
     {
-        List<?> nodeArrayList6 = pop();
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped6 = pop();
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList4.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList5.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList6.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, ptokensNode6, pigntokensNode7, pproductionsNode8, null);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PTokens pTokensNode6 = (PTokens)popped4.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped5.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped6.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, pTokensNode6, pIgnTokensNode7, pProductionsNode8, null);
+        computePositions(pGrammarNode1, popped1, popped6);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList6);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new64() /* reduce AAgrammar65Grammar */
     {
-        List<?> nodeArrayList1 = pop();
-        PAst pastNode8 = (PAst)nodeArrayList1.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, null, null, pastNode8);
+        List<?> popped1 = pop();
+
+        PAst pAstNode8 = (PAst)popped1.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, null, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped1);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new65() /* reduce AAgrammar66Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PAst pastNode9 = (PAst)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, null, null, null, pastNode9);
+        PAst pAstNode9 = (PAst)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, null, null, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped2);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new66() /* reduce AAgrammar67Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, null, null, null, pastNode8);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PAst pAstNode8 = (PAst)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, null, null, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped2);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new67() /* reduce AAgrammar68Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, null, null, null, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PAst pAstNode9 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, null, null, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new68() /* reduce AAgrammar69Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, null, null, null, pastNode8);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PAst pAstNode8 = (PAst)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, null, null, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped2);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new69() /* reduce AAgrammar70Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, null, null, null, pastNode9);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PAst pAstNode9 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, null, null, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new70() /* reduce AAgrammar71Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, null, null, null, pastNode8);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PAst pAstNode8 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, null, null, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped3);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new71() /* reduce AAgrammar72Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, null, null, null, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PAst pAstNode9 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, null, null, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new72() /* reduce AAgrammar73Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PTokens ptokensNode5 = (PTokens)nodeArrayList1.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, ptokensNode5, null, null, pastNode8);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        PTokens pTokensNode5 = (PTokens)popped1.get(0);
+        PAst pAstNode8 = (PAst)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, pTokensNode5, null, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped2);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new73() /* reduce AAgrammar74Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PTokens ptokensNode6 = (PTokens)nodeArrayList2.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, ptokensNode6, null, null, pastNode9);
+        PTokens pTokensNode6 = (PTokens)popped2.get(0);
+        PAst pAstNode9 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, pTokensNode6, null, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new74() /* reduce AAgrammar75Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, ptokensNode5, null, null, pastNode8);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        PAst pAstNode8 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, pTokensNode5, null, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped3);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new75() /* reduce AAgrammar76Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, ptokensNode6, null, null, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        PAst pAstNode9 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, pTokensNode6, null, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new76() /* reduce AAgrammar77Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, ptokensNode5, null, null, pastNode8);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        PAst pAstNode8 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, pTokensNode5, null, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new77() /* reduce AAgrammar78Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, ptokensNode6, null, null, pastNode9);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        PAst pAstNode9 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, pTokensNode6, null, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new78() /* reduce AAgrammar79Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList3.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, ptokensNode5, null, null, pastNode8);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PTokens pTokensNode5 = (PTokens)popped3.get(0);
+        PAst pAstNode8 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, pTokensNode5, null, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new79() /* reduce AAgrammar80Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList4.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, ptokensNode6, null, null, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PTokens pTokensNode6 = (PTokens)popped4.get(0);
+        PAst pAstNode9 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, pTokensNode6, null, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new80() /* reduce AAgrammar81Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList1.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, pigntokensNode6, null, pastNode8);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped1.get(0);
+        PAst pAstNode8 = (PAst)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, pIgnTokensNode6, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped2);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new81() /* reduce AAgrammar82Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList2.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, null, pigntokensNode7, null, pastNode9);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped2.get(0);
+        PAst pAstNode9 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, null, pIgnTokensNode7, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new82() /* reduce AAgrammar83Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList2.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, null, pigntokensNode6, null, pastNode8);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped2.get(0);
+        PAst pAstNode8 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, null, pIgnTokensNode6, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new83() /* reduce AAgrammar84Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList3.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, null, pigntokensNode7, null, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped3.get(0);
+        PAst pAstNode9 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, null, pIgnTokensNode7, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new84() /* reduce AAgrammar85Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList2.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, null, pigntokensNode6, null, pastNode8);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped2.get(0);
+        PAst pAstNode8 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, null, pIgnTokensNode6, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped3);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new85() /* reduce AAgrammar86Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList3.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, null, pigntokensNode7, null, pastNode9);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped3.get(0);
+        PAst pAstNode9 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, null, pIgnTokensNode7, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new86() /* reduce AAgrammar87Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList3.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, null, pigntokensNode6, null, pastNode8);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped3.get(0);
+        PAst pAstNode8 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, null, pIgnTokensNode6, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped4);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new87() /* reduce AAgrammar88Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList4.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, null, pigntokensNode7, null, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped4.get(0);
+        PAst pAstNode9 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, null, pIgnTokensNode7, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new88() /* reduce AAgrammar89Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PTokens ptokensNode5 = (PTokens)nodeArrayList1.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList2.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, ptokensNode5, pigntokensNode6, null, pastNode8);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        PTokens pTokensNode5 = (PTokens)popped1.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped2.get(0);
+        PAst pAstNode8 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, pTokensNode5, pIgnTokensNode6, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped3);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new89() /* reduce AAgrammar90Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PTokens ptokensNode6 = (PTokens)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList3.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, ptokensNode6, pigntokensNode7, null, pastNode9);
+        PTokens pTokensNode6 = (PTokens)popped2.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped3.get(0);
+        PAst pAstNode9 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, pTokensNode6, pIgnTokensNode7, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new90() /* reduce AAgrammar91Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList3.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, ptokensNode5, pigntokensNode6, null, pastNode8);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped3.get(0);
+        PAst pAstNode8 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, pTokensNode5, pIgnTokensNode6, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new91() /* reduce AAgrammar92Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList4.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, ptokensNode6, pigntokensNode7, null, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped4.get(0);
+        PAst pAstNode9 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, pTokensNode6, pIgnTokensNode7, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new92() /* reduce AAgrammar93Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList3.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, ptokensNode5, pigntokensNode6, null, pastNode8);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped3.get(0);
+        PAst pAstNode8 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, pTokensNode5, pIgnTokensNode6, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new93() /* reduce AAgrammar94Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList4.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, ptokensNode6, pigntokensNode7, null, pastNode9);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped4.get(0);
+        PAst pAstNode9 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, pTokensNode6, pIgnTokensNode7, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new94() /* reduce AAgrammar95Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList4.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, ptokensNode5, pigntokensNode6, null, pastNode8);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PTokens pTokensNode5 = (PTokens)popped3.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped4.get(0);
+        PAst pAstNode8 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, pTokensNode5, pIgnTokensNode6, null, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new95() /* reduce AAgrammar96Grammar */
     {
-        List<?> nodeArrayList6 = pop();
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped6 = pop();
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList4.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList5.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList6.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, ptokensNode6, pigntokensNode7, null, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PTokens pTokensNode6 = (PTokens)popped4.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped5.get(0);
+        PAst pAstNode9 = (PAst)popped6.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, pTokensNode6, pIgnTokensNode7, null, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped6);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList6);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new96() /* reduce AAgrammar97Grammar */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList1.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList2.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, null, pproductionsNode7, pastNode8);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PProductions pProductionsNode7 = (PProductions)popped1.get(0);
+        PAst pAstNode8 = (PAst)popped2.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, null, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped2);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new97() /* reduce AAgrammar98Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList2.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, null, null, pproductionsNode8, pastNode9);
+        PProductions pProductionsNode8 = (PProductions)popped2.get(0);
+        PAst pAstNode9 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, null, null, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new98() /* reduce AAgrammar99Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList2.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, null, null, pproductionsNode7, pastNode8);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped2.get(0);
+        PAst pAstNode8 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, null, null, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped3);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new99() /* reduce AAgrammar100Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList3.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, null, null, pproductionsNode8, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped3.get(0);
+        PAst pAstNode9 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, null, null, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new100() /* reduce AAgrammar101Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList2.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, null, null, pproductionsNode7, pastNode8);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped2.get(0);
+        PAst pAstNode8 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, null, null, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped3);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new101() /* reduce AAgrammar102Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList3.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, null, null, pproductionsNode8, pastNode9);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped3.get(0);
+        PAst pAstNode9 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, null, null, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new102() /* reduce AAgrammar103Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList3.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, null, null, pproductionsNode7, pastNode8);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped3.get(0);
+        PAst pAstNode8 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, null, null, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped4);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new103() /* reduce AAgrammar104Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList4.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, null, null, pproductionsNode8, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped4.get(0);
+        PAst pAstNode9 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, null, null, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new104() /* reduce AAgrammar105Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PTokens ptokensNode5 = (PTokens)nodeArrayList1.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList2.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, ptokensNode5, null, pproductionsNode7, pastNode8);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        PTokens pTokensNode5 = (PTokens)popped1.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped2.get(0);
+        PAst pAstNode8 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, pTokensNode5, null, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped3);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new105() /* reduce AAgrammar106Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PTokens ptokensNode6 = (PTokens)nodeArrayList2.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList3.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, ptokensNode6, null, pproductionsNode8, pastNode9);
+        PTokens pTokensNode6 = (PTokens)popped2.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped3.get(0);
+        PAst pAstNode9 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, pTokensNode6, null, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new106() /* reduce AAgrammar107Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList3.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, ptokensNode5, null, pproductionsNode7, pastNode8);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped3.get(0);
+        PAst pAstNode8 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, pTokensNode5, null, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped4);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new107() /* reduce AAgrammar108Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList4.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, ptokensNode6, null, pproductionsNode8, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped4.get(0);
+        PAst pAstNode9 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, pTokensNode6, null, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new108() /* reduce AAgrammar109Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList3.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, ptokensNode5, null, pproductionsNode7, pastNode8);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped3.get(0);
+        PAst pAstNode8 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, pTokensNode5, null, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped4);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new109() /* reduce AAgrammar110Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList4.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, ptokensNode6, null, pproductionsNode8, pastNode9);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped4.get(0);
+        PAst pAstNode9 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, pTokensNode6, null, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new110() /* reduce AAgrammar111Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList4.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, ptokensNode5, null, pproductionsNode7, pastNode8);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PTokens pTokensNode5 = (PTokens)popped3.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped4.get(0);
+        PAst pAstNode8 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, pTokensNode5, null, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped5);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new111() /* reduce AAgrammar112Grammar */
     {
-        List<?> nodeArrayList6 = pop();
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped6 = pop();
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList4.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList5.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList6.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, ptokensNode6, null, pproductionsNode8, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PTokens pTokensNode6 = (PTokens)popped4.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped5.get(0);
+        PAst pAstNode9 = (PAst)popped6.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, pTokensNode6, null, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped6);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList6);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new112() /* reduce AAgrammar113Grammar */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList1.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList2.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList3.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, pigntokensNode6, pproductionsNode7, pastNode8);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped1.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped2.get(0);
+        PAst pAstNode8 = (PAst)popped3.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, null, pIgnTokensNode6, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped3);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new113() /* reduce AAgrammar114Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList2.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList3.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, null, pigntokensNode7, pproductionsNode8, pastNode9);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped2.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped3.get(0);
+        PAst pAstNode9 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, null, pIgnTokensNode7, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new114() /* reduce AAgrammar115Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList2.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList3.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, null, pigntokensNode6, pproductionsNode7, pastNode8);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped2.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped3.get(0);
+        PAst pAstNode8 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, null, pIgnTokensNode6, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new115() /* reduce AAgrammar116Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList4.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, null, pigntokensNode7, pproductionsNode8, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped3.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped4.get(0);
+        PAst pAstNode9 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, null, pIgnTokensNode7, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new116() /* reduce AAgrammar117Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList2.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList3.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, null, pigntokensNode6, pproductionsNode7, pastNode8);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped2.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped3.get(0);
+        PAst pAstNode8 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, null, pIgnTokensNode6, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped4);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new117() /* reduce AAgrammar118Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList4.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, null, pigntokensNode7, pproductionsNode8, pastNode9);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped3.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped4.get(0);
+        PAst pAstNode9 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, null, pIgnTokensNode7, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new118() /* reduce AAgrammar119Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList4.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, null, pigntokensNode6, pproductionsNode7, pastNode8);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped3.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped4.get(0);
+        PAst pAstNode8 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, null, pIgnTokensNode6, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new119() /* reduce AAgrammar120Grammar */
     {
-        List<?> nodeArrayList6 = pop();
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped6 = pop();
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList4.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList5.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList6.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, null, pigntokensNode7, pproductionsNode8, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped4.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped5.get(0);
+        PAst pAstNode9 = (PAst)popped6.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, null, pIgnTokensNode7, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped6);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList6);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new120() /* reduce AAgrammar121Grammar */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PTokens ptokensNode5 = (PTokens)nodeArrayList1.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList2.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList3.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList4.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, null, ptokensNode5, pigntokensNode6, pproductionsNode7, pastNode8);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pgrammarNode1);
+        PTokens pTokensNode5 = (PTokens)popped1.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped2.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped3.get(0);
+        PAst pAstNode8 = (PAst)popped4.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, null, pTokensNode5, pIgnTokensNode6, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped4);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new121() /* reduce AAgrammar122Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PTokens ptokensNode6 = (PTokens)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList4.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, null, ptokensNode6, pigntokensNode7, pproductionsNode8, pastNode9);
+        PTokens pTokensNode6 = (PTokens)popped2.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped3.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped4.get(0);
+        PAst pAstNode9 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, null, pTokensNode6, pIgnTokensNode7, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped5);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new122() /* reduce AAgrammar123Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList4.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, null, ptokensNode5, pigntokensNode6, pproductionsNode7, pastNode8);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped3.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped4.get(0);
+        PAst pAstNode8 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, null, pTokensNode5, pIgnTokensNode6, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped5);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new123() /* reduce AAgrammar124Grammar */
     {
-        List<?> nodeArrayList6 = pop();
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped6 = pop();
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList4.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList5.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList6.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, null, ptokensNode6, pigntokensNode7, pproductionsNode8, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped4.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped5.get(0);
+        PAst pAstNode9 = (PAst)popped6.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, null, pTokensNode6, pIgnTokensNode7, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped6);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList6);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new124() /* reduce AAgrammar125Grammar */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStates pstatesNode4 = (PStates)nodeArrayList1.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList2.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList3.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList4.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList5.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), null, pstatesNode4, ptokensNode5, pigntokensNode6, pproductionsNode7, pastNode8);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pgrammarNode1);
+        PStates pStatesNode4 = (PStates)popped1.get(0);
+        PTokens pTokensNode5 = (PTokens)popped2.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped3.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped4.get(0);
+        PAst pAstNode8 = (PAst)popped5.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), null, pStatesNode4, pTokensNode5, pIgnTokensNode6, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped5);
+
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new125() /* reduce AAgrammar126Grammar */
     {
-        List<?> nodeArrayList6 = pop();
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped6 = pop();
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PStates pstatesNode5 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList4.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList5.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList6.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, null, pstatesNode5, ptokensNode6, pigntokensNode7, pproductionsNode8, pastNode9);
+        PStates pStatesNode5 = (PStates)popped2.get(0);
+        PTokens pTokensNode6 = (PTokens)popped3.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped4.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped5.get(0);
+        PAst pAstNode9 = (PAst)popped6.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, null, pStatesNode5, pTokensNode6, pIgnTokensNode7, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped6);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList6);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new126() /* reduce AAgrammar127Grammar */
     {
-        List<?> nodeArrayList6 = pop();
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PHelpers phelpersNode3 = (PHelpers)nodeArrayList1.get(0);
-        PStates pstatesNode4 = (PStates)nodeArrayList2.get(0);
-        PTokens ptokensNode5 = (PTokens)nodeArrayList3.get(0);
-        PIgnTokens pigntokensNode6 = (PIgnTokens)nodeArrayList4.get(0);
-        PProductions pproductionsNode7 = (PProductions)nodeArrayList5.get(0);
-        PAst pastNode8 = (PAst)nodeArrayList6.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(Collections.emptyList(), phelpersNode3, pstatesNode4, ptokensNode5, pigntokensNode6, pproductionsNode7, pastNode8);
+        List<?> popped6 = pop();
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PHelpers pHelpersNode3 = (PHelpers)popped1.get(0);
+        PStates pStatesNode4 = (PStates)popped2.get(0);
+        PTokens pTokensNode5 = (PTokens)popped3.get(0);
+        PIgnTokens pIgnTokensNode6 = (PIgnTokens)popped4.get(0);
+        PProductions pProductionsNode7 = (PProductions)popped5.get(0);
+        PAst pAstNode8 = (PAst)popped6.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(Collections.emptyList(), pHelpersNode3, pStatesNode4, pTokensNode5, pIgnTokensNode6, pProductionsNode7, pAstNode8);
+        computePositions(pGrammarNode1, popped1, popped6);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList6);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new127() /* reduce AAgrammar128Grammar */
     {
-        List<?> nodeArrayList7 = pop();
-        List<?> nodeArrayList6 = pop();
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList1.get(0);
+        List<?> popped7 = pop();
+        List<?> popped6 = pop();
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TPkgId> listNode2 = (List<TPkgId>)popped1.get(0);
         List<TPkgId> listNode3 = listNode2;
-        PHelpers phelpersNode4 = (PHelpers)nodeArrayList2.get(0);
-        PStates pstatesNode5 = (PStates)nodeArrayList3.get(0);
-        PTokens ptokensNode6 = (PTokens)nodeArrayList4.get(0);
-        PIgnTokens pigntokensNode7 = (PIgnTokens)nodeArrayList5.get(0);
-        PProductions pproductionsNode8 = (PProductions)nodeArrayList6.get(0);
-        PAst pastNode9 = (PAst)nodeArrayList7.get(0);
-        AGrammar pgrammarNode1 = new AGrammar(listNode3, phelpersNode4, pstatesNode5, ptokensNode6, pigntokensNode7, pproductionsNode8, pastNode9);
+        PHelpers pHelpersNode4 = (PHelpers)popped2.get(0);
+        PStates pStatesNode5 = (PStates)popped3.get(0);
+        PTokens pTokensNode6 = (PTokens)popped4.get(0);
+        PIgnTokens pIgnTokensNode7 = (PIgnTokens)popped5.get(0);
+        PProductions pProductionsNode8 = (PProductions)popped6.get(0);
+        PAst pAstNode9 = (PAst)popped7.get(0);
+        AGrammar pGrammarNode1 = new AGrammar(listNode3, pHelpersNode4, pStatesNode5, pTokensNode6, pIgnTokensNode7, pProductionsNode8, pAstNode9);
+        computePositions(pGrammarNode1, popped1, popped7);
 
-        checkResult(pgrammarNode1, nodeArrayList1, nodeArrayList7);
-        return Collections.singletonList(pgrammarNode1);
+        return Collections.singletonList(pGrammarNode1);
     }
 
     private List<?> new128() /* reduce APackage */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode1 = (List<TPkgId>)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<TPkgId> listNode1 = (List<TPkgId>)popped2.get(0);
         List<TPkgId> listNode2 = listNode1;
-        checkResult(listNode2, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new129() /* reduce AApkgname1PkgName */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TPkgId tpkgidNode1 = (TPkgId)nodeArrayList1.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        TPkgId tPkgIdNode1 = (TPkgId)popped1.get(0);
         List<TPkgId> listNode2;
-        if(tpkgidNode1 != null) {
-            listNode2 = Collections.singletonList(tpkgidNode1);
+        if(tPkgIdNode1 != null) {
+            listNode2 = Collections.singletonList(tPkgIdNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new130() /* reduce AApkgname2PkgName */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TPkgId tpkgidNode1 = (TPkgId)nodeArrayList1.get(0);
-        List<TPkgId> listNode2 = (List<TPkgId>)nodeArrayList2.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        TPkgId tPkgIdNode1 = (TPkgId)popped1.get(0);
+        List<TPkgId> listNode2 = (List<TPkgId>)popped2.get(0);
         List<TPkgId> listNode3 = new LinkedList<>();
-        if(tpkgidNode1 != null)
+        if(tPkgIdNode1 != null)
         {
-            listNode3.add(tpkgidNode1);
+            listNode3.add(tPkgIdNode1);
         }
         if (listNode3.isEmpty() && listNode2 instanceof LinkedList<?>) {
             listNode3 = listNode2;
         } else {
             listNode3.addAll(listNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList3);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new131() /* reduce APkgNameTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TPkgId tpkgidNode1 = (TPkgId)nodeArrayList2.get(0);
-        checkResult(tpkgidNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(tpkgidNode1);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        TPkgId tPkgIdNode1 = (TPkgId)popped2.get(0);
+        return Collections.singletonList(tPkgIdNode1);
     }
 
     private List<?> new132() /* reduce AHelpers */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PHelperDef> listNode2 = (List<PHelperDef>)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<PHelperDef> listNode2 = (List<PHelperDef>)popped2.get(0);
         List<PHelperDef> listNode3 = listNode2;
-        AHelpers phelpersNode1 = new AHelpers(listNode3);
+        AHelpers pHelpersNode1 = new AHelpers(listNode3);
+        computePositions(pHelpersNode1, popped1, popped2);
 
-        checkResult(phelpersNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(phelpersNode1);
+        return Collections.singletonList(pHelpersNode1);
     }
 
     private List<?> new133() /* reduce AHelperDef */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        PRegExp pregexpNode3 = (PRegExp)nodeArrayList3.get(0);
-        AHelperDef phelperdefNode1 = new AHelperDef(tidNode2, pregexpNode3);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(phelperdefNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(phelperdefNode1);
+        TId tIdNode2 = (TId)popped1.get(0);
+        PRegExp pRegExpNode3 = (PRegExp)popped3.get(0);
+        AHelperDef pHelperDefNode1 = new AHelperDef(tIdNode2, pRegExpNode3);
+        computePositions(pHelperDefNode1, popped1, popped4);
+
+        return Collections.singletonList(pHelperDefNode1);
     }
 
     private List<?> new134() /* reduce AStates */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TId> listNode2 = (List<TId>)nodeArrayList2.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TId> listNode2 = (List<TId>)popped2.get(0);
         List<TId> listNode3 = listNode2;
-        AStates pstatesNode1 = new AStates(listNode3);
+        AStates pStatesNode1 = new AStates(listNode3);
+        computePositions(pStatesNode1, popped1, popped3);
 
-        checkResult(pstatesNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pstatesNode1);
+        return Collections.singletonList(pStatesNode1);
     }
 
     private List<?> new135() /* reduce AAidlist1IdList */
     {
-        List<?> nodeArrayList1 = pop();
-        TId tidNode1 = (TId)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        TId tIdNode1 = (TId)popped1.get(0);
         List<TId> listNode2;
-        if(tidNode1 != null) {
-            listNode2 = Collections.singletonList(tidNode1);
+        if(tIdNode1 != null) {
+            listNode2 = Collections.singletonList(tIdNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new136() /* reduce AAidlist2IdList */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode1 = (TId)nodeArrayList1.get(0);
-        List<TId> listNode2 = (List<TId>)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        TId tIdNode1 = (TId)popped1.get(0);
+        List<TId> listNode2 = (List<TId>)popped2.get(0);
         List<TId> listNode3 = new LinkedList<>();
-        if(tidNode1 != null)
+        if(tIdNode1 != null)
         {
-            listNode3.add(tidNode1);
+            listNode3.add(tIdNode1);
         }
         if (listNode3.isEmpty() && listNode2 instanceof LinkedList<?>) {
             listNode3 = listNode2;
         } else {
             listNode3.addAll(listNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new137() /* reduce AIdListTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode1 = (TId)nodeArrayList2.get(0);
-        checkResult(tidNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(tidNode1);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        TId tIdNode1 = (TId)popped2.get(0);
+        return Collections.singletonList(tIdNode1);
     }
 
     private List<?> new138() /* reduce ATokens */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PTokenDef> listNode2 = (List<PTokenDef>)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<PTokenDef> listNode2 = (List<PTokenDef>)popped2.get(0);
         List<PTokenDef> listNode3 = listNode2;
-        ATokens ptokensNode1 = new ATokens(listNode3);
+        ATokens pTokensNode1 = new ATokens(listNode3);
+        computePositions(pTokensNode1, popped1, popped2);
 
-        checkResult(ptokensNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(ptokensNode1);
+        return Collections.singletonList(pTokensNode1);
     }
 
     private List<?> new139() /* reduce AAtokendef1TokenDef */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode3 = (TId)nodeArrayList1.get(0);
-        PRegExp pregexpNode4 = (PRegExp)nodeArrayList3.get(0);
-        ATokenDef ptokendefNode1 = new ATokenDef(null, tidNode3, pregexpNode4, null, null);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode3 = (TId)popped1.get(0);
+        PRegExp pRegExpNode4 = (PRegExp)popped3.get(0);
+        ATokenDef pTokenDefNode1 = new ATokenDef(null, tIdNode3, pRegExpNode4, null, null);
+        computePositions(pTokenDefNode1, popped1, popped4);
 
-        checkResult(ptokendefNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(ptokendefNode1);
+        return Collections.singletonList(pTokenDefNode1);
     }
 
     private List<?> new140() /* reduce AAtokendef2TokenDef */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStateList pstatelistNode2 = (PStateList)nodeArrayList1.get(0);
-        TId tidNode3 = (TId)nodeArrayList2.get(0);
-        PRegExp pregexpNode4 = (PRegExp)nodeArrayList4.get(0);
-        ATokenDef ptokendefNode1 = new ATokenDef(pstatelistNode2, tidNode3, pregexpNode4, null, null);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PStateList pStateListNode2 = (PStateList)popped1.get(0);
+        TId tIdNode3 = (TId)popped2.get(0);
+        PRegExp pRegExpNode4 = (PRegExp)popped4.get(0);
+        ATokenDef pTokenDefNode1 = new ATokenDef(pStateListNode2, tIdNode3, pRegExpNode4, null, null);
+        computePositions(pTokenDefNode1, popped1, popped5);
 
-        checkResult(ptokendefNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(ptokendefNode1);
+        return Collections.singletonList(pTokenDefNode1);
     }
 
     private List<?> new141() /* reduce AAtokendef3TokenDef */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode3 = (TId)nodeArrayList1.get(0);
-        PRegExp pregexpNode4 = (PRegExp)nodeArrayList3.get(0);
-        TSlash tslashNode5 = (TSlash)nodeArrayList4.get(0);
-        PRegExp pregexpNode6 = (PRegExp)nodeArrayList4.get(1);
-        ATokenDef ptokendefNode1 = new ATokenDef(null, tidNode3, pregexpNode4, tslashNode5, pregexpNode6);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(ptokendefNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(ptokendefNode1);
+        TId tIdNode3 = (TId)popped1.get(0);
+        PRegExp pRegExpNode4 = (PRegExp)popped3.get(0);
+        TSlash tSlashNode5 = (TSlash)popped4.get(0);
+        PRegExp pRegExpNode6 = (PRegExp)popped4.get(1);
+        ATokenDef pTokenDefNode1 = new ATokenDef(null, tIdNode3, pRegExpNode4, tSlashNode5, pRegExpNode6);
+        computePositions(pTokenDefNode1, popped1, popped5);
+
+        return Collections.singletonList(pTokenDefNode1);
     }
 
     private List<?> new142() /* reduce AAtokendef4TokenDef */
     {
-        List<?> nodeArrayList6 = pop();
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PStateList pstatelistNode2 = (PStateList)nodeArrayList1.get(0);
-        TId tidNode3 = (TId)nodeArrayList2.get(0);
-        PRegExp pregexpNode4 = (PRegExp)nodeArrayList4.get(0);
-        TSlash tslashNode5 = (TSlash)nodeArrayList5.get(0);
-        PRegExp pregexpNode6 = (PRegExp)nodeArrayList5.get(1);
-        ATokenDef ptokendefNode1 = new ATokenDef(pstatelistNode2, tidNode3, pregexpNode4, tslashNode5, pregexpNode6);
+        List<?> popped6 = pop();
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PStateList pStateListNode2 = (PStateList)popped1.get(0);
+        TId tIdNode3 = (TId)popped2.get(0);
+        PRegExp pRegExpNode4 = (PRegExp)popped4.get(0);
+        TSlash tSlashNode5 = (TSlash)popped5.get(0);
+        PRegExp pRegExpNode6 = (PRegExp)popped5.get(1);
+        ATokenDef pTokenDefNode1 = new ATokenDef(pStateListNode2, tIdNode3, pRegExpNode4, tSlashNode5, pRegExpNode6);
+        computePositions(pTokenDefNode1, popped1, popped6);
 
-        checkResult(ptokendefNode1, nodeArrayList1, nodeArrayList6);
-        return Collections.singletonList(ptokendefNode1);
+        return Collections.singletonList(pTokenDefNode1);
     }
 
     private List<?> new143() /* reduce AAstatelist1StateList */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList2.get(0);
-        AStateList pstatelistNode1 = new AStateList(tidNode2, null, Collections.emptyList());
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pstatelistNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pstatelistNode1);
+        TId tIdNode2 = (TId)popped2.get(0);
+        AStateList pStateListNode1 = new AStateList(tIdNode2, null, Collections.emptyList());
+        computePositions(pStateListNode1, popped1, popped3);
+
+        return Collections.singletonList(pStateListNode1);
     }
 
     private List<?> new144() /* reduce AAstatelist2StateList */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList2.get(0);
-        PTransition ptransitionNode3 = (PTransition)nodeArrayList3.get(0);
-        AStateList pstatelistNode1 = new AStateList(tidNode2, ptransitionNode3, Collections.emptyList());
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped2.get(0);
+        PTransition pTransitionNode3 = (PTransition)popped3.get(0);
+        AStateList pStateListNode1 = new AStateList(tIdNode2, pTransitionNode3, Collections.emptyList());
+        computePositions(pStateListNode1, popped1, popped4);
 
-        checkResult(pstatelistNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pstatelistNode1);
+        return Collections.singletonList(pStateListNode1);
     }
 
     private List<?> new145() /* reduce AAstatelist3StateList */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList2.get(0);
-        List<PStateListTail> listNode4 = (List<PStateListTail>)nodeArrayList3.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped2.get(0);
+        List<PStateListTail> listNode4 = (List<PStateListTail>)popped3.get(0);
         List<PStateListTail> listNode5 = listNode4;
-        AStateList pstatelistNode1 = new AStateList(tidNode2, null, listNode5);
+        AStateList pStateListNode1 = new AStateList(tIdNode2, null, listNode5);
+        computePositions(pStateListNode1, popped1, popped4);
 
-        checkResult(pstatelistNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pstatelistNode1);
+        return Collections.singletonList(pStateListNode1);
     }
 
     private List<?> new146() /* reduce AAstatelist4StateList */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList2.get(0);
-        PTransition ptransitionNode3 = (PTransition)nodeArrayList3.get(0);
-        List<PStateListTail> listNode4 = (List<PStateListTail>)nodeArrayList4.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped2.get(0);
+        PTransition pTransitionNode3 = (PTransition)popped3.get(0);
+        List<PStateListTail> listNode4 = (List<PStateListTail>)popped4.get(0);
         List<PStateListTail> listNode5 = listNode4;
-        AStateList pstatelistNode1 = new AStateList(tidNode2, ptransitionNode3, listNode5);
+        AStateList pStateListNode1 = new AStateList(tIdNode2, pTransitionNode3, listNode5);
+        computePositions(pStateListNode1, popped1, popped5);
 
-        checkResult(pstatelistNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pstatelistNode1);
+        return Collections.singletonList(pStateListNode1);
     }
 
     private List<?> new147() /* reduce AAstatelisttail1StateListTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList2.get(0);
-        AStateListTail pstatelisttailNode1 = new AStateListTail(tidNode2, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped2.get(0);
+        AStateListTail pStateListTailNode1 = new AStateListTail(tIdNode2, null);
+        computePositions(pStateListTailNode1, popped1, popped2);
 
-        checkResult(pstatelisttailNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pstatelisttailNode1);
+        return Collections.singletonList(pStateListTailNode1);
     }
 
     private List<?> new148() /* reduce AAstatelisttail2StateListTail */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList2.get(0);
-        PTransition ptransitionNode3 = (PTransition)nodeArrayList3.get(0);
-        AStateListTail pstatelisttailNode1 = new AStateListTail(tidNode2, ptransitionNode3);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pstatelisttailNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pstatelisttailNode1);
+        TId tIdNode2 = (TId)popped2.get(0);
+        PTransition pTransitionNode3 = (PTransition)popped3.get(0);
+        AStateListTail pStateListTailNode1 = new AStateListTail(tIdNode2, pTransitionNode3);
+        computePositions(pStateListTailNode1, popped1, popped3);
+
+        return Collections.singletonList(pStateListTailNode1);
     }
 
     private List<?> new149() /* reduce ATransition */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList2.get(0);
-        ATransition ptransitionNode1 = new ATransition(tidNode2);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped2.get(0);
+        ATransition pTransitionNode1 = new ATransition(tIdNode2);
+        computePositions(pTransitionNode1, popped1, popped2);
 
-        checkResult(ptransitionNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(ptransitionNode1);
+        return Collections.singletonList(pTransitionNode1);
     }
 
     private List<?> new150() /* reduce AAigntokens1IgnTokens */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        AIgnTokens pigntokensNode1 = new AIgnTokens(Collections.emptyList());
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pigntokensNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pigntokensNode1);
+        AIgnTokens pIgnTokensNode1 = new AIgnTokens(Collections.emptyList());
+        computePositions(pIgnTokensNode1, popped1, popped3);
+
+        return Collections.singletonList(pIgnTokensNode1);
     }
 
     private List<?> new151() /* reduce AAigntokens2IgnTokens */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TId> listNode2 = (List<TId>)nodeArrayList3.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<TId> listNode2 = (List<TId>)popped3.get(0);
         List<TId> listNode3 = listNode2;
-        AIgnTokens pigntokensNode1 = new AIgnTokens(listNode3);
+        AIgnTokens pIgnTokensNode1 = new AIgnTokens(listNode3);
+        computePositions(pIgnTokensNode1, popped1, popped4);
 
-        checkResult(pigntokensNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pigntokensNode1);
+        return Collections.singletonList(pIgnTokensNode1);
     }
 
     private List<?> new152() /* reduce ALookAhead */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TSlash tslashNode1 = (TSlash)nodeArrayList1.get(0);
-        PRegExp pregexpNode2 = (PRegExp)nodeArrayList2.get(0);
-        checkResult(tslashNode1, nodeArrayList1, nodeArrayList2);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        TSlash tSlashNode1 = (TSlash)popped1.get(0);
+        PRegExp pRegExpNode2 = (PRegExp)popped2.get(0);
         return Arrays.asList(new Object[] {
-            tslashNode1,
-            pregexpNode2,
+            tSlashNode1,
+            pRegExpNode2,
         });
     }
 
     private List<?> new153() /* reduce AAregexp1RegExp */
     {
-        List<?> nodeArrayList1 = pop();
-        PConcat pconcatNode2 = (PConcat)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+
+        PConcat pConcatNode2 = (PConcat)popped1.get(0);
         List<PConcat> listNode3;
-        if(pconcatNode2 != null) {
-            listNode3 = Collections.singletonList(pconcatNode2);
+        if(pConcatNode2 != null) {
+            listNode3 = Collections.singletonList(pConcatNode2);
         } else {
             listNode3 = Collections.emptyList();
         }
-        ARegExp pregexpNode1 = new ARegExp(listNode3);
+        ARegExp pRegExpNode1 = new ARegExp(listNode3);
+        computePositions(pRegExpNode1, popped1, popped1);
 
-        checkResult(pregexpNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pregexpNode1);
+        return Collections.singletonList(pRegExpNode1);
     }
 
     private List<?> new154() /* reduce AAregexp2RegExp */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PConcat pconcatNode2 = (PConcat)nodeArrayList1.get(0);
-        List<PConcat> listNode3 = (List<PConcat>)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PConcat pConcatNode2 = (PConcat)popped1.get(0);
+        List<PConcat> listNode3 = (List<PConcat>)popped2.get(0);
         List<PConcat> listNode4 = new LinkedList<>();
-        if(pconcatNode2 != null)
+        if(pConcatNode2 != null)
         {
-            listNode4.add(pconcatNode2);
+            listNode4.add(pConcatNode2);
         }
         if (listNode4.isEmpty() && listNode3 instanceof LinkedList<?>) {
             listNode4 = listNode3;
         } else {
             listNode4.addAll(listNode3);
         }
-        ARegExp pregexpNode1 = new ARegExp(listNode4);
+        ARegExp pRegExpNode1 = new ARegExp(listNode4);
+        computePositions(pRegExpNode1, popped1, popped2);
 
-        checkResult(pregexpNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pregexpNode1);
+        return Collections.singletonList(pRegExpNode1);
     }
 
     private List<?> new155() /* reduce ARegExpTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PConcat pconcatNode1 = (PConcat)nodeArrayList2.get(0);
-        checkResult(pconcatNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pconcatNode1);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        PConcat pConcatNode1 = (PConcat)popped2.get(0);
+        return Collections.singletonList(pConcatNode1);
     }
 
     private List<?> new156() /* reduce AAconcat1Concat */
     {
-        AConcat pconcatNode1 = new AConcat(Collections.emptyList());
 
-        return Collections.singletonList(pconcatNode1);
+        AConcat pConcatNode1 = new AConcat(Collections.emptyList());
+
+        return Collections.singletonList(pConcatNode1);
     }
 
     private List<?> new157() /* reduce AAconcat2Concat */
     {
-        List<?> nodeArrayList1 = pop();
-        List<PUnExp> listNode2 = (List<PUnExp>)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+
+        List<PUnExp> listNode2 = (List<PUnExp>)popped1.get(0);
         List<PUnExp> listNode3 = listNode2;
-        AConcat pconcatNode1 = new AConcat(listNode3);
+        AConcat pConcatNode1 = new AConcat(listNode3);
+        computePositions(pConcatNode1, popped1, popped1);
 
-        checkResult(pconcatNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pconcatNode1);
+        return Collections.singletonList(pConcatNode1);
     }
 
     private List<?> new158() /* reduce AAunexp1UnExp */
     {
-        List<?> nodeArrayList1 = pop();
-        PBasic pbasicNode2 = (PBasic)nodeArrayList1.get(0);
-        AUnExp punexpNode1 = new AUnExp(pbasicNode2, null);
+        List<?> popped1 = pop();
+
+        PBasic pBasicNode2 = (PBasic)popped1.get(0);
+        AUnExp pUnExpNode1 = new AUnExp(pBasicNode2, null);
+        computePositions(pUnExpNode1, popped1, popped1);
 
-        checkResult(punexpNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(punexpNode1);
+        return Collections.singletonList(pUnExpNode1);
     }
 
     private List<?> new159() /* reduce AAunexp2UnExp */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PBasic pbasicNode2 = (PBasic)nodeArrayList1.get(0);
-        PUnOp punopNode3 = (PUnOp)nodeArrayList2.get(0);
-        AUnExp punexpNode1 = new AUnExp(pbasicNode2, punopNode3);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(punexpNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(punexpNode1);
+        PBasic pBasicNode2 = (PBasic)popped1.get(0);
+        PUnOp pUnOpNode3 = (PUnOp)popped2.get(0);
+        AUnExp pUnExpNode1 = new AUnExp(pBasicNode2, pUnOpNode3);
+        computePositions(pUnExpNode1, popped1, popped2);
+
+        return Collections.singletonList(pUnExpNode1);
     }
 
     private List<?> new160() /* reduce ACharBasic */
     {
-        List<?> nodeArrayList1 = pop();
-        PChar pcharNode2 = (PChar)nodeArrayList1.get(0);
-        ACharBasic pbasicNode1 = new ACharBasic(pcharNode2);
+        List<?> popped1 = pop();
+
+        PChar pCharNode2 = (PChar)popped1.get(0);
+        ACharBasic pBasicNode1 = new ACharBasic(pCharNode2);
+        computePositions(pBasicNode1, popped1, popped1);
 
-        checkResult(pbasicNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pbasicNode1);
+        return Collections.singletonList(pBasicNode1);
     }
 
     private List<?> new161() /* reduce ASetBasic */
     {
-        List<?> nodeArrayList1 = pop();
-        PSet psetNode2 = (PSet)nodeArrayList1.get(0);
-        ASetBasic pbasicNode1 = new ASetBasic(psetNode2);
+        List<?> popped1 = pop();
 
-        checkResult(pbasicNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pbasicNode1);
+        PSet pSetNode2 = (PSet)popped1.get(0);
+        ASetBasic pBasicNode1 = new ASetBasic(pSetNode2);
+        computePositions(pBasicNode1, popped1, popped1);
+
+        return Collections.singletonList(pBasicNode1);
     }
 
     private List<?> new162() /* reduce AStringBasic */
     {
-        List<?> nodeArrayList1 = pop();
-        TString tstringNode2 = (TString)nodeArrayList1.get(0);
-        AStringBasic pbasicNode1 = new AStringBasic(tstringNode2);
+        List<?> popped1 = pop();
+
+        TString tStringNode2 = (TString)popped1.get(0);
+        AStringBasic pBasicNode1 = new AStringBasic(tStringNode2);
+        computePositions(pBasicNode1, popped1, popped1);
 
-        checkResult(pbasicNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pbasicNode1);
+        return Collections.singletonList(pBasicNode1);
     }
 
     private List<?> new163() /* reduce AIdBasic */
     {
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        AIdBasic pbasicNode1 = new AIdBasic(tidNode2);
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped1.get(0);
+        AIdBasic pBasicNode1 = new AIdBasic(tIdNode2);
+        computePositions(pBasicNode1, popped1, popped1);
 
-        checkResult(pbasicNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pbasicNode1);
+        return Collections.singletonList(pBasicNode1);
     }
 
     private List<?> new164() /* reduce ARegExpBasic */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PRegExp pregexpNode2 = (PRegExp)nodeArrayList2.get(0);
-        ARegExpBasic pbasicNode1 = new ARegExpBasic(pregexpNode2);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pbasicNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pbasicNode1);
+        PRegExp pRegExpNode2 = (PRegExp)popped2.get(0);
+        ARegExpBasic pBasicNode1 = new ARegExpBasic(pRegExpNode2);
+        computePositions(pBasicNode1, popped1, popped3);
+
+        return Collections.singletonList(pBasicNode1);
     }
 
     private List<?> new165() /* reduce ACharChar */
     {
-        List<?> nodeArrayList1 = pop();
-        TChar tcharNode2 = (TChar)nodeArrayList1.get(0);
-        ACharChar pcharNode1 = new ACharChar(tcharNode2);
+        List<?> popped1 = pop();
+
+        TChar tCharNode2 = (TChar)popped1.get(0);
+        ACharChar pCharNode1 = new ACharChar(tCharNode2);
+        computePositions(pCharNode1, popped1, popped1);
 
-        checkResult(pcharNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pcharNode1);
+        return Collections.singletonList(pCharNode1);
     }
 
     private List<?> new166() /* reduce ADecChar */
     {
-        List<?> nodeArrayList1 = pop();
-        TDecChar tdeccharNode2 = (TDecChar)nodeArrayList1.get(0);
-        ADecChar pcharNode1 = new ADecChar(tdeccharNode2);
+        List<?> popped1 = pop();
 
-        checkResult(pcharNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pcharNode1);
+        TDecChar tDecCharNode2 = (TDecChar)popped1.get(0);
+        ADecChar pCharNode1 = new ADecChar(tDecCharNode2);
+        computePositions(pCharNode1, popped1, popped1);
+
+        return Collections.singletonList(pCharNode1);
     }
 
     private List<?> new167() /* reduce AHexChar */
     {
-        List<?> nodeArrayList1 = pop();
-        THexChar thexcharNode2 = (THexChar)nodeArrayList1.get(0);
-        AHexChar pcharNode1 = new AHexChar(thexcharNode2);
+        List<?> popped1 = pop();
+
+        THexChar tHexCharNode2 = (THexChar)popped1.get(0);
+        AHexChar pCharNode1 = new AHexChar(tHexCharNode2);
+        computePositions(pCharNode1, popped1, popped1);
 
-        checkResult(pcharNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pcharNode1);
+        return Collections.singletonList(pCharNode1);
     }
 
     private List<?> new168() /* reduce AOperationSet */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PBasic pbasicNode2 = (PBasic)nodeArrayList2.get(0);
-        PBinOp pbinopNode3 = (PBinOp)nodeArrayList3.get(0);
-        PBasic pbasicNode4 = (PBasic)nodeArrayList4.get(0);
-        AOperationSet psetNode1 = new AOperationSet(pbasicNode2, pbinopNode3, pbasicNode4);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(psetNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(psetNode1);
+        PBasic pBasicNode2 = (PBasic)popped2.get(0);
+        PBinOp pBinOpNode3 = (PBinOp)popped3.get(0);
+        PBasic pBasicNode4 = (PBasic)popped4.get(0);
+        AOperationSet pSetNode1 = new AOperationSet(pBasicNode2, pBinOpNode3, pBasicNode4);
+        computePositions(pSetNode1, popped1, popped5);
+
+        return Collections.singletonList(pSetNode1);
     }
 
     private List<?> new169() /* reduce AIntervalSet */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PChar pcharNode2 = (PChar)nodeArrayList2.get(0);
-        PChar pcharNode3 = (PChar)nodeArrayList4.get(0);
-        AIntervalSet psetNode1 = new AIntervalSet(pcharNode2, pcharNode3);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PChar pCharNode2 = (PChar)popped2.get(0);
+        PChar pCharNode3 = (PChar)popped4.get(0);
+        AIntervalSet pSetNode1 = new AIntervalSet(pCharNode2, pCharNode3);
+        computePositions(pSetNode1, popped1, popped5);
 
-        checkResult(psetNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(psetNode1);
+        return Collections.singletonList(pSetNode1);
     }
 
     private List<?> new170() /* reduce AStarUnOp */
     {
-        List<?> nodeArrayList1 = pop();
-        TStar tstarNode2 = (TStar)nodeArrayList1.get(0);
-        AStarUnOp punopNode1 = new AStarUnOp(tstarNode2);
+        List<?> popped1 = pop();
 
-        checkResult(punopNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(punopNode1);
+        TStar tStarNode2 = (TStar)popped1.get(0);
+        AStarUnOp pUnOpNode1 = new AStarUnOp(tStarNode2);
+        computePositions(pUnOpNode1, popped1, popped1);
+
+        return Collections.singletonList(pUnOpNode1);
     }
 
     private List<?> new171() /* reduce AQMarkUnOp */
     {
-        List<?> nodeArrayList1 = pop();
-        TQMark tqmarkNode2 = (TQMark)nodeArrayList1.get(0);
-        AQMarkUnOp punopNode1 = new AQMarkUnOp(tqmarkNode2);
+        List<?> popped1 = pop();
+
+        TQMark tQMarkNode2 = (TQMark)popped1.get(0);
+        AQMarkUnOp pUnOpNode1 = new AQMarkUnOp(tQMarkNode2);
+        computePositions(pUnOpNode1, popped1, popped1);
 
-        checkResult(punopNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(punopNode1);
+        return Collections.singletonList(pUnOpNode1);
     }
 
     private List<?> new172() /* reduce APlusUnOp */
     {
-        List<?> nodeArrayList1 = pop();
-        TPlus tplusNode2 = (TPlus)nodeArrayList1.get(0);
-        APlusUnOp punopNode1 = new APlusUnOp(tplusNode2);
+        List<?> popped1 = pop();
 
-        checkResult(punopNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(punopNode1);
+        TPlus tPlusNode2 = (TPlus)popped1.get(0);
+        APlusUnOp pUnOpNode1 = new APlusUnOp(tPlusNode2);
+        computePositions(pUnOpNode1, popped1, popped1);
+
+        return Collections.singletonList(pUnOpNode1);
     }
 
     private List<?> new173() /* reduce APlusBinOp */
     {
-        List<?> nodeArrayList1 = pop();
-        APlusBinOp pbinopNode1 = new APlusBinOp();
+        List<?> popped1 = pop();
+
+        APlusBinOp pBinOpNode1 = new APlusBinOp();
+        computePositions(pBinOpNode1, popped1, popped1);
 
-        checkResult(pbinopNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pbinopNode1);
+        return Collections.singletonList(pBinOpNode1);
     }
 
     private List<?> new174() /* reduce AMinusBinOp */
     {
-        List<?> nodeArrayList1 = pop();
-        AMinusBinOp pbinopNode1 = new AMinusBinOp();
+        List<?> popped1 = pop();
 
-        checkResult(pbinopNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pbinopNode1);
+        AMinusBinOp pBinOpNode1 = new AMinusBinOp();
+        computePositions(pBinOpNode1, popped1, popped1);
+
+        return Collections.singletonList(pBinOpNode1);
     }
 
     private List<?> new175() /* reduce AProductions */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PProd> listNode2 = (List<PProd>)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<PProd> listNode2 = (List<PProd>)popped2.get(0);
         List<PProd> listNode3 = listNode2;
-        AProductions pproductionsNode1 = new AProductions(listNode3);
+        AProductions pProductionsNode1 = new AProductions(listNode3);
+        computePositions(pProductionsNode1, popped1, popped2);
 
-        checkResult(pproductionsNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pproductionsNode1);
+        return Collections.singletonList(pProductionsNode1);
     }
 
     private List<?> new176() /* reduce AAprod1Prod */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        List<PAlt> listNode5 = (List<PAlt>)nodeArrayList3.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped1.get(0);
+        List<PAlt> listNode5 = (List<PAlt>)popped3.get(0);
         List<PAlt> listNode6 = listNode5;
-        AProd pprodNode1 = new AProd(tidNode2, null, Collections.emptyList(), listNode6);
+        AProd pProdNode1 = new AProd(tIdNode2, null, Collections.emptyList(), listNode6);
+        computePositions(pProdNode1, popped1, popped4);
 
-        checkResult(pprodNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pprodNode1);
+        return Collections.singletonList(pProdNode1);
     }
 
     private List<?> new177() /* reduce AAprod2Prod */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        TArrow tarrowNode3 = (TArrow)nodeArrayList2.get(0);
-        List<PElem> listNode4 = (List<PElem>)nodeArrayList2.get(1);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped1.get(0);
+        TArrow tArrowNode3 = (TArrow)popped2.get(0);
+        List<PElem> listNode4 = (List<PElem>)popped2.get(1);
         List<PElem> listNode5 = listNode4;
-        List<PAlt> listNode6 = (List<PAlt>)nodeArrayList4.get(0);
+        List<PAlt> listNode6 = (List<PAlt>)popped4.get(0);
         List<PAlt> listNode7 = listNode6;
-        AProd pprodNode1 = new AProd(tidNode2, tarrowNode3, listNode5, listNode7);
+        AProd pProdNode1 = new AProd(tIdNode2, tArrowNode3, listNode5, listNode7);
+        computePositions(pProdNode1, popped1, popped5);
 
-        checkResult(pprodNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(pprodNode1);
+        return Collections.singletonList(pProdNode1);
     }
 
     private List<?> new178() /* reduce AAprodtransform1ProdTransform */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TArrow tarrowNode1 = (TArrow)nodeArrayList2.get(0);
-        checkResult(tarrowNode1, nodeArrayList1, nodeArrayList3);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        TArrow tArrowNode1 = (TArrow)popped2.get(0);
         return Arrays.asList(new Object[] {
-            tarrowNode1,
+            tArrowNode1,
             Collections.emptyList(),
         });
     }
 
     private List<?> new179() /* reduce AAprodtransform2ProdTransform */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TArrow tarrowNode1 = (TArrow)nodeArrayList2.get(0);
-        List<PElem> listNode2 = (List<PElem>)nodeArrayList3.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        TArrow tArrowNode1 = (TArrow)popped2.get(0);
+        List<PElem> listNode2 = (List<PElem>)popped3.get(0);
         List<PElem> listNode3 = listNode2;
-        checkResult(tarrowNode1, nodeArrayList1, nodeArrayList4);
         return Arrays.asList(new Object[] {
-            tarrowNode1,
+            tArrowNode1,
             listNode3,
         });
     }
 
     private List<?> new180() /* reduce AAalts1Alts */
     {
-        List<?> nodeArrayList1 = pop();
-        PAlt paltNode1 = (PAlt)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PAlt pAltNode1 = (PAlt)popped1.get(0);
         List<PAlt> listNode2;
-        if(paltNode1 != null) {
-            listNode2 = Collections.singletonList(paltNode1);
+        if(pAltNode1 != null) {
+            listNode2 = Collections.singletonList(pAltNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new181() /* reduce AAalts2Alts */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PAlt paltNode1 = (PAlt)nodeArrayList1.get(0);
-        List<PAlt> listNode2 = (List<PAlt>)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        PAlt pAltNode1 = (PAlt)popped1.get(0);
+        List<PAlt> listNode2 = (List<PAlt>)popped2.get(0);
         List<PAlt> listNode3 = new LinkedList<>();
-        if(paltNode1 != null)
+        if(pAltNode1 != null)
         {
-            listNode3.add(paltNode1);
+            listNode3.add(pAltNode1);
         }
         if (listNode3.isEmpty() && listNode2 instanceof LinkedList<?>) {
             listNode3 = listNode2;
         } else {
             listNode3.addAll(listNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new182() /* reduce AAltsTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PAlt paltNode1 = (PAlt)nodeArrayList2.get(0);
-        checkResult(paltNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(paltNode1);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        PAlt pAltNode1 = (PAlt)popped2.get(0);
+        return Collections.singletonList(pAltNode1);
     }
 
     private List<?> new183() /* reduce AAalt1Alt */
     {
-        AAlt paltNode1 = new AAlt(null, Collections.emptyList(), null);
 
-        return Collections.singletonList(paltNode1);
+        AAlt pAltNode1 = new AAlt(null, Collections.emptyList(), null);
+
+        return Collections.singletonList(pAltNode1);
     }
 
     private List<?> new184() /* reduce AAalt2Alt */
     {
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        AAlt paltNode1 = new AAlt(tidNode2, Collections.emptyList(), null);
+        List<?> popped1 = pop();
 
-        checkResult(paltNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(paltNode1);
+        TId tIdNode2 = (TId)popped1.get(0);
+        AAlt pAltNode1 = new AAlt(tIdNode2, Collections.emptyList(), null);
+        computePositions(pAltNode1, popped1, popped1);
+
+        return Collections.singletonList(pAltNode1);
     }
 
     private List<?> new185() /* reduce AAalt3Alt */
     {
-        List<?> nodeArrayList1 = pop();
-        List<PElem> listNode3 = (List<PElem>)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+
+        List<PElem> listNode3 = (List<PElem>)popped1.get(0);
         List<PElem> listNode4 = listNode3;
-        AAlt paltNode1 = new AAlt(null, listNode4, null);
+        AAlt pAltNode1 = new AAlt(null, listNode4, null);
+        computePositions(pAltNode1, popped1, popped1);
 
-        checkResult(paltNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(paltNode1);
+        return Collections.singletonList(pAltNode1);
     }
 
     private List<?> new186() /* reduce AAalt4Alt */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        List<PElem> listNode3 = (List<PElem>)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped1.get(0);
+        List<PElem> listNode3 = (List<PElem>)popped2.get(0);
         List<PElem> listNode4 = listNode3;
-        AAlt paltNode1 = new AAlt(tidNode2, listNode4, null);
+        AAlt pAltNode1 = new AAlt(tIdNode2, listNode4, null);
+        computePositions(pAltNode1, popped1, popped2);
 
-        checkResult(paltNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(paltNode1);
+        return Collections.singletonList(pAltNode1);
     }
 
     private List<?> new187() /* reduce AAalt5Alt */
     {
-        List<?> nodeArrayList1 = pop();
-        PAltTransform palttransformNode4 = (PAltTransform)nodeArrayList1.get(0);
-        AAlt paltNode1 = new AAlt(null, Collections.emptyList(), palttransformNode4);
+        List<?> popped1 = pop();
+
+        PAltTransform pAltTransformNode4 = (PAltTransform)popped1.get(0);
+        AAlt pAltNode1 = new AAlt(null, Collections.emptyList(), pAltTransformNode4);
+        computePositions(pAltNode1, popped1, popped1);
 
-        checkResult(paltNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(paltNode1);
+        return Collections.singletonList(pAltNode1);
     }
 
     private List<?> new188() /* reduce AAalt6Alt */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        PAltTransform palttransformNode4 = (PAltTransform)nodeArrayList2.get(0);
-        AAlt paltNode1 = new AAlt(tidNode2, Collections.emptyList(), palttransformNode4);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(paltNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(paltNode1);
+        TId tIdNode2 = (TId)popped1.get(0);
+        PAltTransform pAltTransformNode4 = (PAltTransform)popped2.get(0);
+        AAlt pAltNode1 = new AAlt(tIdNode2, Collections.emptyList(), pAltTransformNode4);
+        computePositions(pAltNode1, popped1, popped2);
+
+        return Collections.singletonList(pAltNode1);
     }
 
     private List<?> new189() /* reduce AAalt7Alt */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PElem> listNode3 = (List<PElem>)nodeArrayList1.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<PElem> listNode3 = (List<PElem>)popped1.get(0);
         List<PElem> listNode4 = listNode3;
-        PAltTransform palttransformNode5 = (PAltTransform)nodeArrayList2.get(0);
-        AAlt paltNode1 = new AAlt(null, listNode4, palttransformNode5);
+        PAltTransform pAltTransformNode5 = (PAltTransform)popped2.get(0);
+        AAlt pAltNode1 = new AAlt(null, listNode4, pAltTransformNode5);
+        computePositions(pAltNode1, popped1, popped2);
 
-        checkResult(paltNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(paltNode1);
+        return Collections.singletonList(pAltNode1);
     }
 
     private List<?> new190() /* reduce AAalt8Alt */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        List<PElem> listNode3 = (List<PElem>)nodeArrayList2.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped1.get(0);
+        List<PElem> listNode3 = (List<PElem>)popped2.get(0);
         List<PElem> listNode4 = listNode3;
-        PAltTransform palttransformNode5 = (PAltTransform)nodeArrayList3.get(0);
-        AAlt paltNode1 = new AAlt(tidNode2, listNode4, palttransformNode5);
+        PAltTransform pAltTransformNode5 = (PAltTransform)popped3.get(0);
+        AAlt pAltNode1 = new AAlt(tIdNode2, listNode4, pAltTransformNode5);
+        computePositions(pAltNode1, popped1, popped3);
 
-        checkResult(paltNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(paltNode1);
+        return Collections.singletonList(pAltNode1);
     }
 
     private List<?> new191() /* reduce AAalttransform1AltTransform */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TLBrace tlbraceNode2 = (TLBrace)nodeArrayList1.get(0);
-        TRBrace trbraceNode4 = (TRBrace)nodeArrayList3.get(0);
-        AAltTransform palttransformNode1 = new AAltTransform(tlbraceNode2, Collections.emptyList(), trbraceNode4);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(palttransformNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(palttransformNode1);
+        TLBrace tLBraceNode2 = (TLBrace)popped1.get(0);
+        TRBrace tRBraceNode4 = (TRBrace)popped3.get(0);
+        AAltTransform pAltTransformNode1 = new AAltTransform(tLBraceNode2, Collections.emptyList(), tRBraceNode4);
+        computePositions(pAltTransformNode1, popped1, popped3);
+
+        return Collections.singletonList(pAltTransformNode1);
     }
 
     private List<?> new192() /* reduce AAalttransform2AltTransform */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TLBrace tlbraceNode2 = (TLBrace)nodeArrayList1.get(0);
-        List<PTerm> listNode3 = (List<PTerm>)nodeArrayList3.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TLBrace tLBraceNode2 = (TLBrace)popped1.get(0);
+        List<PTerm> listNode3 = (List<PTerm>)popped3.get(0);
         List<PTerm> listNode4 = listNode3;
-        TRBrace trbraceNode5 = (TRBrace)nodeArrayList4.get(0);
-        AAltTransform palttransformNode1 = new AAltTransform(tlbraceNode2, listNode4, trbraceNode5);
+        TRBrace tRBraceNode5 = (TRBrace)popped4.get(0);
+        AAltTransform pAltTransformNode1 = new AAltTransform(tLBraceNode2, listNode4, tRBraceNode5);
+        computePositions(pAltTransformNode1, popped1, popped4);
 
-        checkResult(palttransformNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(palttransformNode1);
+        return Collections.singletonList(pAltTransformNode1);
     }
 
     private List<?> new193() /* reduce AAnewterm1Term */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PProdName pprodnameNode2 = (PProdName)nodeArrayList2.get(0);
-        TLPar tlparNode3 = (TLPar)nodeArrayList3.get(0);
-        ANewTerm ptermNode1 = new ANewTerm(pprodnameNode2, tlparNode3, Collections.emptyList());
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(ptermNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(ptermNode1);
+        PProdName pProdNameNode2 = (PProdName)popped2.get(0);
+        TLPar tLParNode3 = (TLPar)popped3.get(0);
+        ANewTerm pTermNode1 = new ANewTerm(pProdNameNode2, tLParNode3, Collections.emptyList());
+        computePositions(pTermNode1, popped1, popped4);
+
+        return Collections.singletonList(pTermNode1);
     }
 
     private List<?> new194() /* reduce AAnewterm2Term */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PProdName pprodnameNode2 = (PProdName)nodeArrayList2.get(0);
-        TLPar tlparNode3 = (TLPar)nodeArrayList3.get(0);
-        List<PTerm> listNode4 = (List<PTerm>)nodeArrayList4.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PProdName pProdNameNode2 = (PProdName)popped2.get(0);
+        TLPar tLParNode3 = (TLPar)popped3.get(0);
+        List<PTerm> listNode4 = (List<PTerm>)popped4.get(0);
         List<PTerm> listNode5 = listNode4;
-        ANewTerm ptermNode1 = new ANewTerm(pprodnameNode2, tlparNode3, listNode5);
+        ANewTerm pTermNode1 = new ANewTerm(pProdNameNode2, tLParNode3, listNode5);
+        computePositions(pTermNode1, popped1, popped5);
 
-        checkResult(ptermNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(ptermNode1);
+        return Collections.singletonList(pTermNode1);
     }
 
     private List<?> new195() /* reduce AAlistterm1Term */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TLBkt tlbktNode2 = (TLBkt)nodeArrayList1.get(0);
-        AListTerm ptermNode1 = new AListTerm(tlbktNode2, Collections.emptyList());
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(ptermNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(ptermNode1);
+        TLBkt tLBktNode2 = (TLBkt)popped1.get(0);
+        AListTerm pTermNode1 = new AListTerm(tLBktNode2, Collections.emptyList());
+        computePositions(pTermNode1, popped1, popped2);
+
+        return Collections.singletonList(pTermNode1);
     }
 
     private List<?> new196() /* reduce AAlistterm2Term */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TLBkt tlbktNode2 = (TLBkt)nodeArrayList1.get(0);
-        List<PListTerm> listNode3 = (List<PListTerm>)nodeArrayList2.get(0);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TLBkt tLBktNode2 = (TLBkt)popped1.get(0);
+        List<PListTerm> listNode3 = (List<PListTerm>)popped2.get(0);
         List<PListTerm> listNode4 = listNode3;
-        AListTerm ptermNode1 = new AListTerm(tlbktNode2, listNode4);
+        AListTerm pTermNode1 = new AListTerm(tLBktNode2, listNode4);
+        computePositions(pTermNode1, popped1, popped3);
 
-        checkResult(ptermNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(ptermNode1);
+        return Collections.singletonList(pTermNode1);
     }
 
     private List<?> new197() /* reduce AAsimpleterm1Term */
     {
-        List<?> nodeArrayList1 = pop();
-        TId tidNode3 = (TId)nodeArrayList1.get(0);
-        ASimpleTerm ptermNode1 = new ASimpleTerm(null, tidNode3, null);
+        List<?> popped1 = pop();
+
+        TId tIdNode3 = (TId)popped1.get(0);
+        ASimpleTerm pTermNode1 = new ASimpleTerm(null, tIdNode3, null);
+        computePositions(pTermNode1, popped1, popped1);
 
-        checkResult(ptermNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(ptermNode1);
+        return Collections.singletonList(pTermNode1);
     }
 
     private List<?> new198() /* reduce AAsimpleterm2Term */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PSpecifier pspecifierNode2 = (PSpecifier)nodeArrayList1.get(0);
-        TId tidNode3 = (TId)nodeArrayList2.get(0);
-        ASimpleTerm ptermNode1 = new ASimpleTerm(pspecifierNode2, tidNode3, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(ptermNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(ptermNode1);
+        PSpecifier pSpecifierNode2 = (PSpecifier)popped1.get(0);
+        TId tIdNode3 = (TId)popped2.get(0);
+        ASimpleTerm pTermNode1 = new ASimpleTerm(pSpecifierNode2, tIdNode3, null);
+        computePositions(pTermNode1, popped1, popped2);
+
+        return Collections.singletonList(pTermNode1);
     }
 
     private List<?> new199() /* reduce AAsimpleterm3Term */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode3 = (TId)nodeArrayList1.get(0);
-        TId tidNode4 = (TId)nodeArrayList2.get(0);
-        ASimpleTerm ptermNode1 = new ASimpleTerm(null, tidNode3, tidNode4);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode3 = (TId)popped1.get(0);
+        TId tIdNode4 = (TId)popped2.get(0);
+        ASimpleTerm pTermNode1 = new ASimpleTerm(null, tIdNode3, tIdNode4);
+        computePositions(pTermNode1, popped1, popped2);
 
-        checkResult(ptermNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(ptermNode1);
+        return Collections.singletonList(pTermNode1);
     }
 
     private List<?> new200() /* reduce AAsimpleterm4Term */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PSpecifier pspecifierNode2 = (PSpecifier)nodeArrayList1.get(0);
-        TId tidNode3 = (TId)nodeArrayList2.get(0);
-        TId tidNode4 = (TId)nodeArrayList3.get(0);
-        ASimpleTerm ptermNode1 = new ASimpleTerm(pspecifierNode2, tidNode3, tidNode4);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(ptermNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(ptermNode1);
+        PSpecifier pSpecifierNode2 = (PSpecifier)popped1.get(0);
+        TId tIdNode3 = (TId)popped2.get(0);
+        TId tIdNode4 = (TId)popped3.get(0);
+        ASimpleTerm pTermNode1 = new ASimpleTerm(pSpecifierNode2, tIdNode3, tIdNode4);
+        computePositions(pTermNode1, popped1, popped3);
+
+        return Collections.singletonList(pTermNode1);
     }
 
     private List<?> new201() /* reduce ANullTerm */
     {
-        List<?> nodeArrayList1 = pop();
-        ANullTerm ptermNode1 = new ANullTerm();
+        List<?> popped1 = pop();
+
+        ANullTerm pTermNode1 = new ANullTerm();
+        computePositions(pTermNode1, popped1, popped1);
 
-        checkResult(ptermNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(ptermNode1);
+        return Collections.singletonList(pTermNode1);
     }
 
     private List<?> new202() /* reduce AAlistoflistterm1ListOfListTerm */
     {
-        List<?> nodeArrayList1 = pop();
-        PListTerm plisttermNode1 = (PListTerm)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PListTerm pListTermNode1 = (PListTerm)popped1.get(0);
         List<PListTerm> listNode2;
-        if(plisttermNode1 != null) {
-            listNode2 = Collections.singletonList(plisttermNode1);
+        if(pListTermNode1 != null) {
+            listNode2 = Collections.singletonList(pListTermNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new203() /* reduce AAlistoflistterm2ListOfListTerm */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PListTerm plisttermNode1 = (PListTerm)nodeArrayList1.get(0);
-        List<PListTerm> listNode2 = (List<PListTerm>)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        PListTerm pListTermNode1 = (PListTerm)popped1.get(0);
+        List<PListTerm> listNode2 = (List<PListTerm>)popped2.get(0);
         List<PListTerm> listNode3 = new LinkedList<>();
-        if(plisttermNode1 != null)
+        if(pListTermNode1 != null)
         {
-            listNode3.add(plisttermNode1);
+            listNode3.add(pListTermNode1);
         }
         if (listNode3.isEmpty() && listNode2 instanceof LinkedList<?>) {
             listNode3 = listNode2;
         } else {
             listNode3.addAll(listNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new204() /* reduce AAnewlistterm1ListTerm */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PProdName pprodnameNode2 = (PProdName)nodeArrayList2.get(0);
-        TLPar tlparNode3 = (TLPar)nodeArrayList3.get(0);
-        ANewListTerm plisttermNode1 = new ANewListTerm(pprodnameNode2, tlparNode3, Collections.emptyList());
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(plisttermNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(plisttermNode1);
+        PProdName pProdNameNode2 = (PProdName)popped2.get(0);
+        TLPar tLParNode3 = (TLPar)popped3.get(0);
+        ANewListTerm pListTermNode1 = new ANewListTerm(pProdNameNode2, tLParNode3, Collections.emptyList());
+        computePositions(pListTermNode1, popped1, popped4);
+
+        return Collections.singletonList(pListTermNode1);
     }
 
     private List<?> new205() /* reduce AAnewlistterm2ListTerm */
     {
-        List<?> nodeArrayList5 = pop();
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PProdName pprodnameNode2 = (PProdName)nodeArrayList2.get(0);
-        TLPar tlparNode3 = (TLPar)nodeArrayList3.get(0);
-        List<PTerm> listNode4 = (List<PTerm>)nodeArrayList4.get(0);
+        List<?> popped5 = pop();
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        PProdName pProdNameNode2 = (PProdName)popped2.get(0);
+        TLPar tLParNode3 = (TLPar)popped3.get(0);
+        List<PTerm> listNode4 = (List<PTerm>)popped4.get(0);
         List<PTerm> listNode5 = listNode4;
-        ANewListTerm plisttermNode1 = new ANewListTerm(pprodnameNode2, tlparNode3, listNode5);
+        ANewListTerm pListTermNode1 = new ANewListTerm(pProdNameNode2, tLParNode3, listNode5);
+        computePositions(pListTermNode1, popped1, popped5);
 
-        checkResult(plisttermNode1, nodeArrayList1, nodeArrayList5);
-        return Collections.singletonList(plisttermNode1);
+        return Collections.singletonList(pListTermNode1);
     }
 
     private List<?> new206() /* reduce AAsimplelistterm1ListTerm */
     {
-        List<?> nodeArrayList1 = pop();
-        TId tidNode3 = (TId)nodeArrayList1.get(0);
-        ASimpleListTerm plisttermNode1 = new ASimpleListTerm(null, tidNode3, null);
+        List<?> popped1 = pop();
+
+        TId tIdNode3 = (TId)popped1.get(0);
+        ASimpleListTerm pListTermNode1 = new ASimpleListTerm(null, tIdNode3, null);
+        computePositions(pListTermNode1, popped1, popped1);
 
-        checkResult(plisttermNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(plisttermNode1);
+        return Collections.singletonList(pListTermNode1);
     }
 
     private List<?> new207() /* reduce AAsimplelistterm2ListTerm */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PSpecifier pspecifierNode2 = (PSpecifier)nodeArrayList1.get(0);
-        TId tidNode3 = (TId)nodeArrayList2.get(0);
-        ASimpleListTerm plisttermNode1 = new ASimpleListTerm(pspecifierNode2, tidNode3, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(plisttermNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(plisttermNode1);
+        PSpecifier pSpecifierNode2 = (PSpecifier)popped1.get(0);
+        TId tIdNode3 = (TId)popped2.get(0);
+        ASimpleListTerm pListTermNode1 = new ASimpleListTerm(pSpecifierNode2, tIdNode3, null);
+        computePositions(pListTermNode1, popped1, popped2);
+
+        return Collections.singletonList(pListTermNode1);
     }
 
     private List<?> new208() /* reduce AAsimplelistterm3ListTerm */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode3 = (TId)nodeArrayList1.get(0);
-        TId tidNode4 = (TId)nodeArrayList2.get(0);
-        ASimpleListTerm plisttermNode1 = new ASimpleListTerm(null, tidNode3, tidNode4);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode3 = (TId)popped1.get(0);
+        TId tIdNode4 = (TId)popped2.get(0);
+        ASimpleListTerm pListTermNode1 = new ASimpleListTerm(null, tIdNode3, tIdNode4);
+        computePositions(pListTermNode1, popped1, popped2);
 
-        checkResult(plisttermNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(plisttermNode1);
+        return Collections.singletonList(pListTermNode1);
     }
 
     private List<?> new209() /* reduce AAsimplelistterm4ListTerm */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PSpecifier pspecifierNode2 = (PSpecifier)nodeArrayList1.get(0);
-        TId tidNode3 = (TId)nodeArrayList2.get(0);
-        TId tidNode4 = (TId)nodeArrayList3.get(0);
-        ASimpleListTerm plisttermNode1 = new ASimpleListTerm(pspecifierNode2, tidNode3, tidNode4);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(plisttermNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(plisttermNode1);
+        PSpecifier pSpecifierNode2 = (PSpecifier)popped1.get(0);
+        TId tIdNode3 = (TId)popped2.get(0);
+        TId tIdNode4 = (TId)popped3.get(0);
+        ASimpleListTerm pListTermNode1 = new ASimpleListTerm(pSpecifierNode2, tIdNode3, tIdNode4);
+        computePositions(pListTermNode1, popped1, popped3);
+
+        return Collections.singletonList(pListTermNode1);
     }
 
     private List<?> new210() /* reduce AListTermTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PListTerm plisttermNode1 = (PListTerm)nodeArrayList2.get(0);
-        checkResult(plisttermNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(plisttermNode1);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        PListTerm pListTermNode1 = (PListTerm)popped2.get(0);
+        return Collections.singletonList(pListTermNode1);
     }
 
     private List<?> new211() /* reduce ASimpleTermTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode1 = (TId)nodeArrayList2.get(0);
-        checkResult(tidNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(tidNode1);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        TId tIdNode1 = (TId)popped2.get(0);
+        return Collections.singletonList(tIdNode1);
     }
 
     private List<?> new212() /* reduce AAprodname1ProdName */
     {
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        AProdName pprodnameNode1 = new AProdName(tidNode2, null);
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped1.get(0);
+        AProdName pProdNameNode1 = new AProdName(tIdNode2, null);
+        computePositions(pProdNameNode1, popped1, popped1);
 
-        checkResult(pprodnameNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pprodnameNode1);
+        return Collections.singletonList(pProdNameNode1);
     }
 
     private List<?> new213() /* reduce AAprodname2ProdName */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        TId tidNode3 = (TId)nodeArrayList2.get(0);
-        AProdName pprodnameNode1 = new AProdName(tidNode2, tidNode3);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pprodnameNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pprodnameNode1);
+        TId tIdNode2 = (TId)popped1.get(0);
+        TId tIdNode3 = (TId)popped2.get(0);
+        AProdName pProdNameNode1 = new AProdName(tIdNode2, tIdNode3);
+        computePositions(pProdNameNode1, popped1, popped2);
+
+        return Collections.singletonList(pProdNameNode1);
     }
 
     private List<?> new214() /* reduce AProdNameTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode1 = (TId)nodeArrayList2.get(0);
-        checkResult(tidNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(tidNode1);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        TId tIdNode1 = (TId)popped2.get(0);
+        return Collections.singletonList(tIdNode1);
     }
 
     private List<?> new215() /* reduce AAparams1Params */
     {
-        List<?> nodeArrayList1 = pop();
-        PTerm ptermNode1 = (PTerm)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PTerm pTermNode1 = (PTerm)popped1.get(0);
         List<PTerm> listNode2;
-        if(ptermNode1 != null) {
-            listNode2 = Collections.singletonList(ptermNode1);
+        if(pTermNode1 != null) {
+            listNode2 = Collections.singletonList(pTermNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new216() /* reduce AAparams2Params */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PTerm ptermNode1 = (PTerm)nodeArrayList1.get(0);
-        List<PTerm> listNode2 = (List<PTerm>)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        PTerm pTermNode1 = (PTerm)popped1.get(0);
+        List<PTerm> listNode2 = (List<PTerm>)popped2.get(0);
         List<PTerm> listNode3 = new LinkedList<>();
-        if(ptermNode1 != null)
+        if(pTermNode1 != null)
         {
-            listNode3.add(ptermNode1);
+            listNode3.add(pTermNode1);
         }
         if (listNode3.isEmpty() && listNode2 instanceof LinkedList<?>) {
             listNode3 = listNode2;
         } else {
             listNode3.addAll(listNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new217() /* reduce AParamsTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PTerm ptermNode1 = (PTerm)nodeArrayList2.get(0);
-        checkResult(ptermNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(ptermNode1);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        PTerm pTermNode1 = (PTerm)popped2.get(0);
+        return Collections.singletonList(pTermNode1);
     }
 
     private List<?> new218() /* reduce AAltName */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode1 = (TId)nodeArrayList2.get(0);
-        checkResult(tidNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(tidNode1);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        TId tIdNode1 = (TId)popped2.get(0);
+        return Collections.singletonList(tIdNode1);
     }
 
     private List<?> new219() /* reduce AAelem1Elem */
     {
-        List<?> nodeArrayList1 = pop();
-        TId tidNode4 = (TId)nodeArrayList1.get(0);
-        AElem pelemNode1 = new AElem(null, null, tidNode4, null);
+        List<?> popped1 = pop();
+
+        TId tIdNode4 = (TId)popped1.get(0);
+        AElem pElemNode1 = new AElem(null, null, tIdNode4, null);
+        computePositions(pElemNode1, popped1, popped1);
 
-        checkResult(pelemNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pelemNode1);
+        return Collections.singletonList(pElemNode1);
     }
 
     private List<?> new220() /* reduce AAelem2Elem */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        TId tidNode4 = (TId)nodeArrayList2.get(0);
-        AElem pelemNode1 = new AElem(tidNode2, null, tidNode4, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped1.get(0);
+        TId tIdNode4 = (TId)popped2.get(0);
+        AElem pElemNode1 = new AElem(tIdNode2, null, tIdNode4, null);
+        computePositions(pElemNode1, popped1, popped2);
 
-        checkResult(pelemNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pelemNode1);
+        return Collections.singletonList(pElemNode1);
     }
 
     private List<?> new221() /* reduce AAelem3Elem */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PSpecifier pspecifierNode3 = (PSpecifier)nodeArrayList1.get(0);
-        TId tidNode4 = (TId)nodeArrayList2.get(0);
-        AElem pelemNode1 = new AElem(null, pspecifierNode3, tidNode4, null);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pelemNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pelemNode1);
+        PSpecifier pSpecifierNode3 = (PSpecifier)popped1.get(0);
+        TId tIdNode4 = (TId)popped2.get(0);
+        AElem pElemNode1 = new AElem(null, pSpecifierNode3, tIdNode4, null);
+        computePositions(pElemNode1, popped1, popped2);
+
+        return Collections.singletonList(pElemNode1);
     }
 
     private List<?> new222() /* reduce AAelem4Elem */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        PSpecifier pspecifierNode3 = (PSpecifier)nodeArrayList2.get(0);
-        TId tidNode4 = (TId)nodeArrayList3.get(0);
-        AElem pelemNode1 = new AElem(tidNode2, pspecifierNode3, tidNode4, null);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped1.get(0);
+        PSpecifier pSpecifierNode3 = (PSpecifier)popped2.get(0);
+        TId tIdNode4 = (TId)popped3.get(0);
+        AElem pElemNode1 = new AElem(tIdNode2, pSpecifierNode3, tIdNode4, null);
+        computePositions(pElemNode1, popped1, popped3);
 
-        checkResult(pelemNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pelemNode1);
+        return Collections.singletonList(pElemNode1);
     }
 
     private List<?> new223() /* reduce AAelem5Elem */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode4 = (TId)nodeArrayList1.get(0);
-        PUnOp punopNode5 = (PUnOp)nodeArrayList2.get(0);
-        AElem pelemNode1 = new AElem(null, null, tidNode4, punopNode5);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pelemNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pelemNode1);
+        TId tIdNode4 = (TId)popped1.get(0);
+        PUnOp pUnOpNode5 = (PUnOp)popped2.get(0);
+        AElem pElemNode1 = new AElem(null, null, tIdNode4, pUnOpNode5);
+        computePositions(pElemNode1, popped1, popped2);
+
+        return Collections.singletonList(pElemNode1);
     }
 
     private List<?> new224() /* reduce AAelem6Elem */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        TId tidNode4 = (TId)nodeArrayList2.get(0);
-        PUnOp punopNode5 = (PUnOp)nodeArrayList3.get(0);
-        AElem pelemNode1 = new AElem(tidNode2, null, tidNode4, punopNode5);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped1.get(0);
+        TId tIdNode4 = (TId)popped2.get(0);
+        PUnOp pUnOpNode5 = (PUnOp)popped3.get(0);
+        AElem pElemNode1 = new AElem(tIdNode2, null, tIdNode4, pUnOpNode5);
+        computePositions(pElemNode1, popped1, popped3);
 
-        checkResult(pelemNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pelemNode1);
+        return Collections.singletonList(pElemNode1);
     }
 
     private List<?> new225() /* reduce AAelem7Elem */
     {
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PSpecifier pspecifierNode3 = (PSpecifier)nodeArrayList1.get(0);
-        TId tidNode4 = (TId)nodeArrayList2.get(0);
-        PUnOp punopNode5 = (PUnOp)nodeArrayList3.get(0);
-        AElem pelemNode1 = new AElem(null, pspecifierNode3, tidNode4, punopNode5);
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pelemNode1, nodeArrayList1, nodeArrayList3);
-        return Collections.singletonList(pelemNode1);
+        PSpecifier pSpecifierNode3 = (PSpecifier)popped1.get(0);
+        TId tIdNode4 = (TId)popped2.get(0);
+        PUnOp pUnOpNode5 = (PUnOp)popped3.get(0);
+        AElem pElemNode1 = new AElem(null, pSpecifierNode3, tIdNode4, pUnOpNode5);
+        computePositions(pElemNode1, popped1, popped3);
+
+        return Collections.singletonList(pElemNode1);
     }
 
     private List<?> new226() /* reduce AAelem8Elem */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        PSpecifier pspecifierNode3 = (PSpecifier)nodeArrayList2.get(0);
-        TId tidNode4 = (TId)nodeArrayList3.get(0);
-        PUnOp punopNode5 = (PUnOp)nodeArrayList4.get(0);
-        AElem pelemNode1 = new AElem(tidNode2, pspecifierNode3, tidNode4, punopNode5);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped1.get(0);
+        PSpecifier pSpecifierNode3 = (PSpecifier)popped2.get(0);
+        TId tIdNode4 = (TId)popped3.get(0);
+        PUnOp pUnOpNode5 = (PUnOp)popped4.get(0);
+        AElem pElemNode1 = new AElem(tIdNode2, pSpecifierNode3, tIdNode4, pUnOpNode5);
+        computePositions(pElemNode1, popped1, popped4);
 
-        checkResult(pelemNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pelemNode1);
+        return Collections.singletonList(pElemNode1);
     }
 
     private List<?> new227() /* reduce AElemName */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode1 = (TId)nodeArrayList2.get(0);
-        checkResult(tidNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(tidNode1);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        TId tIdNode1 = (TId)popped2.get(0);
+        return Collections.singletonList(tIdNode1);
     }
 
     private List<?> new228() /* reduce ATokenSpecifier */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        ATokenSpecifier pspecifierNode1 = new ATokenSpecifier();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        ATokenSpecifier pSpecifierNode1 = new ATokenSpecifier();
+        computePositions(pSpecifierNode1, popped1, popped2);
 
-        checkResult(pspecifierNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pspecifierNode1);
+        return Collections.singletonList(pSpecifierNode1);
     }
 
     private List<?> new229() /* reduce AProductionSpecifier */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        AProductionSpecifier pspecifierNode1 = new AProductionSpecifier();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
 
-        checkResult(pspecifierNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pspecifierNode1);
+        AProductionSpecifier pSpecifierNode1 = new AProductionSpecifier();
+        computePositions(pSpecifierNode1, popped1, popped2);
+
+        return Collections.singletonList(pSpecifierNode1);
     }
 
     private List<?> new230() /* reduce AAst */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PAstProd> listNode2 = (List<PAstProd>)nodeArrayList4.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        List<PAstProd> listNode2 = (List<PAstProd>)popped4.get(0);
         List<PAstProd> listNode3 = listNode2;
-        AAst pastNode1 = new AAst(listNode3);
+        AAst pAstNode1 = new AAst(listNode3);
+        computePositions(pAstNode1, popped1, popped4);
 
-        checkResult(pastNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pastNode1);
+        return Collections.singletonList(pAstNode1);
     }
 
     private List<?> new231() /* reduce AAstProd */
     {
-        List<?> nodeArrayList4 = pop();
-        List<?> nodeArrayList3 = pop();
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        List<PAstAlt> listNode3 = (List<PAstAlt>)nodeArrayList3.get(0);
+        List<?> popped4 = pop();
+        List<?> popped3 = pop();
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped1.get(0);
+        List<PAstAlt> listNode3 = (List<PAstAlt>)popped3.get(0);
         List<PAstAlt> listNode4 = listNode3;
-        AAstProd pastprodNode1 = new AAstProd(tidNode2, listNode4);
+        AAstProd pAstProdNode1 = new AAstProd(tIdNode2, listNode4);
+        computePositions(pAstProdNode1, popped1, popped4);
 
-        checkResult(pastprodNode1, nodeArrayList1, nodeArrayList4);
-        return Collections.singletonList(pastprodNode1);
+        return Collections.singletonList(pAstProdNode1);
     }
 
     private List<?> new232() /* reduce AAastalts1AstAlts */
     {
-        List<?> nodeArrayList1 = pop();
-        PAstAlt pastaltNode1 = (PAstAlt)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PAstAlt pAstAltNode1 = (PAstAlt)popped1.get(0);
         List<PAstAlt> listNode2;
-        if(pastaltNode1 != null) {
-            listNode2 = Collections.singletonList(pastaltNode1);
+        if(pAstAltNode1 != null) {
+            listNode2 = Collections.singletonList(pAstAltNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new233() /* reduce AAastalts2AstAlts */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PAstAlt pastaltNode1 = (PAstAlt)nodeArrayList1.get(0);
-        List<PAstAlt> listNode2 = (List<PAstAlt>)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        PAstAlt pAstAltNode1 = (PAstAlt)popped1.get(0);
+        List<PAstAlt> listNode2 = (List<PAstAlt>)popped2.get(0);
         List<PAstAlt> listNode3 = new LinkedList<>();
-        if(pastaltNode1 != null)
+        if(pAstAltNode1 != null)
         {
-            listNode3.add(pastaltNode1);
+            listNode3.add(pAstAltNode1);
         }
         if (listNode3.isEmpty() && listNode2 instanceof LinkedList<?>) {
             listNode3 = listNode2;
         } else {
             listNode3.addAll(listNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new234() /* reduce AAstAltsTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        PAstAlt pastaltNode1 = (PAstAlt)nodeArrayList2.get(0);
-        checkResult(pastaltNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pastaltNode1);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        PAstAlt pAstAltNode1 = (PAstAlt)popped2.get(0);
+        return Collections.singletonList(pAstAltNode1);
     }
 
     private List<?> new235() /* reduce AAastalt1AstAlt */
     {
-        AAstAlt pastaltNode1 = new AAstAlt(null, Collections.emptyList());
 
-        return Collections.singletonList(pastaltNode1);
+        AAstAlt pAstAltNode1 = new AAstAlt(null, Collections.emptyList());
+
+        return Collections.singletonList(pAstAltNode1);
     }
 
     private List<?> new236() /* reduce AAastalt2AstAlt */
     {
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        AAstAlt pastaltNode1 = new AAstAlt(tidNode2, Collections.emptyList());
+        List<?> popped1 = pop();
 
-        checkResult(pastaltNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pastaltNode1);
+        TId tIdNode2 = (TId)popped1.get(0);
+        AAstAlt pAstAltNode1 = new AAstAlt(tIdNode2, Collections.emptyList());
+        computePositions(pAstAltNode1, popped1, popped1);
+
+        return Collections.singletonList(pAstAltNode1);
     }
 
     private List<?> new237() /* reduce AAastalt3AstAlt */
     {
-        List<?> nodeArrayList1 = pop();
-        List<PElem> listNode3 = (List<PElem>)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+
+        List<PElem> listNode3 = (List<PElem>)popped1.get(0);
         List<PElem> listNode4 = listNode3;
-        AAstAlt pastaltNode1 = new AAstAlt(null, listNode4);
+        AAstAlt pAstAltNode1 = new AAstAlt(null, listNode4);
+        computePositions(pAstAltNode1, popped1, popped1);
 
-        checkResult(pastaltNode1, nodeArrayList1, nodeArrayList1);
-        return Collections.singletonList(pastaltNode1);
+        return Collections.singletonList(pAstAltNode1);
     }
 
     private List<?> new238() /* reduce AAastalt4AstAlt */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        TId tidNode2 = (TId)nodeArrayList1.get(0);
-        List<PElem> listNode3 = (List<PElem>)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+
+        TId tIdNode2 = (TId)popped1.get(0);
+        List<PElem> listNode3 = (List<PElem>)popped2.get(0);
         List<PElem> listNode4 = listNode3;
-        AAstAlt pastaltNode1 = new AAstAlt(tidNode2, listNode4);
+        AAstAlt pAstAltNode1 = new AAstAlt(tIdNode2, listNode4);
+        computePositions(pAstAltNode1, popped1, popped2);
 
-        checkResult(pastaltNode1, nodeArrayList1, nodeArrayList2);
-        return Collections.singletonList(pastaltNode1);
+        return Collections.singletonList(pAstAltNode1);
     }
 
     private List<?> new239() /* reduce ATerminal$PkgNameTail */
     {
-        List<?> nodeArrayList1 = pop();
-        TPkgId tpkgidNode1 = (TPkgId)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        TPkgId tPkgIdNode1 = (TPkgId)popped1.get(0);
         List<TPkgId> listNode2;
-        if(tpkgidNode1 != null) {
-            listNode2 = Collections.singletonList(tpkgidNode1);
+        if(tPkgIdNode1 != null) {
+            listNode2 = Collections.singletonList(tPkgIdNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new240() /* reduce ANonTerminal$PkgNameTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TPkgId> listNode1 = (List<TPkgId>)nodeArrayList1.get(0);
-        TPkgId tpkgidNode2 = (TPkgId)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<TPkgId> listNode1 = (List<TPkgId>)popped1.get(0);
+        TPkgId tPkgIdNode2 = (TPkgId)popped2.get(0);
         List<TPkgId> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(tpkgidNode2 != null)
+        if(tPkgIdNode2 != null)
         {
-            listNode3.add(tpkgidNode2);
+            listNode3.add(tPkgIdNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new241() /* reduce ATerminal$HelperDef */
     {
-        List<?> nodeArrayList1 = pop();
-        PHelperDef phelperdefNode1 = (PHelperDef)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PHelperDef pHelperDefNode1 = (PHelperDef)popped1.get(0);
         List<PHelperDef> listNode2;
-        if(phelperdefNode1 != null) {
-            listNode2 = Collections.singletonList(phelperdefNode1);
+        if(pHelperDefNode1 != null) {
+            listNode2 = Collections.singletonList(pHelperDefNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new242() /* reduce ANonTerminal$HelperDef */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PHelperDef> listNode1 = (List<PHelperDef>)nodeArrayList1.get(0);
-        PHelperDef phelperdefNode2 = (PHelperDef)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<PHelperDef> listNode1 = (List<PHelperDef>)popped1.get(0);
+        PHelperDef pHelperDefNode2 = (PHelperDef)popped2.get(0);
         List<PHelperDef> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(phelperdefNode2 != null)
+        if(pHelperDefNode2 != null)
         {
-            listNode3.add(phelperdefNode2);
+            listNode3.add(pHelperDefNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new243() /* reduce ATerminal$IdListTail */
     {
-        List<?> nodeArrayList1 = pop();
-        TId tidNode1 = (TId)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        TId tIdNode1 = (TId)popped1.get(0);
         List<TId> listNode2;
-        if(tidNode1 != null) {
-            listNode2 = Collections.singletonList(tidNode1);
+        if(tIdNode1 != null) {
+            listNode2 = Collections.singletonList(tIdNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new244() /* reduce ANonTerminal$IdListTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<TId> listNode1 = (List<TId>)nodeArrayList1.get(0);
-        TId tidNode2 = (TId)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<TId> listNode1 = (List<TId>)popped1.get(0);
+        TId tIdNode2 = (TId)popped2.get(0);
         List<TId> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(tidNode2 != null)
+        if(tIdNode2 != null)
         {
-            listNode3.add(tidNode2);
+            listNode3.add(tIdNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new245() /* reduce ATerminal$TokenDef */
     {
-        List<?> nodeArrayList1 = pop();
-        PTokenDef ptokendefNode1 = (PTokenDef)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PTokenDef pTokenDefNode1 = (PTokenDef)popped1.get(0);
         List<PTokenDef> listNode2;
-        if(ptokendefNode1 != null) {
-            listNode2 = Collections.singletonList(ptokendefNode1);
+        if(pTokenDefNode1 != null) {
+            listNode2 = Collections.singletonList(pTokenDefNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new246() /* reduce ANonTerminal$TokenDef */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PTokenDef> listNode1 = (List<PTokenDef>)nodeArrayList1.get(0);
-        PTokenDef ptokendefNode2 = (PTokenDef)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<PTokenDef> listNode1 = (List<PTokenDef>)popped1.get(0);
+        PTokenDef pTokenDefNode2 = (PTokenDef)popped2.get(0);
         List<PTokenDef> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(ptokendefNode2 != null)
+        if(pTokenDefNode2 != null)
         {
-            listNode3.add(ptokendefNode2);
+            listNode3.add(pTokenDefNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new247() /* reduce ATerminal$StateListTail */
     {
-        List<?> nodeArrayList1 = pop();
-        PStateListTail pstatelisttailNode1 = (PStateListTail)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PStateListTail pStateListTailNode1 = (PStateListTail)popped1.get(0);
         List<PStateListTail> listNode2;
-        if(pstatelisttailNode1 != null) {
-            listNode2 = Collections.singletonList(pstatelisttailNode1);
+        if(pStateListTailNode1 != null) {
+            listNode2 = Collections.singletonList(pStateListTailNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new248() /* reduce ANonTerminal$StateListTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PStateListTail> listNode1 = (List<PStateListTail>)nodeArrayList1.get(0);
-        PStateListTail pstatelisttailNode2 = (PStateListTail)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<PStateListTail> listNode1 = (List<PStateListTail>)popped1.get(0);
+        PStateListTail pStateListTailNode2 = (PStateListTail)popped2.get(0);
         List<PStateListTail> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(pstatelisttailNode2 != null)
+        if(pStateListTailNode2 != null)
         {
-            listNode3.add(pstatelisttailNode2);
+            listNode3.add(pStateListTailNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new249() /* reduce ATerminal$RegExpTail */
     {
-        List<?> nodeArrayList1 = pop();
-        PConcat pconcatNode1 = (PConcat)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PConcat pConcatNode1 = (PConcat)popped1.get(0);
         List<PConcat> listNode2;
-        if(pconcatNode1 != null) {
-            listNode2 = Collections.singletonList(pconcatNode1);
+        if(pConcatNode1 != null) {
+            listNode2 = Collections.singletonList(pConcatNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new250() /* reduce ANonTerminal$RegExpTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PConcat> listNode1 = (List<PConcat>)nodeArrayList1.get(0);
-        PConcat pconcatNode2 = (PConcat)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<PConcat> listNode1 = (List<PConcat>)popped1.get(0);
+        PConcat pConcatNode2 = (PConcat)popped2.get(0);
         List<PConcat> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(pconcatNode2 != null)
+        if(pConcatNode2 != null)
         {
-            listNode3.add(pconcatNode2);
+            listNode3.add(pConcatNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new251() /* reduce ATerminal$UnExp */
     {
-        List<?> nodeArrayList1 = pop();
-        PUnExp punexpNode1 = (PUnExp)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PUnExp pUnExpNode1 = (PUnExp)popped1.get(0);
         List<PUnExp> listNode2;
-        if(punexpNode1 != null) {
-            listNode2 = Collections.singletonList(punexpNode1);
+        if(pUnExpNode1 != null) {
+            listNode2 = Collections.singletonList(pUnExpNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new252() /* reduce ANonTerminal$UnExp */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PUnExp> listNode1 = (List<PUnExp>)nodeArrayList1.get(0);
-        PUnExp punexpNode2 = (PUnExp)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<PUnExp> listNode1 = (List<PUnExp>)popped1.get(0);
+        PUnExp pUnExpNode2 = (PUnExp)popped2.get(0);
         List<PUnExp> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(punexpNode2 != null)
+        if(pUnExpNode2 != null)
         {
-            listNode3.add(punexpNode2);
+            listNode3.add(pUnExpNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new253() /* reduce ATerminal$Prod */
     {
-        List<?> nodeArrayList1 = pop();
-        PProd pprodNode1 = (PProd)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PProd pProdNode1 = (PProd)popped1.get(0);
         List<PProd> listNode2;
-        if(pprodNode1 != null) {
-            listNode2 = Collections.singletonList(pprodNode1);
+        if(pProdNode1 != null) {
+            listNode2 = Collections.singletonList(pProdNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new254() /* reduce ANonTerminal$Prod */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PProd> listNode1 = (List<PProd>)nodeArrayList1.get(0);
-        PProd pprodNode2 = (PProd)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<PProd> listNode1 = (List<PProd>)popped1.get(0);
+        PProd pProdNode2 = (PProd)popped2.get(0);
         List<PProd> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(pprodNode2 != null)
+        if(pProdNode2 != null)
         {
-            listNode3.add(pprodNode2);
+            listNode3.add(pProdNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new255() /* reduce ATerminal$Elem */
     {
-        List<?> nodeArrayList1 = pop();
-        PElem pelemNode1 = (PElem)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PElem pElemNode1 = (PElem)popped1.get(0);
         List<PElem> listNode2;
-        if(pelemNode1 != null) {
-            listNode2 = Collections.singletonList(pelemNode1);
+        if(pElemNode1 != null) {
+            listNode2 = Collections.singletonList(pElemNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new256() /* reduce ANonTerminal$Elem */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PElem> listNode1 = (List<PElem>)nodeArrayList1.get(0);
-        PElem pelemNode2 = (PElem)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<PElem> listNode1 = (List<PElem>)popped1.get(0);
+        PElem pElemNode2 = (PElem)popped2.get(0);
         List<PElem> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(pelemNode2 != null)
+        if(pElemNode2 != null)
         {
-            listNode3.add(pelemNode2);
+            listNode3.add(pElemNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new257() /* reduce ATerminal$AltsTail */
     {
-        List<?> nodeArrayList1 = pop();
-        PAlt paltNode1 = (PAlt)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PAlt pAltNode1 = (PAlt)popped1.get(0);
         List<PAlt> listNode2;
-        if(paltNode1 != null) {
-            listNode2 = Collections.singletonList(paltNode1);
+        if(pAltNode1 != null) {
+            listNode2 = Collections.singletonList(pAltNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new258() /* reduce ANonTerminal$AltsTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PAlt> listNode1 = (List<PAlt>)nodeArrayList1.get(0);
-        PAlt paltNode2 = (PAlt)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<PAlt> listNode1 = (List<PAlt>)popped1.get(0);
+        PAlt pAltNode2 = (PAlt)popped2.get(0);
         List<PAlt> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(paltNode2 != null)
+        if(pAltNode2 != null)
         {
-            listNode3.add(paltNode2);
+            listNode3.add(pAltNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new259() /* reduce ATerminal$Term */
     {
-        List<?> nodeArrayList1 = pop();
-        PTerm ptermNode1 = (PTerm)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PTerm pTermNode1 = (PTerm)popped1.get(0);
         List<PTerm> listNode2;
-        if(ptermNode1 != null) {
-            listNode2 = Collections.singletonList(ptermNode1);
+        if(pTermNode1 != null) {
+            listNode2 = Collections.singletonList(pTermNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new260() /* reduce ANonTerminal$Term */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PTerm> listNode1 = (List<PTerm>)nodeArrayList1.get(0);
-        PTerm ptermNode2 = (PTerm)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<PTerm> listNode1 = (List<PTerm>)popped1.get(0);
+        PTerm pTermNode2 = (PTerm)popped2.get(0);
         List<PTerm> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(ptermNode2 != null)
+        if(pTermNode2 != null)
         {
-            listNode3.add(ptermNode2);
+            listNode3.add(pTermNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new261() /* reduce ATerminal$ListTermTail */
     {
-        List<?> nodeArrayList1 = pop();
-        PListTerm plisttermNode1 = (PListTerm)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PListTerm pListTermNode1 = (PListTerm)popped1.get(0);
         List<PListTerm> listNode2;
-        if(plisttermNode1 != null) {
-            listNode2 = Collections.singletonList(plisttermNode1);
+        if(pListTermNode1 != null) {
+            listNode2 = Collections.singletonList(pListTermNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new262() /* reduce ANonTerminal$ListTermTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PListTerm> listNode1 = (List<PListTerm>)nodeArrayList1.get(0);
-        PListTerm plisttermNode2 = (PListTerm)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<PListTerm> listNode1 = (List<PListTerm>)popped1.get(0);
+        PListTerm pListTermNode2 = (PListTerm)popped2.get(0);
         List<PListTerm> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(plisttermNode2 != null)
+        if(pListTermNode2 != null)
         {
-            listNode3.add(plisttermNode2);
+            listNode3.add(pListTermNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new263() /* reduce ATerminal$ParamsTail */
     {
-        List<?> nodeArrayList1 = pop();
-        PTerm ptermNode1 = (PTerm)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PTerm pTermNode1 = (PTerm)popped1.get(0);
         List<PTerm> listNode2;
-        if(ptermNode1 != null) {
-            listNode2 = Collections.singletonList(ptermNode1);
+        if(pTermNode1 != null) {
+            listNode2 = Collections.singletonList(pTermNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new264() /* reduce ANonTerminal$ParamsTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PTerm> listNode1 = (List<PTerm>)nodeArrayList1.get(0);
-        PTerm ptermNode2 = (PTerm)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<PTerm> listNode1 = (List<PTerm>)popped1.get(0);
+        PTerm pTermNode2 = (PTerm)popped2.get(0);
         List<PTerm> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(ptermNode2 != null)
+        if(pTermNode2 != null)
         {
-            listNode3.add(ptermNode2);
+            listNode3.add(pTermNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new265() /* reduce ATerminal$AstProd */
     {
-        List<?> nodeArrayList1 = pop();
-        PAstProd pastprodNode1 = (PAstProd)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PAstProd pAstProdNode1 = (PAstProd)popped1.get(0);
         List<PAstProd> listNode2;
-        if(pastprodNode1 != null) {
-            listNode2 = Collections.singletonList(pastprodNode1);
+        if(pAstProdNode1 != null) {
+            listNode2 = Collections.singletonList(pAstProdNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new266() /* reduce ANonTerminal$AstProd */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PAstProd> listNode1 = (List<PAstProd>)nodeArrayList1.get(0);
-        PAstProd pastprodNode2 = (PAstProd)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<PAstProd> listNode1 = (List<PAstProd>)popped1.get(0);
+        PAstProd pAstProdNode2 = (PAstProd)popped2.get(0);
         List<PAstProd> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(pastprodNode2 != null)
+        if(pAstProdNode2 != null)
         {
-            listNode3.add(pastprodNode2);
+            listNode3.add(pAstProdNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
     private List<?> new267() /* reduce ATerminal$AstAltsTail */
     {
-        List<?> nodeArrayList1 = pop();
-        PAstAlt pastaltNode1 = (PAstAlt)nodeArrayList1.get(0);
+        List<?> popped1 = pop();
+        PAstAlt pAstAltNode1 = (PAstAlt)popped1.get(0);
         List<PAstAlt> listNode2;
-        if(pastaltNode1 != null) {
-            listNode2 = Collections.singletonList(pastaltNode1);
+        if(pAstAltNode1 != null) {
+            listNode2 = Collections.singletonList(pAstAltNode1);
         } else {
             listNode2 = Collections.emptyList();
         }
-        checkResult(listNode2, nodeArrayList1, nodeArrayList1);
         return Collections.singletonList(listNode2);
     }
 
     private List<?> new268() /* reduce ANonTerminal$AstAltsTail */
     {
-        List<?> nodeArrayList2 = pop();
-        List<?> nodeArrayList1 = pop();
-        List<PAstAlt> listNode1 = (List<PAstAlt>)nodeArrayList1.get(0);
-        PAstAlt pastaltNode2 = (PAstAlt)nodeArrayList2.get(0);
+        List<?> popped2 = pop();
+        List<?> popped1 = pop();
+        List<PAstAlt> listNode1 = (List<PAstAlt>)popped1.get(0);
+        PAstAlt pAstAltNode2 = (PAstAlt)popped2.get(0);
         List<PAstAlt> listNode3;
         if (listNode1 instanceof LinkedList<?>) {
             listNode3 = listNode1;
         } else {
             listNode3 = new LinkedList<>(listNode1);
         }
-        if(pastaltNode2 != null)
+        if(pAstAltNode2 != null)
         {
-            listNode3.add(pastaltNode2);
+            listNode3.add(pAstAltNode2);
         }
-        checkResult(listNode3, nodeArrayList1, nodeArrayList2);
         return Collections.singletonList(listNode3);
     }
 
@@ -6270,13 +6393,13 @@ public class Parser implements IParser
             DataInputStream s = new DataInputStream(new BufferedInputStream(resStream));
 
             // read actionTable
-            int length = s.readInt();
-            actionTable = new int[length][][];
-            for(int i = 0; i < actionTable.length; i++)
+            int actionTableLength1 = s.readInt();
+            actionTable = new int[actionTableLength1][][];
+            for(int i = 0; i < actionTableLength1; i++)
             {
-                length = s.readInt();
-                actionTable[i] = new int[length][3];
-                for(int j = 0; j < actionTable[i].length; j++)
+                int actionTableLength2 = s.readInt();
+                actionTable[i] = new int[actionTableLength2][3];
+                for(int j = 0; j < actionTableLength2; j++)
                 {
                     for(int k = 0; k < 3; k++)
                     {
@@ -6286,13 +6409,13 @@ public class Parser implements IParser
             }
 
             // read gotoTable
-            length = s.readInt();
-            gotoTable = new int[length][][];
-            for(int i = 0; i < gotoTable.length; i++)
+            int gotoTableLength1 = s.readInt();
+            gotoTable = new int[gotoTableLength1][][];
+            for(int i = 0; i < gotoTableLength1; i++)
             {
-                length = s.readInt();
-                gotoTable[i] = new int[length][2];
-                for(int j = 0; j < gotoTable[i].length; j++)
+                int gotoTableLength2 = s.readInt();
+                gotoTable[i] = new int[gotoTableLength2][2];
+                for(int j = 0; j < gotoTableLength2; j++)
                 {
                     for(int k = 0; k < 2; k++)
                     {
@@ -6302,14 +6425,14 @@ public class Parser implements IParser
             }
 
             // read errorMessages
-            length = s.readInt();
-            errorMessages = new String[length];
-            for(int i = 0; i < errorMessages.length; i++)
+            int errorMessagesLength = s.readInt();
+            errorMessages = new String[errorMessagesLength];
+            for(int i = 0; i < errorMessagesLength; i++)
             {
-                length = s.readInt();
+                int errorMessageLength = s.readInt();
                 StringBuilder buffer = new StringBuilder();
 
-                for(int j = 0; j < length; j++)
+                for(int j = 0; j < errorMessageLength; j++)
                 {
                     buffer.append(s.readChar());
                 }
@@ -6317,9 +6440,9 @@ public class Parser implements IParser
             }
 
             // read errors
-            length = s.readInt();
-            errors = new int[length];
-            for(int i = 0; i < errors.length; i++)
+            int errorsLength = s.readInt();
+            errors = new int[errorsLength];
+            for(int i = 0; i < errorsLength; i++)
             {
                 errors[i] = s.readInt();
             }
diff --git a/src/main/resources/org/sablecc/sablecc/alternatives.txt b/src/main/resources/org/sablecc/sablecc/alternatives.txt
index 3dd2fc3dd641175b3d656a986e8061e7c53bc785..bb0c56f326b075e9b9af24c33eb88fcc42349e39 100644
--- a/src/main/resources/org/sablecc/sablecc/alternatives.txt
+++ b/src/main/resources/org/sablecc/sablecc/alternatives.txt
@@ -79,29 +79,26 @@ $
 
 Macro:CloneHeader
 
-    public $0$($0$ node)
+    @Override
+    public $0$ clone()
     {
-        super(node);
+        $0$ cloned = new $0$();
 
 $
 
 Macro:CloneBodyNode
-        set$0$(cloneNode(node._$1$_));
+        cloned.set$0$(cloneNode(this._$1$_));
 
 $
 
 Macro:CloneBodyList
-        set$0$(cloneList(node._$1$_));
+        cloned.set$0$(cloneList(this._$1$_));
 
 $
 
 Macro:CloneTail
-    }
-
-    @Override
-    public $0$ clone()
-    {
-        return new $0$(this);
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
 $
diff --git a/src/main/resources/org/sablecc/sablecc/lexer.txt b/src/main/resources/org/sablecc/sablecc/lexer.txt
index 5960c9fcf0df41994e2db59ba37548956b7390e0..c877b18803adbde214f1aeb8ac1584b94194fd03 100644
--- a/src/main/resources/org/sablecc/sablecc/lexer.txt
+++ b/src/main/resources/org/sablecc/sablecc/lexer.txt
@@ -85,15 +85,14 @@ public class Lexer
         int startPos = this.pos;
         int startLine = this.line;
 
-        int acceptState = -1;
         int acceptToken = -1;
         int acceptLength = -1;
         int acceptPos = -1;
         int acceptLine = -1;
         boolean acceptCr = false;
 
-        int[][][] gotoTable = Lexer.gotoTable[this.state.ordinal()];
-        int[] accept = Lexer.accept[this.state.ordinal()];
+        int[][][] gotoTableSub = Lexer.gotoTable[this.state.ordinal()];
+        int[] acceptSub = Lexer.accept[this.state.ordinal()];
         this.text.setLength(0);
 
         while(true)
@@ -150,7 +149,7 @@ public class Lexer
 
                     dfaState = -1;
 
-                    int[][] tmp1 =  gotoTable[oldState];
+                    int[][] tmp1 = gotoTableSub[oldState];
                     int low = 0;
                     int high = tmp1.length - 1;
 
@@ -184,10 +183,9 @@ public class Lexer
 
             if(dfaState >= 0)
             {
-                if(accept[dfaState] != -1)
+                if(acceptSub[dfaState] != -1)
                 {
-                    acceptState = dfaState;
-                    acceptToken = accept[dfaState];
+                    acceptToken = acceptSub[dfaState];
                     acceptLength = this.text.length();
                     acceptPos = this.pos;
                     acceptLine = this.line;
@@ -196,70 +194,63 @@ public class Lexer
             }
             else
             {
-                if(acceptState != -1)
+                Token tok;
+                switch(acceptToken)
                 {
-                    switch(acceptToken)
-                    {
+                    case -1:
+                        if(this.text.length() > 0)
+                        {
+                            throw new LexerException("[" + (startLine + 1) + "," + (startPos + 1) + "] Unknown token: " + this.text);
+                        }
+
+                        return new EOF(startLine + 1, startPos + 1);
+
 
 $
 
 Macro:LexerVariableToken
-                        case $0$:
-                        {
-                            Token token = new $1$(getText(acceptLength), startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
+                    case $0$:
+                        tok = new $1$(getText(acceptLength), startLine + 1, startPos + 1);
 
 $
 
 Macro:LexerFixedToken
-                        case $0$:
-                        {
-                            Token token = new $1$(startLine + 1, startPos + 1);
-                            pushBack(acceptLength);
-                            this.pos = acceptPos;
-                            this.line = acceptLine;
-                            this.cr = acceptCr;
+                    case $0$:
+                        tok = new $1$(startLine + 1, startPos + 1);
 
 $
 
 Macro:TokenSwitchHeader
-                            switch(state.ordinal())
-                            {
+                        switch(state.ordinal())
+                        {
 
 $
 
 Macro:TokenCase
-                                case $0$: state = State.$1$; break;
+                            case $0$: state = State.$1$; break;
 
 $
 
 Macro:TokenSwitchTail
-                            }
+                        }
 
 $
 
 Macro:LexerTokenTail
-                            return token;
-                        }
+                        break;
+
 
 $
 
 Macro:LexerBody
-                    }
-                }
-                else
-                {
-                    if(this.text.length() > 0)
-                    {
-                        throw new LexerException("[" + (startLine + 1) + "," + (startPos + 1) + "] Unknown token: " + this.text);
-                    }
-
-                    EOF token = new EOF(startLine + 1, startPos + 1);
-                    return token;
+                    default:
+                        throw new LexerException("[" + (startLine + 1) + "," + (startPos + 1) + "] Internal lexer error: invalid accept table entry " + acceptToken + ", current text: " + this.text);
                 }
+                pushBack(acceptLength);
+                this.pos = acceptPos;
+                this.line = acceptLine;
+                this.cr = acceptCr;
+                return tok;
             }
         }
     }
@@ -293,25 +284,36 @@ Macro:LexerBody
     }
 
     /**
-     * @deprecated This method doesn't restore line/column info correctly in some cases
-     *     (if a token begins in the middle of a CRLF newline pair).
-     *     There is no planned replacement.
+     * <p>
+     * Push the given token's text back onto the input.
+     * Note that the lexer state is <i>not</i> restored,
+     * so a following {@link #next()}/{@link #peek()} call may result in a different token.
+     * </p>
+     * <p>
+     * <b>Note:</b>
+     * If the token text contains newlines,
+     * the caller must ensure that CR+LF pairs are unread in their entirety.
+     * If only one half of a CR+LF pair is unread,
+     * the line numbers will be incorrect when it is lexed again.
+     * </p>
+     *
+     * @param tok the token to push back onto the input
+     * @throws IOException when thrown by {@link PushbackReader#unread(int)}
      */
-    @Deprecated
-    protected void unread(Token token) throws IOException
+    protected void unread(Token tok) throws IOException
     {
-        String text = token.getText();
-        int length = text.length();
+        String tokenText = tok.getText();
+        int length = tokenText.length();
 
         for(int i = length - 1; i >= 0; i--)
         {
             this.eof = false;
 
-            this.in.unread(text.charAt(i));
+            this.in.unread(tokenText.charAt(i));
         }
 
-        this.pos = token.getPos() - 1;
-        this.line = token.getLine() - 1;
+        this.pos = tok.getPos() - 1;
+        this.line = tok.getLine() - 1;
     }
 
     private String getText(int acceptLength)
@@ -319,7 +321,7 @@ Macro:LexerBody
         return this.text.substring(0, acceptLength);
     }
 
-    private static int[][][][] gotoTable;
+    private static final int[][][][] gotoTable;
 /*  {
 
 $
@@ -327,7 +329,7 @@ $
 Macro:LexerAcceptHeader
     };*/
 
-    private static int[][] accept;
+    private static final int[][] accept;
 /*  {
 
 $
@@ -374,17 +376,17 @@ Macro:LexerTail
             DataInputStream s = new DataInputStream(new BufferedInputStream(resStream));
 
             // read gotoTable
-            int length = s.readInt();
-            gotoTable = new int[length][][][];
-            for(int i = 0; i < gotoTable.length; i++)
+            int gotoTableLength1 = s.readInt();
+            gotoTable = new int[gotoTableLength1][][][];
+            for(int i = 0; i < gotoTableLength1; i++)
             {
-                length = s.readInt();
-                gotoTable[i] = new int[length][][];
-                for(int j = 0; j < gotoTable[i].length; j++)
+                int gotoTableLength2 = s.readInt();
+                gotoTable[i] = new int[gotoTableLength2][][];
+                for(int j = 0; j < gotoTableLength2; j++)
                 {
-                    length = s.readInt();
-                    gotoTable[i][j] = new int[length][3];
-                    for(int k = 0; k < gotoTable[i][j].length; k++)
+                    int gotoTableLength3 = s.readInt();
+                    gotoTable[i][j] = new int[gotoTableLength3][3];
+                    for(int k = 0; k < gotoTableLength3; k++)
                     {
                         for(int l = 0; l < 3; l++)
                         {
@@ -395,13 +397,13 @@ Macro:LexerTail
             }
 
             // read accept
-            length = s.readInt();
-            accept = new int[length][];
-            for(int i = 0; i < accept.length; i++)
+            int acceptLength1 = s.readInt();
+            accept = new int[acceptLength1][];
+            for(int i = 0; i < acceptLength1; i++)
             {
-                length = s.readInt();
-                accept[i] = new int[length];
-                for(int j = 0; j < accept[i].length; j++)
+                int acceptLength2 = s.readInt();
+                accept[i] = new int[acceptLength2];
+                for(int j = 0; j < acceptLength2; j++)
                 {
                     accept[i][j] = s.readInt();
                 }
diff --git a/src/main/resources/org/sablecc/sablecc/parser.txt b/src/main/resources/org/sablecc/sablecc/parser.txt
index c856e3649f72780ab682e501a261f25cc40e0fa2..72b1419148fb67793cc751dfde29c5b5ddd8053f 100644
--- a/src/main/resources/org/sablecc/sablecc/parser.txt
+++ b/src/main/resources/org/sablecc/sablecc/parser.txt
@@ -22,7 +22,6 @@ import java.util.ListIterator;
 
 import de.hhu.stups.sablecc.patch.IParser;
 import de.hhu.stups.sablecc.patch.PositionedNode;
-import de.hhu.stups.sablecc.patch.SourcePosition;
 
 import $0$lexer.Lexer;
 import $0$lexer.LexerException;
@@ -35,73 +34,40 @@ public class Parser implements IParser
     private final ListIterator<State> stack = new LinkedList<State>().listIterator();
     private final TokenIndex converter = new TokenIndex();
 
-    private final static int SHIFT = 0;
-    private final static int REDUCE = 1;
-    private final static int ACCEPT = 2;
-    private final static int ERROR = 3;
+    private static final int SHIFT = 0;
+    private static final int REDUCE = 1;
+    private static final int ACCEPT = 2;
+    private static final int ERROR = 3;
 
     public Parser(Lexer lexer)
     {
         this.lexer = lexer;
     }
 
-    private void checkResult(Object elementToCheck, List<?> beginNodeList, List<?> endNodeList) {
-        if (elementToCheck instanceof List<?>) {
-            /*
-             * special case: this is a list of nodes, for example an identifier
-             * list, so we don't want to check the list but the last element
-             * added to it
-             */
-            final List<?> nodeList = (List<?>) elementToCheck;
-            if (nodeList.isEmpty()) {
-                // no positions for empty lists...
-                return;
-            }
-            elementToCheck = nodeList.get(nodeList.size() - 1);
-        }
+    private static void computePositions(PositionedNode node, List<?> beginNodeList, List<?> endNodeList) {
+        // This method should only ever be called for newly created AST nodes (that are not tokens).
+        assert !(node instanceof Token);
+        assert node.getStartPos() == null;
+        assert node.getEndPos() == null;
 
-        final PositionedNode node = (PositionedNode) elementToCheck;
-
-        // Add node positions if they haven't been calculated yet.
-        // Tokens are skipped because they always have positions -
-        // this avoids creating unnecessary SourcePosition objects.
-        if (!(node instanceof Token) && node.getStartPos() == null) {
-            assert node.getEndPos() == null;
-            PositionedNode beginNode = findBeginNode(beginNodeList);
-            if (beginNode == null) {
-                /*
-                 * Sometimes (haven't found out why) we get empty list here. In
-                 * the only observed cases we were looking for the source range
-                 * of the whole parse unit. Then the start pos is the first char.
-                 */
-                node.setStartPos(new SourcePosition(1, 1));
-            } else {
-                node.setStartPos(beginNode.getStartPos());
-            }
+        PositionedNode beginNode = findBeginNode(beginNodeList);
+        node.setStartPos(beginNode.getStartPos());
 
-            PositionedNode endNode = findEndNode(endNodeList);
-            node.setEndPos(endNode.getEndPos());
-        } else {
-            assert node.getEndPos() != null;
-        }
+        PositionedNode endNode = findEndNode(endNodeList);
+        node.setEndPos(endNode.getEndPos());
     }
 
-    private PositionedNode findBeginNode(final List<?> list) {
+    private static PositionedNode findBeginNode(final List<?> list) {
         Object first = list.get(0);
         if (first instanceof List<?>) {
             List<?> list2 = (List<?>) first;
-
-            if (!list2.isEmpty()) {
-                return (PositionedNode)list2.get(0);
-            } else {
-                return null;
-            }
+            return (PositionedNode)list2.get(0);
         }
 
         return (PositionedNode)first;
     }
 
-    private PositionedNode findEndNode(final List<?> list) {
+    private static PositionedNode findEndNode(final List<?> list) {
         Object last = list.get(list.size() - 1);
         if (last instanceof List<?>) {
             final List<?> list2 = (List<?>) last;
@@ -220,11 +186,9 @@ public class Parser implements IParser
             switch(action)
             {
                 case SHIFT:
-                {
-                    List<?> list = Collections.singletonList(this.lexer.next());
-                    push(destination, list);
-                }
-                break;
+                    push(destination, Collections.singletonList(this.lexer.next()));
+                    break;
+
                 case REDUCE:
                     switch(destination)
                     {
@@ -242,19 +206,23 @@ Macro:ParserParseReduce
 $
 
 Macro:ParserParseTail
+                        default:
+                            throw new ParserException(lastToken, "[" + lastToken.getLine() + "," + lastToken.getPos() + "] Internal parser error: invalid action table REDUCE destination " + destination + ", current state " + state());
                     }
                     break;
+
                 case ACCEPT:
-                {
-                    EOF node2 = (EOF) this.lexer.next();
-                    $0$ node1 = ($0$) pop().get(0);
-                    Start node = new Start(node1, node2);
-                    return node;
-                }
+                    EOF eof = (EOF) this.lexer.next();
+                    $0$ top = ($0$) pop().get(0);
+                    return new Start(top, eof);
+
                 case ERROR:
                     throw new ParserException(lastToken,
                         "[" + lastToken.getLine() + "," + lastToken.getPos() + "] " ,
                         Parser.errorMessages[Parser.errors[destination]]);
+
+                default:
+                    throw new ParserException(lastToken, "[" + lastToken.getLine() + "," + lastToken.getPos() + "] Internal parser error: invalid action table entry " + action + ", destination " + destination + ", current state " + state());
             }
         }
     }
@@ -270,12 +238,12 @@ Macro:ParserNewHeader
 $
 
 Macro:ParserNewBodyDecl
-        List<?> nodeArrayList$0$ = pop();
+        List<?> popped$0$ = pop();
 
 $
 
 Macro:ParserSimpleTerm
-        $0$ $1$ = ($0$)nodeArrayList$2$.get($3$);
+        $0$ $1$ = ($0$)popped$2$.get($3$);
 
 $
 
@@ -290,7 +258,6 @@ $
 Macro:ParserNewBodyNewTail
 );
 
-
 $
 
 Macro:ParserTypedSingleElementList
@@ -340,8 +307,8 @@ Macro:ParserTypedLinkedListAddAll
 
 $
 
-Macro:ParserNewCheck
-        checkResult($0$, nodeArrayList1, nodeArrayList$1$);
+Macro:ParserNewComputePositions
+        computePositions($0$, popped1, popped$1$);
 
 $
 
@@ -434,13 +401,13 @@ Macro:ParserTail
             DataInputStream s = new DataInputStream(new BufferedInputStream(resStream));
 
             // read actionTable
-            int length = s.readInt();
-            actionTable = new int[length][][];
-            for(int i = 0; i < actionTable.length; i++)
+            int actionTableLength1 = s.readInt();
+            actionTable = new int[actionTableLength1][][];
+            for(int i = 0; i < actionTableLength1; i++)
             {
-                length = s.readInt();
-                actionTable[i] = new int[length][3];
-                for(int j = 0; j < actionTable[i].length; j++)
+                int actionTableLength2 = s.readInt();
+                actionTable[i] = new int[actionTableLength2][3];
+                for(int j = 0; j < actionTableLength2; j++)
                 {
                     for(int k = 0; k < 3; k++)
                     {
@@ -450,13 +417,13 @@ Macro:ParserTail
             }
 
             // read gotoTable
-            length = s.readInt();
-            gotoTable = new int[length][][];
-            for(int i = 0; i < gotoTable.length; i++)
+            int gotoTableLength1 = s.readInt();
+            gotoTable = new int[gotoTableLength1][][];
+            for(int i = 0; i < gotoTableLength1; i++)
             {
-                length = s.readInt();
-                gotoTable[i] = new int[length][2];
-                for(int j = 0; j < gotoTable[i].length; j++)
+                int gotoTableLength2 = s.readInt();
+                gotoTable[i] = new int[gotoTableLength2][2];
+                for(int j = 0; j < gotoTableLength2; j++)
                 {
                     for(int k = 0; k < 2; k++)
                     {
@@ -466,14 +433,14 @@ Macro:ParserTail
             }
 
             // read errorMessages
-            length = s.readInt();
-            errorMessages = new String[length];
-            for(int i = 0; i < errorMessages.length; i++)
+            int errorMessagesLength = s.readInt();
+            errorMessages = new String[errorMessagesLength];
+            for(int i = 0; i < errorMessagesLength; i++)
             {
-                length = s.readInt();
+                int errorMessageLength = s.readInt();
                 StringBuilder buffer = new StringBuilder();
 
-                for(int j = 0; j < length; j++)
+                for(int j = 0; j < errorMessageLength; j++)
                 {
                     buffer.append(s.readChar());
                 }
@@ -481,9 +448,9 @@ Macro:ParserTail
             }
 
             // read errors
-            length = s.readInt();
-            errors = new int[length];
-            for(int i = 0; i < errors.length; i++)
+            int errorsLength = s.readInt();
+            errors = new int[errorsLength];
+            for(int i = 0; i < errorsLength; i++)
             {
                 errors[i] = s.readInt();
             }
diff --git a/src/main/resources/org/sablecc/sablecc/productions.txt b/src/main/resources/org/sablecc/sablecc/productions.txt
index 2957990e5c297ab2e0b5dbcb18131f2eaf47b8eb..fc8415741dd9d8621ca9325ff06130c9d4493c6e 100644
--- a/src/main/resources/org/sablecc/sablecc/productions.txt
+++ b/src/main/resources/org/sablecc/sablecc/productions.txt
@@ -15,11 +15,6 @@ 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 ce4cfbc9f63af4e19bf0140f6e7030a1b4421c31..4cf4f70ca935e22abc2ab7a15415e3ed1ff14fd4 100644
--- a/src/main/resources/org/sablecc/sablecc/tokens.txt
+++ b/src/main/resources/org/sablecc/sablecc/tokens.txt
@@ -24,15 +24,12 @@ public final class $1$ extends Token
         super(text, line, pos);
     }
 
-    public $1$($1$ token)
-    {
-        super(token);
-    }
-
     @Override
     public $1$ clone()
     {
-        return new $1$(this);
+        $1$ cloned = new $1$(this.getText(), this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
@@ -63,15 +60,12 @@ public final class $1$ extends Token
         super("$2$", line, pos);
     }
 
-    public $1$($1$ token)
-    {
-        super(token);
-    }
-
     @Override
     public $1$ clone()
     {
-        return new $1$(this);
+        $1$ cloned = new $1$(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
diff --git a/src/main/resources/org/sablecc/sablecc/utils.txt b/src/main/resources/org/sablecc/sablecc/utils.txt
index b66f88376cef6ea262174bdc08c20777d2427173..c9a94081356b5fb40b94739b60d7ec0d4e255da6 100644
--- a/src/main/resources/org/sablecc/sablecc/utils.txt
+++ b/src/main/resources/org/sablecc/sablecc/utils.txt
@@ -28,17 +28,14 @@ public final class Start extends Node
         setEOF(_eof_);
     }
 
-    public Start(Start node)
-    {
-        super(node);
-        set$1$(cloneNode(node._$2$_));
-        setEOF(cloneNode(node._eof_));
-    }
-
     @Override
     public Start clone()
     {
-        return new Start(this);
+        Start cloned = new Start();
+        cloned.set$1$(cloneNode(this._$2$_));
+        cloned.setEOF(cloneNode(this._eof_));
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
@@ -163,15 +160,12 @@ public final class EOF extends Token
         super("", line, pos);
     }
 
-    public EOF(EOF token)
-    {
-        super(token);
-    }
-
     @Override
     public EOF clone()
     {
-        return new EOF(this);
+        EOF cloned = new EOF(this.getLine(), this.getPos());
+        cloned.initSourcePositionsFrom(this);
+        return cloned;
     }
 
     @Override
@@ -209,19 +203,6 @@ public abstract class Token extends Node implements IToken
         this(text, 0, 0);
     }
 
-    protected Token()
-    {
-        this((String)null);
-    }
-
-    protected Token(Token token)
-    {
-        super(token);
-        this.text = token.text;
-        this.line = token.line;
-        this.pos = token.pos;
-    }
-
     @Override
     public abstract Token clone();
 
@@ -334,14 +315,8 @@ public abstract class Node extends PositionedNode implements Switchable, Cloneab
     protected Node()
     {}
 
-    protected 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;
-    }
-
+    // clone intentionally does not keep parent!
+    // The new copied node is not a child of the original parent anymore.
     @Override
     public abstract Node clone();