diff --git a/AUTHORS b/AUTHORS index 37505d37a22129dcda2da666ccdc830a5efc1cef..ed2cc2020c24a195ae7e93a85445e29ade5d175a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,7 +1,8 @@ This file contains the name of all copyright holders. -Etienne M. Gagnon <etienne.gagnon@uqam.ca> +Etienne M. Gagnon <egagnon@j-meg.com> Ben Menking <bmenking@bigfoot.com> Mariusz Nowostawski <mariusz@marni.otago.ac.nz> -Komivi Kevin Agbakpem <agbakpem.komivi@courrier.uqam.ca> +Komivi Kevin Agbakpem <kevin.agbakpem@gmail.com> Kis Gergely <kisg@inf.bme.hu> +Benne Otten <benneotten@gmail.com> diff --git a/LICENSE b/LICENSE index 283bc3c4a1738208731f38d6932bdee503a0b232..94f60975b3fa90eada07c282e7c77b3ec32843ea 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ SableCC, an object-oriented compiler framework. -Copyright (C) 1997-2003 Etienne M. Gagnon <etienne.gagnon@uqam.ca> and -others. All rights reserved. +Copyright (C) 1997-2012 Etienne M. Gagnon <egagnon@j-meg.com>, +2009-2024 HHU Düsseldorf STUPS Group, and others. All rights reserved. See the file "AUTHORS" for the name of all copyright holders. diff --git a/README.md b/README.md index 218c163b8a96c6b7814ba0e0a52289f993a707fe..e19064079aacd2307e781e00342d42dc80f5c1c9 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,36 @@ -SableCC 3.2 - STUPS version -=== +# SableCC 3 - STUPS version -[](https://travis-ci.org/bendisposto/sablecc-stups) - -This work is based on SableCC 3.2 by Etienne Gagnon. +This work is based on SableCC 3.6 by Etienne Gagnon and others. Our version of SableCC enriches the abstract syntax tree with information about tokens. Contributors to the extension of SableCC are: - Fabian Fritz - Marc Büngener -- Jens Bendisposto +- Jens Bendisposto +- Joy Clark +- Sebastian Krings +- Domnink Hansen +- Michael Leuschel +- D. Geleßus -The authors of the SableCC version this work is based on are listed in the AUTHORS file. +The authors of the original SableCC version this work is based on are listed in the AUTHORS file. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -License ---- +## License This derived work is, like SableCC, covered by the GNU Lesser General Public License. You can view the copyright notice and the exact terms of the license in the files LICENSE, AUTHORS and COPYING-LESSER. -Building ---- +## Building * Clone the repository. * Run the `assemble` target using Gradle (`./gradlew assemble` on Linux/macOS/etc., `gradlew.bat assemble` on Windows). * The binary is located in the build/libs subdirectory. -Documentation ---- +## Documentation + You can find complete and detailed documentation on the SableCC framework and syntax at the site http://sablecc.org/documentation.html diff --git a/build.gradle b/build.gradle index dbf3fa55c9a6b64c5d9d8edf81fdbce4b83b9d80..927af5674067a922dfeea31256af40fad36bc8ec 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,13 @@ -apply plugin: 'application' -apply plugin: 'java' -apply plugin: 'eclipse' -apply plugin: 'maven-publish' -apply plugin: 'signing' +plugins { + id "application" + id "java" + id "maven-publish" + id "signing" +} allprojects { project.group = 'de.hhu.stups' - project.version = '3.8.0' + project.version = "3.9.0" project.ext.isSnapshot = project.version.endsWith("-SNAPSHOT") ext."signing.secretKeyRingFile" = rootProject.file("secring.gpg").absolutePath @@ -22,7 +23,6 @@ dependencies { java { sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 withSourcesJar() withJavadocJar() @@ -37,6 +37,14 @@ processResources { filesMatching("org/sablecc/sablecc/build.properties") { expand(version: project.version) } + + // Copy license-related files from repository root into resources + from(project.projectDir) { + rename({name -> "org/sablecc/sablecc/" + name}) + include("AUTHORS") + include("COPYING-LESSER") + include("LICENSE") + } } // Run this task to regenerate the SableCC parser using itself. diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e6441136f3d4ba8a0da8d277868979cfbc8ad796..a4b76b9530d66f5e68d973ea569d8e19de379189 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 a4413138c96c6ed29b6e2f5e147cd77426ae4409..df97d72b8b91fa0e088ae27b1c84a6063481fe22 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.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index b740cf13397ab16efc23cba3d6234ff8433403b1..f5feea6d6b116baaca5a2642d4d9fa1f47d574a7 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 7101f8e4676fcad8adc961e929ea3bcb37b5262f..9b42019c7915b971238526075306ffba3b666dd5 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## diff --git a/src/main/java/org/sablecc/sablecc/SableCC.java b/src/main/java/org/sablecc/sablecc/SableCC.java index 9524c41017ee9f5ad42567baa3a271c3275b4351..098a580155d801575395f9d44bb750c0f544c702 100644 --- a/src/main/java/org/sablecc/sablecc/SableCC.java +++ b/src/main/java/org/sablecc/sablecc/SableCC.java @@ -36,18 +36,16 @@ public class SableCC { private static void displayCopyright() { System.out.println(); - System.out.println("SableCC version " + Version.VERSION - + " HHU Version"); - System.out - .println("Copyright (C) 1997-2003 Etienne M. Gagnon <etienne.gagnon@uqam.ca> and"); - System.out.println("others. All rights reserved."); + System.out.println("SableCC STUPS version " + Version.VERSION); + System.out.println("Copyright (C) 1997-2012 Etienne M. Gagnon <egagnon@j-meg.com>,"); + System.out.println("2009-2024 HHU Düsseldorf STUPS Group, and others. All rights reserved."); System.out.println(); System.out .println("This software comes with ABSOLUTELY NO WARRANTY. This is free software,"); System.out .println("and you are welcome to redistribute it under certain conditions."); System.out.println(); - System.out.println("Type 'sablecc -license' to view"); + System.out.println("Type 'sablecc --license' to view"); System.out.println("the complete copyright notice and license."); System.out.println(); } diff --git a/src/main/java/org/sablecc/sablecc/lexer/Lexer.java b/src/main/java/org/sablecc/sablecc/lexer/Lexer.java index c38142abd0ab59a90dc6849b637833b758bb01b7..699b889a94b1fe19afa5f65c9b88599c8207bcb2 100644 --- a/src/main/java/org/sablecc/sablecc/lexer/Lexer.java +++ b/src/main/java/org/sablecc/sablecc/lexer/Lexer.java @@ -176,7 +176,7 @@ public class Lexer case -1: if(this.text.length() > 0) { - throw new LexerException("[" + (startLine + 1) + "," + (startPos + 1) + "] Unknown token: " + this.text); + throw new LexerException(startLine + 1, startPos + 1, "Unknown token: " + this.text); } return new EOF(startLine + 1, startPos + 1); @@ -350,7 +350,7 @@ public class Lexer break; default: - throw new LexerException("[" + (startLine + 1) + "," + (startPos + 1) + "] Internal lexer error: invalid accept table entry " + acceptToken + ", current text: " + this.text); + throw new LexerException(startLine + 1, startPos + 1, "Internal lexer error: invalid accept table entry " + acceptToken + ", current text: " + this.text); } pushBack(acceptLength); this.pos = acceptPos; diff --git a/src/main/java/org/sablecc/sablecc/lexer/LexerException.java b/src/main/java/org/sablecc/sablecc/lexer/LexerException.java index 9ae73de75599db94002bc36552904cd6cd2b6adf..0ba02b43df51105e2259aefc8b2eef48eb5525c5 100644 --- a/src/main/java/org/sablecc/sablecc/lexer/LexerException.java +++ b/src/main/java/org/sablecc/sablecc/lexer/LexerException.java @@ -2,11 +2,43 @@ package org.sablecc.sablecc.lexer; -@SuppressWarnings({"serial"}) +@SuppressWarnings("serial") public class LexerException extends Exception { + private final int line; + private final int pos; + private final String realMsg; + + public LexerException(int line, int pos, String message, Throwable cause) + { + super("[" + line + "," + pos + "] " + message, cause); + this.line = line; + this.pos = pos; + this.realMsg = message; + } + + public LexerException(int line, int pos, String message) + { + this(line, pos, message, null); + } + public LexerException(String message) { - super(message); + this(0, 0, message); + } + + public int getLine() + { + return this.line; + } + + public int getPos() + { + return this.pos; + } + + public String getRealMsg() + { + return this.realMsg; } } diff --git a/src/main/java/org/sablecc/sablecc/parser/Parser.java b/src/main/java/org/sablecc/sablecc/parser/Parser.java index 6f04f9d70c21b0cf4e7c0004b3f8fefd6ad4b23d..fc68fe725605ff6e538a81b0ba1964d8a4bc30b5 100644 --- a/src/main/java/org/sablecc/sablecc/parser/Parser.java +++ b/src/main/java/org/sablecc/sablecc/parser/Parser.java @@ -188,1618 +188,1618 @@ public class Parser implements IParser { List<?> list = new0(); push(goTo(0), list); + break; } - break; case 1: /* reduce AAgrammar2Grammar */ { List<?> list = new1(); push(goTo(0), list); + break; } - break; case 2: /* reduce AAgrammar3Grammar */ { List<?> list = new2(); push(goTo(0), list); + break; } - break; case 3: /* reduce AAgrammar4Grammar */ { List<?> list = new3(); push(goTo(0), list); + break; } - break; case 4: /* reduce AAgrammar5Grammar */ { List<?> list = new4(); push(goTo(0), list); + break; } - break; case 5: /* reduce AAgrammar6Grammar */ { List<?> list = new5(); push(goTo(0), list); + break; } - break; case 6: /* reduce AAgrammar7Grammar */ { List<?> list = new6(); push(goTo(0), list); + break; } - break; case 7: /* reduce AAgrammar8Grammar */ { List<?> list = new7(); push(goTo(0), list); + break; } - break; case 8: /* reduce AAgrammar9Grammar */ { List<?> list = new8(); push(goTo(0), list); + break; } - break; case 9: /* reduce AAgrammar10Grammar */ { List<?> list = new9(); push(goTo(0), list); + break; } - break; case 10: /* reduce AAgrammar11Grammar */ { List<?> list = new10(); push(goTo(0), list); + break; } - break; case 11: /* reduce AAgrammar12Grammar */ { List<?> list = new11(); push(goTo(0), list); + break; } - break; case 12: /* reduce AAgrammar13Grammar */ { List<?> list = new12(); push(goTo(0), list); + break; } - break; case 13: /* reduce AAgrammar14Grammar */ { List<?> list = new13(); push(goTo(0), list); + break; } - break; case 14: /* reduce AAgrammar15Grammar */ { List<?> list = new14(); push(goTo(0), list); + break; } - break; case 15: /* reduce AAgrammar16Grammar */ { List<?> list = new15(); push(goTo(0), list); + break; } - break; case 16: /* reduce AAgrammar17Grammar */ { List<?> list = new16(); push(goTo(0), list); + break; } - break; case 17: /* reduce AAgrammar18Grammar */ { List<?> list = new17(); push(goTo(0), list); + break; } - break; case 18: /* reduce AAgrammar19Grammar */ { List<?> list = new18(); push(goTo(0), list); + break; } - break; case 19: /* reduce AAgrammar20Grammar */ { List<?> list = new19(); push(goTo(0), list); + break; } - break; case 20: /* reduce AAgrammar21Grammar */ { List<?> list = new20(); push(goTo(0), list); + break; } - break; case 21: /* reduce AAgrammar22Grammar */ { List<?> list = new21(); push(goTo(0), list); + break; } - break; case 22: /* reduce AAgrammar23Grammar */ { List<?> list = new22(); push(goTo(0), list); + break; } - break; case 23: /* reduce AAgrammar24Grammar */ { List<?> list = new23(); push(goTo(0), list); + break; } - break; case 24: /* reduce AAgrammar25Grammar */ { List<?> list = new24(); push(goTo(0), list); + break; } - break; case 25: /* reduce AAgrammar26Grammar */ { List<?> list = new25(); push(goTo(0), list); + break; } - break; case 26: /* reduce AAgrammar27Grammar */ { List<?> list = new26(); push(goTo(0), list); + break; } - break; case 27: /* reduce AAgrammar28Grammar */ { List<?> list = new27(); push(goTo(0), list); + break; } - break; case 28: /* reduce AAgrammar29Grammar */ { List<?> list = new28(); push(goTo(0), list); + break; } - break; case 29: /* reduce AAgrammar30Grammar */ { List<?> list = new29(); push(goTo(0), list); + break; } - break; case 30: /* reduce AAgrammar31Grammar */ { List<?> list = new30(); push(goTo(0), list); + break; } - break; case 31: /* reduce AAgrammar32Grammar */ { List<?> list = new31(); push(goTo(0), list); + break; } - break; case 32: /* reduce AAgrammar33Grammar */ { List<?> list = new32(); push(goTo(0), list); + break; } - break; case 33: /* reduce AAgrammar34Grammar */ { List<?> list = new33(); push(goTo(0), list); + break; } - break; case 34: /* reduce AAgrammar35Grammar */ { List<?> list = new34(); push(goTo(0), list); + break; } - break; case 35: /* reduce AAgrammar36Grammar */ { List<?> list = new35(); push(goTo(0), list); + break; } - break; case 36: /* reduce AAgrammar37Grammar */ { List<?> list = new36(); push(goTo(0), list); + break; } - break; case 37: /* reduce AAgrammar38Grammar */ { List<?> list = new37(); push(goTo(0), list); + break; } - break; case 38: /* reduce AAgrammar39Grammar */ { List<?> list = new38(); push(goTo(0), list); + break; } - break; case 39: /* reduce AAgrammar40Grammar */ { List<?> list = new39(); push(goTo(0), list); + break; } - break; case 40: /* reduce AAgrammar41Grammar */ { List<?> list = new40(); push(goTo(0), list); + break; } - break; case 41: /* reduce AAgrammar42Grammar */ { List<?> list = new41(); push(goTo(0), list); + break; } - break; case 42: /* reduce AAgrammar43Grammar */ { List<?> list = new42(); push(goTo(0), list); + break; } - break; case 43: /* reduce AAgrammar44Grammar */ { List<?> list = new43(); push(goTo(0), list); + break; } - break; case 44: /* reduce AAgrammar45Grammar */ { List<?> list = new44(); push(goTo(0), list); + break; } - break; case 45: /* reduce AAgrammar46Grammar */ { List<?> list = new45(); push(goTo(0), list); + break; } - break; case 46: /* reduce AAgrammar47Grammar */ { List<?> list = new46(); push(goTo(0), list); + break; } - break; case 47: /* reduce AAgrammar48Grammar */ { List<?> list = new47(); push(goTo(0), list); + break; } - break; case 48: /* reduce AAgrammar49Grammar */ { List<?> list = new48(); push(goTo(0), list); + break; } - break; case 49: /* reduce AAgrammar50Grammar */ { List<?> list = new49(); push(goTo(0), list); + break; } - break; case 50: /* reduce AAgrammar51Grammar */ { List<?> list = new50(); push(goTo(0), list); + break; } - break; case 51: /* reduce AAgrammar52Grammar */ { List<?> list = new51(); push(goTo(0), list); + break; } - break; case 52: /* reduce AAgrammar53Grammar */ { List<?> list = new52(); push(goTo(0), list); + break; } - break; case 53: /* reduce AAgrammar54Grammar */ { List<?> list = new53(); push(goTo(0), list); + break; } - break; case 54: /* reduce AAgrammar55Grammar */ { List<?> list = new54(); push(goTo(0), list); + break; } - break; case 55: /* reduce AAgrammar56Grammar */ { List<?> list = new55(); push(goTo(0), list); + break; } - break; case 56: /* reduce AAgrammar57Grammar */ { List<?> list = new56(); push(goTo(0), list); + break; } - break; case 57: /* reduce AAgrammar58Grammar */ { List<?> list = new57(); push(goTo(0), list); + break; } - break; case 58: /* reduce AAgrammar59Grammar */ { List<?> list = new58(); push(goTo(0), list); + break; } - break; case 59: /* reduce AAgrammar60Grammar */ { List<?> list = new59(); push(goTo(0), list); + break; } - break; case 60: /* reduce AAgrammar61Grammar */ { List<?> list = new60(); push(goTo(0), list); + break; } - break; case 61: /* reduce AAgrammar62Grammar */ { List<?> list = new61(); push(goTo(0), list); + break; } - break; case 62: /* reduce AAgrammar63Grammar */ { List<?> list = new62(); push(goTo(0), list); + break; } - break; case 63: /* reduce AAgrammar64Grammar */ { List<?> list = new63(); push(goTo(0), list); + break; } - break; case 64: /* reduce AAgrammar65Grammar */ { List<?> list = new64(); push(goTo(0), list); + break; } - break; case 65: /* reduce AAgrammar66Grammar */ { List<?> list = new65(); push(goTo(0), list); + break; } - break; case 66: /* reduce AAgrammar67Grammar */ { List<?> list = new66(); push(goTo(0), list); + break; } - break; case 67: /* reduce AAgrammar68Grammar */ { List<?> list = new67(); push(goTo(0), list); + break; } - break; case 68: /* reduce AAgrammar69Grammar */ { List<?> list = new68(); push(goTo(0), list); + break; } - break; case 69: /* reduce AAgrammar70Grammar */ { List<?> list = new69(); push(goTo(0), list); + break; } - break; case 70: /* reduce AAgrammar71Grammar */ { List<?> list = new70(); push(goTo(0), list); + break; } - break; case 71: /* reduce AAgrammar72Grammar */ { List<?> list = new71(); push(goTo(0), list); + break; } - break; case 72: /* reduce AAgrammar73Grammar */ { List<?> list = new72(); push(goTo(0), list); + break; } - break; case 73: /* reduce AAgrammar74Grammar */ { List<?> list = new73(); push(goTo(0), list); + break; } - break; case 74: /* reduce AAgrammar75Grammar */ { List<?> list = new74(); push(goTo(0), list); + break; } - break; case 75: /* reduce AAgrammar76Grammar */ { List<?> list = new75(); push(goTo(0), list); + break; } - break; case 76: /* reduce AAgrammar77Grammar */ { List<?> list = new76(); push(goTo(0), list); + break; } - break; case 77: /* reduce AAgrammar78Grammar */ { List<?> list = new77(); push(goTo(0), list); + break; } - break; case 78: /* reduce AAgrammar79Grammar */ { List<?> list = new78(); push(goTo(0), list); + break; } - break; case 79: /* reduce AAgrammar80Grammar */ { List<?> list = new79(); push(goTo(0), list); + break; } - break; case 80: /* reduce AAgrammar81Grammar */ { List<?> list = new80(); push(goTo(0), list); + break; } - break; case 81: /* reduce AAgrammar82Grammar */ { List<?> list = new81(); push(goTo(0), list); + break; } - break; case 82: /* reduce AAgrammar83Grammar */ { List<?> list = new82(); push(goTo(0), list); + break; } - break; case 83: /* reduce AAgrammar84Grammar */ { List<?> list = new83(); push(goTo(0), list); + break; } - break; case 84: /* reduce AAgrammar85Grammar */ { List<?> list = new84(); push(goTo(0), list); + break; } - break; case 85: /* reduce AAgrammar86Grammar */ { List<?> list = new85(); push(goTo(0), list); + break; } - break; case 86: /* reduce AAgrammar87Grammar */ { List<?> list = new86(); push(goTo(0), list); + break; } - break; case 87: /* reduce AAgrammar88Grammar */ { List<?> list = new87(); push(goTo(0), list); + break; } - break; case 88: /* reduce AAgrammar89Grammar */ { List<?> list = new88(); push(goTo(0), list); + break; } - break; case 89: /* reduce AAgrammar90Grammar */ { List<?> list = new89(); push(goTo(0), list); + break; } - break; case 90: /* reduce AAgrammar91Grammar */ { List<?> list = new90(); push(goTo(0), list); + break; } - break; case 91: /* reduce AAgrammar92Grammar */ { List<?> list = new91(); push(goTo(0), list); + break; } - break; case 92: /* reduce AAgrammar93Grammar */ { List<?> list = new92(); push(goTo(0), list); + break; } - break; case 93: /* reduce AAgrammar94Grammar */ { List<?> list = new93(); push(goTo(0), list); + break; } - break; case 94: /* reduce AAgrammar95Grammar */ { List<?> list = new94(); push(goTo(0), list); + break; } - break; case 95: /* reduce AAgrammar96Grammar */ { List<?> list = new95(); push(goTo(0), list); + break; } - break; case 96: /* reduce AAgrammar97Grammar */ { List<?> list = new96(); push(goTo(0), list); + break; } - break; case 97: /* reduce AAgrammar98Grammar */ { List<?> list = new97(); push(goTo(0), list); + break; } - break; case 98: /* reduce AAgrammar99Grammar */ { List<?> list = new98(); push(goTo(0), list); + break; } - break; case 99: /* reduce AAgrammar100Grammar */ { List<?> list = new99(); push(goTo(0), list); + break; } - break; case 100: /* reduce AAgrammar101Grammar */ { List<?> list = new100(); push(goTo(0), list); + break; } - break; case 101: /* reduce AAgrammar102Grammar */ { List<?> list = new101(); push(goTo(0), list); + break; } - break; case 102: /* reduce AAgrammar103Grammar */ { List<?> list = new102(); push(goTo(0), list); + break; } - break; case 103: /* reduce AAgrammar104Grammar */ { List<?> list = new103(); push(goTo(0), list); + break; } - break; case 104: /* reduce AAgrammar105Grammar */ { List<?> list = new104(); push(goTo(0), list); + break; } - break; case 105: /* reduce AAgrammar106Grammar */ { List<?> list = new105(); push(goTo(0), list); + break; } - break; case 106: /* reduce AAgrammar107Grammar */ { List<?> list = new106(); push(goTo(0), list); + break; } - break; case 107: /* reduce AAgrammar108Grammar */ { List<?> list = new107(); push(goTo(0), list); + break; } - break; case 108: /* reduce AAgrammar109Grammar */ { List<?> list = new108(); push(goTo(0), list); + break; } - break; case 109: /* reduce AAgrammar110Grammar */ { List<?> list = new109(); push(goTo(0), list); + break; } - break; case 110: /* reduce AAgrammar111Grammar */ { List<?> list = new110(); push(goTo(0), list); + break; } - break; case 111: /* reduce AAgrammar112Grammar */ { List<?> list = new111(); push(goTo(0), list); + break; } - break; case 112: /* reduce AAgrammar113Grammar */ { List<?> list = new112(); push(goTo(0), list); + break; } - break; case 113: /* reduce AAgrammar114Grammar */ { List<?> list = new113(); push(goTo(0), list); + break; } - break; case 114: /* reduce AAgrammar115Grammar */ { List<?> list = new114(); push(goTo(0), list); + break; } - break; case 115: /* reduce AAgrammar116Grammar */ { List<?> list = new115(); push(goTo(0), list); + break; } - break; case 116: /* reduce AAgrammar117Grammar */ { List<?> list = new116(); push(goTo(0), list); + break; } - break; case 117: /* reduce AAgrammar118Grammar */ { List<?> list = new117(); push(goTo(0), list); + break; } - break; case 118: /* reduce AAgrammar119Grammar */ { List<?> list = new118(); push(goTo(0), list); + break; } - break; case 119: /* reduce AAgrammar120Grammar */ { List<?> list = new119(); push(goTo(0), list); + break; } - break; case 120: /* reduce AAgrammar121Grammar */ { List<?> list = new120(); push(goTo(0), list); + break; } - break; case 121: /* reduce AAgrammar122Grammar */ { List<?> list = new121(); push(goTo(0), list); + break; } - break; case 122: /* reduce AAgrammar123Grammar */ { List<?> list = new122(); push(goTo(0), list); + break; } - break; case 123: /* reduce AAgrammar124Grammar */ { List<?> list = new123(); push(goTo(0), list); + break; } - break; case 124: /* reduce AAgrammar125Grammar */ { List<?> list = new124(); push(goTo(0), list); + break; } - break; case 125: /* reduce AAgrammar126Grammar */ { List<?> list = new125(); push(goTo(0), list); + break; } - break; case 126: /* reduce AAgrammar127Grammar */ { List<?> list = new126(); push(goTo(0), list); + break; } - break; case 127: /* reduce AAgrammar128Grammar */ { List<?> list = new127(); push(goTo(0), list); + break; } - break; case 128: /* reduce APackage */ { List<?> list = new128(); push(goTo(1), list); + break; } - break; case 129: /* reduce AApkgname1PkgName */ { List<?> list = new129(); push(goTo(2), list); + break; } - break; case 130: /* reduce AApkgname2PkgName */ { List<?> list = new130(); push(goTo(2), list); + break; } - break; case 131: /* reduce APkgNameTail */ { List<?> list = new131(); push(goTo(3), list); + break; } - break; case 132: /* reduce AHelpers */ { List<?> list = new132(); push(goTo(4), list); + break; } - break; case 133: /* reduce AHelperDef */ { List<?> list = new133(); push(goTo(5), list); + break; } - break; case 134: /* reduce AStates */ { List<?> list = new134(); push(goTo(6), list); + break; } - break; case 135: /* reduce AAidlist1IdList */ { List<?> list = new135(); push(goTo(7), list); + break; } - break; case 136: /* reduce AAidlist2IdList */ { List<?> list = new136(); push(goTo(7), list); + break; } - break; case 137: /* reduce AIdListTail */ { List<?> list = new137(); push(goTo(8), list); + break; } - break; case 138: /* reduce ATokens */ { List<?> list = new138(); push(goTo(9), list); + break; } - break; case 139: /* reduce AAtokendef1TokenDef */ { List<?> list = new139(); push(goTo(10), list); + break; } - break; case 140: /* reduce AAtokendef2TokenDef */ { List<?> list = new140(); push(goTo(10), list); + break; } - break; case 141: /* reduce AAtokendef3TokenDef */ { List<?> list = new141(); push(goTo(10), list); + break; } - break; case 142: /* reduce AAtokendef4TokenDef */ { List<?> list = new142(); push(goTo(10), list); + break; } - break; case 143: /* reduce AAstatelist1StateList */ { List<?> list = new143(); push(goTo(11), list); + break; } - break; case 144: /* reduce AAstatelist2StateList */ { List<?> list = new144(); push(goTo(11), list); + break; } - break; case 145: /* reduce AAstatelist3StateList */ { List<?> list = new145(); push(goTo(11), list); + break; } - break; case 146: /* reduce AAstatelist4StateList */ { List<?> list = new146(); push(goTo(11), list); + break; } - break; case 147: /* reduce AAstatelisttail1StateListTail */ { List<?> list = new147(); push(goTo(12), list); + break; } - break; case 148: /* reduce AAstatelisttail2StateListTail */ { List<?> list = new148(); push(goTo(12), list); + break; } - break; case 149: /* reduce ATransition */ { List<?> list = new149(); push(goTo(13), list); + break; } - break; case 150: /* reduce AAigntokens1IgnTokens */ { List<?> list = new150(); push(goTo(14), list); + break; } - break; case 151: /* reduce AAigntokens2IgnTokens */ { List<?> list = new151(); push(goTo(14), list); + break; } - break; case 152: /* reduce ALookAhead */ { List<?> list = new152(); push(goTo(15), list); + break; } - break; case 153: /* reduce AAregexp1RegExp */ { List<?> list = new153(); push(goTo(16), list); + break; } - break; case 154: /* reduce AAregexp2RegExp */ { List<?> list = new154(); push(goTo(16), list); + break; } - break; case 155: /* reduce ARegExpTail */ { List<?> list = new155(); push(goTo(17), list); + break; } - break; case 156: /* reduce AAconcat1Concat */ { List<?> list = new156(); push(goTo(18), list); + break; } - break; case 157: /* reduce AAconcat2Concat */ { List<?> list = new157(); push(goTo(18), list); + break; } - break; case 158: /* reduce AAunexp1UnExp */ { List<?> list = new158(); push(goTo(19), list); + break; } - break; case 159: /* reduce AAunexp2UnExp */ { List<?> list = new159(); push(goTo(19), list); + break; } - break; case 160: /* reduce ACharBasic */ { List<?> list = new160(); push(goTo(20), list); + break; } - break; case 161: /* reduce ASetBasic */ { List<?> list = new161(); push(goTo(20), list); + break; } - break; case 162: /* reduce AStringBasic */ { List<?> list = new162(); push(goTo(20), list); + break; } - break; case 163: /* reduce AIdBasic */ { List<?> list = new163(); push(goTo(20), list); + break; } - break; case 164: /* reduce ARegExpBasic */ { List<?> list = new164(); push(goTo(20), list); + break; } - break; case 165: /* reduce ACharChar */ { List<?> list = new165(); push(goTo(21), list); + break; } - break; case 166: /* reduce ADecChar */ { List<?> list = new166(); push(goTo(21), list); + break; } - break; case 167: /* reduce AHexChar */ { List<?> list = new167(); push(goTo(21), list); + break; } - break; case 168: /* reduce AOperationSet */ { List<?> list = new168(); push(goTo(22), list); + break; } - break; case 169: /* reduce AIntervalSet */ { List<?> list = new169(); push(goTo(22), list); + break; } - break; case 170: /* reduce AStarUnOp */ { List<?> list = new170(); push(goTo(23), list); + break; } - break; case 171: /* reduce AQMarkUnOp */ { List<?> list = new171(); push(goTo(23), list); + break; } - break; case 172: /* reduce APlusUnOp */ { List<?> list = new172(); push(goTo(23), list); + break; } - break; case 173: /* reduce APlusBinOp */ { List<?> list = new173(); push(goTo(24), list); + break; } - break; case 174: /* reduce AMinusBinOp */ { List<?> list = new174(); push(goTo(24), list); + break; } - break; case 175: /* reduce AProductions */ { List<?> list = new175(); push(goTo(25), list); + break; } - break; case 176: /* reduce AAprod1Prod */ { List<?> list = new176(); push(goTo(26), list); + break; } - break; case 177: /* reduce AAprod2Prod */ { List<?> list = new177(); push(goTo(26), list); + break; } - break; case 178: /* reduce AAprodtransform1ProdTransform */ { List<?> list = new178(); push(goTo(27), list); + break; } - break; case 179: /* reduce AAprodtransform2ProdTransform */ { List<?> list = new179(); push(goTo(27), list); + break; } - break; case 180: /* reduce AAalts1Alts */ { List<?> list = new180(); push(goTo(28), list); + break; } - break; case 181: /* reduce AAalts2Alts */ { List<?> list = new181(); push(goTo(28), list); + break; } - break; case 182: /* reduce AAltsTail */ { List<?> list = new182(); push(goTo(29), list); + break; } - break; case 183: /* reduce AAalt1Alt */ { List<?> list = new183(); push(goTo(30), list); + break; } - break; case 184: /* reduce AAalt2Alt */ { List<?> list = new184(); push(goTo(30), list); + break; } - break; case 185: /* reduce AAalt3Alt */ { List<?> list = new185(); push(goTo(30), list); + break; } - break; case 186: /* reduce AAalt4Alt */ { List<?> list = new186(); push(goTo(30), list); + break; } - break; case 187: /* reduce AAalt5Alt */ { List<?> list = new187(); push(goTo(30), list); + break; } - break; case 188: /* reduce AAalt6Alt */ { List<?> list = new188(); push(goTo(30), list); + break; } - break; case 189: /* reduce AAalt7Alt */ { List<?> list = new189(); push(goTo(30), list); + break; } - break; case 190: /* reduce AAalt8Alt */ { List<?> list = new190(); push(goTo(30), list); + break; } - break; case 191: /* reduce AAalttransform1AltTransform */ { List<?> list = new191(); push(goTo(31), list); + break; } - break; case 192: /* reduce AAalttransform2AltTransform */ { List<?> list = new192(); push(goTo(31), list); + break; } - break; case 193: /* reduce AAnewterm1Term */ { List<?> list = new193(); push(goTo(32), list); + break; } - break; case 194: /* reduce AAnewterm2Term */ { List<?> list = new194(); push(goTo(32), list); + break; } - break; case 195: /* reduce AAlistterm1Term */ { List<?> list = new195(); push(goTo(32), list); + break; } - break; case 196: /* reduce AAlistterm2Term */ { List<?> list = new196(); push(goTo(32), list); + break; } - break; case 197: /* reduce AAsimpleterm1Term */ { List<?> list = new197(); push(goTo(32), list); + break; } - break; case 198: /* reduce AAsimpleterm2Term */ { List<?> list = new198(); push(goTo(32), list); + break; } - break; case 199: /* reduce AAsimpleterm3Term */ { List<?> list = new199(); push(goTo(32), list); + break; } - break; case 200: /* reduce AAsimpleterm4Term */ { List<?> list = new200(); push(goTo(32), list); + break; } - break; case 201: /* reduce ANullTerm */ { List<?> list = new201(); push(goTo(32), list); + break; } - break; case 202: /* reduce AAlistoflistterm1ListOfListTerm */ { List<?> list = new202(); push(goTo(33), list); + break; } - break; case 203: /* reduce AAlistoflistterm2ListOfListTerm */ { List<?> list = new203(); push(goTo(33), list); + break; } - break; case 204: /* reduce AAnewlistterm1ListTerm */ { List<?> list = new204(); push(goTo(34), list); + break; } - break; case 205: /* reduce AAnewlistterm2ListTerm */ { List<?> list = new205(); push(goTo(34), list); + break; } - break; case 206: /* reduce AAsimplelistterm1ListTerm */ { List<?> list = new206(); push(goTo(34), list); + break; } - break; case 207: /* reduce AAsimplelistterm2ListTerm */ { List<?> list = new207(); push(goTo(34), list); + break; } - break; case 208: /* reduce AAsimplelistterm3ListTerm */ { List<?> list = new208(); push(goTo(34), list); + break; } - break; case 209: /* reduce AAsimplelistterm4ListTerm */ { List<?> list = new209(); push(goTo(34), list); + break; } - break; case 210: /* reduce AListTermTail */ { List<?> list = new210(); push(goTo(35), list); + break; } - break; case 211: /* reduce ASimpleTermTail */ { List<?> list = new211(); push(goTo(36), list); + break; } - break; case 212: /* reduce AAprodname1ProdName */ { List<?> list = new212(); push(goTo(37), list); + break; } - break; case 213: /* reduce AAprodname2ProdName */ { List<?> list = new213(); push(goTo(37), list); + break; } - break; case 214: /* reduce AProdNameTail */ { List<?> list = new214(); push(goTo(38), list); + break; } - break; case 215: /* reduce AAparams1Params */ { List<?> list = new215(); push(goTo(39), list); + break; } - break; case 216: /* reduce AAparams2Params */ { List<?> list = new216(); push(goTo(39), list); + break; } - break; case 217: /* reduce AParamsTail */ { List<?> list = new217(); push(goTo(40), list); + break; } - break; case 218: /* reduce AAltName */ { List<?> list = new218(); push(goTo(41), list); + break; } - break; case 219: /* reduce AAelem1Elem */ { List<?> list = new219(); push(goTo(42), list); + break; } - break; case 220: /* reduce AAelem2Elem */ { List<?> list = new220(); push(goTo(42), list); + break; } - break; case 221: /* reduce AAelem3Elem */ { List<?> list = new221(); push(goTo(42), list); + break; } - break; case 222: /* reduce AAelem4Elem */ { List<?> list = new222(); push(goTo(42), list); + break; } - break; case 223: /* reduce AAelem5Elem */ { List<?> list = new223(); push(goTo(42), list); + break; } - break; case 224: /* reduce AAelem6Elem */ { List<?> list = new224(); push(goTo(42), list); + break; } - break; case 225: /* reduce AAelem7Elem */ { List<?> list = new225(); push(goTo(42), list); + break; } - break; case 226: /* reduce AAelem8Elem */ { List<?> list = new226(); push(goTo(42), list); + break; } - break; case 227: /* reduce AElemName */ { List<?> list = new227(); push(goTo(43), list); + break; } - break; case 228: /* reduce ATokenSpecifier */ { List<?> list = new228(); push(goTo(44), list); + break; } - break; case 229: /* reduce AProductionSpecifier */ { List<?> list = new229(); push(goTo(44), list); + break; } - break; case 230: /* reduce AAst */ { List<?> list = new230(); push(goTo(45), list); + break; } - break; case 231: /* reduce AAstProd */ { List<?> list = new231(); push(goTo(46), list); + break; } - break; case 232: /* reduce AAastalts1AstAlts */ { List<?> list = new232(); push(goTo(47), list); + break; } - break; case 233: /* reduce AAastalts2AstAlts */ { List<?> list = new233(); push(goTo(47), list); + break; } - break; case 234: /* reduce AAstAltsTail */ { List<?> list = new234(); push(goTo(48), list); + break; } - break; case 235: /* reduce AAastalt1AstAlt */ { List<?> list = new235(); push(goTo(49), list); + break; } - break; case 236: /* reduce AAastalt2AstAlt */ { List<?> list = new236(); push(goTo(49), list); + break; } - break; case 237: /* reduce AAastalt3AstAlt */ { List<?> list = new237(); push(goTo(49), list); + break; } - break; case 238: /* reduce AAastalt4AstAlt */ { List<?> list = new238(); push(goTo(49), list); + break; } - break; case 239: /* reduce ATerminal$PkgNameTail */ { List<?> list = new239(); push(goTo(50), list); + break; } - break; case 240: /* reduce ANonTerminal$PkgNameTail */ { List<?> list = new240(); push(goTo(50), list); + break; } - break; case 241: /* reduce ATerminal$HelperDef */ { List<?> list = new241(); push(goTo(51), list); + break; } - break; case 242: /* reduce ANonTerminal$HelperDef */ { List<?> list = new242(); push(goTo(51), list); + break; } - break; case 243: /* reduce ATerminal$IdListTail */ { List<?> list = new243(); push(goTo(52), list); + break; } - break; case 244: /* reduce ANonTerminal$IdListTail */ { List<?> list = new244(); push(goTo(52), list); + break; } - break; case 245: /* reduce ATerminal$TokenDef */ { List<?> list = new245(); push(goTo(53), list); + break; } - break; case 246: /* reduce ANonTerminal$TokenDef */ { List<?> list = new246(); push(goTo(53), list); + break; } - break; case 247: /* reduce ATerminal$StateListTail */ { List<?> list = new247(); push(goTo(54), list); + break; } - break; case 248: /* reduce ANonTerminal$StateListTail */ { List<?> list = new248(); push(goTo(54), list); + break; } - break; case 249: /* reduce ATerminal$RegExpTail */ { List<?> list = new249(); push(goTo(55), list); + break; } - break; case 250: /* reduce ANonTerminal$RegExpTail */ { List<?> list = new250(); push(goTo(55), list); + break; } - break; case 251: /* reduce ATerminal$UnExp */ { List<?> list = new251(); push(goTo(56), list); + break; } - break; case 252: /* reduce ANonTerminal$UnExp */ { List<?> list = new252(); push(goTo(56), list); + break; } - break; case 253: /* reduce ATerminal$Prod */ { List<?> list = new253(); push(goTo(57), list); + break; } - break; case 254: /* reduce ANonTerminal$Prod */ { List<?> list = new254(); push(goTo(57), list); + break; } - break; case 255: /* reduce ATerminal$Elem */ { List<?> list = new255(); push(goTo(58), list); + break; } - break; case 256: /* reduce ANonTerminal$Elem */ { List<?> list = new256(); push(goTo(58), list); + break; } - break; case 257: /* reduce ATerminal$AltsTail */ { List<?> list = new257(); push(goTo(59), list); + break; } - break; case 258: /* reduce ANonTerminal$AltsTail */ { List<?> list = new258(); push(goTo(59), list); + break; } - break; case 259: /* reduce ATerminal$Term */ { List<?> list = new259(); push(goTo(60), list); + break; } - break; case 260: /* reduce ANonTerminal$Term */ { List<?> list = new260(); push(goTo(60), list); + break; } - break; case 261: /* reduce ATerminal$ListTermTail */ { List<?> list = new261(); push(goTo(61), list); + break; } - break; case 262: /* reduce ANonTerminal$ListTermTail */ { List<?> list = new262(); push(goTo(61), list); + break; } - break; case 263: /* reduce ATerminal$ParamsTail */ { List<?> list = new263(); push(goTo(62), list); + break; } - break; case 264: /* reduce ANonTerminal$ParamsTail */ { List<?> list = new264(); push(goTo(62), list); + break; } - break; case 265: /* reduce ATerminal$AstProd */ { List<?> list = new265(); push(goTo(63), list); + break; } - break; case 266: /* reduce ANonTerminal$AstProd */ { List<?> list = new266(); push(goTo(63), list); + break; } - break; case 267: /* reduce ATerminal$AstAltsTail */ { List<?> list = new267(); push(goTo(64), list); + break; } - break; case 268: /* reduce ANonTerminal$AstAltsTail */ { List<?> list = new268(); push(goTo(64), list); + break; } - break; default: - throw new ParserException(lastToken, "[" + lastToken.getLine() + "," + lastToken.getPos() + "] Internal parser error: invalid action table REDUCE destination " + destination + ", current state " + state()); + throw new ParserException(lastToken, "Internal parser error: invalid action table REDUCE destination " + destination + ", current state " + state()); } break; @@ -1809,12 +1809,10 @@ public class Parser implements IParser return new Start(top, eof); case ERROR: - throw new ParserException(lastToken, - "[" + lastToken.getLine() + "," + lastToken.getPos() + "] " , - Parser.errorMessages[Parser.errors[destination]]); + throw new ParserException(lastToken, 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()); + throw new ParserException(lastToken, "Internal parser error: invalid action table entry " + action + ", destination " + destination + ", current state " + state()); } } } diff --git a/src/main/java/org/sablecc/sablecc/parser/ParserException.java b/src/main/java/org/sablecc/sablecc/parser/ParserException.java index 518b8ecd4692c662aa3427323fd33837131eacec..af942d5f627bbdf9d6295f3259875bc659afe4c0 100644 --- a/src/main/java/org/sablecc/sablecc/parser/ParserException.java +++ b/src/main/java/org/sablecc/sablecc/parser/ParserException.java @@ -2,20 +2,31 @@ package org.sablecc.sablecc.parser; -import org.sablecc.sablecc.node.*; +import org.sablecc.sablecc.node.Token; @SuppressWarnings("serial") public class ParserException extends Exception { - Token token; - String realMsg; + private final Token token; + private final String realMsg; - public ParserException(Token token, String message) + public ParserException(Token token, String message, Throwable cause) { - super(message); + super("[" + token.getLine() + "," + token.getPos() + "] " + message, cause); this.token = token; + this.realMsg = message; + } + + public ParserException(Token token, String message) + { + this(token, message, (Throwable)null); } + /** + * @deprecated Use {@link #ParserException(Token, String)} instead. + * The token position info is now added automatically to the message. + */ + @Deprecated public ParserException(Token token, String prefix, String message) { super(prefix+message); diff --git a/src/main/resources/org/sablecc/sablecc/lexer.txt b/src/main/resources/org/sablecc/sablecc/lexer.txt index c877b18803adbde214f1aeb8ac1584b94194fd03..c74200908f72bef26a40363bafbcb04ffe4c6ff1 100644 --- a/src/main/resources/org/sablecc/sablecc/lexer.txt +++ b/src/main/resources/org/sablecc/sablecc/lexer.txt @@ -10,12 +10,44 @@ Macro:LexerException package $0$lexer; -@SuppressWarnings({"serial"}) +@SuppressWarnings("serial") public class LexerException extends Exception { + private final int line; + private final int pos; + private final String realMsg; + + public LexerException(int line, int pos, String message, Throwable cause) + { + super("[" + line + "," + pos + "] " + message, cause); + this.line = line; + this.pos = pos; + this.realMsg = message; + } + + public LexerException(int line, int pos, String message) + { + this(line, pos, message, null); + } + public LexerException(String message) { - super(message); + this(0, 0, message); + } + + public int getLine() + { + return this.line; + } + + public int getPos() + { + return this.pos; + } + + public String getRealMsg() + { + return this.realMsg; } } @@ -200,7 +232,7 @@ public class Lexer case -1: if(this.text.length() > 0) { - throw new LexerException("[" + (startLine + 1) + "," + (startPos + 1) + "] Unknown token: " + this.text); + throw new LexerException(startLine + 1, startPos + 1, "Unknown token: " + this.text); } return new EOF(startLine + 1, startPos + 1); @@ -244,7 +276,7 @@ $ Macro:LexerBody default: - throw new LexerException("[" + (startLine + 1) + "," + (startPos + 1) + "] Internal lexer error: invalid accept table entry " + acceptToken + ", current text: " + this.text); + throw new LexerException(startLine + 1, startPos + 1, "Internal lexer error: invalid accept table entry " + acceptToken + ", current text: " + this.text); } pushBack(acceptLength); this.pos = acceptPos; diff --git a/src/main/resources/org/sablecc/sablecc/parser.txt b/src/main/resources/org/sablecc/sablecc/parser.txt index 72b1419148fb67793cc751dfde29c5b5ddd8053f..c5c45d81c022ae9a5aa9238abfc1babbb8763f97 100644 --- a/src/main/resources/org/sablecc/sablecc/parser.txt +++ b/src/main/resources/org/sablecc/sablecc/parser.txt @@ -200,14 +200,14 @@ Macro:ParserParseReduce { List<?> list = new$0$(); push(goTo($1$), list); + break; } - break; $ Macro:ParserParseTail default: - throw new ParserException(lastToken, "[" + lastToken.getLine() + "," + lastToken.getPos() + "] Internal parser error: invalid action table REDUCE destination " + destination + ", current state " + state()); + throw new ParserException(lastToken, "Internal parser error: invalid action table REDUCE destination " + destination + ", current state " + state()); } break; @@ -217,12 +217,10 @@ Macro:ParserParseTail return new Start(top, eof); case ERROR: - throw new ParserException(lastToken, - "[" + lastToken.getLine() + "," + lastToken.getPos() + "] " , - Parser.errorMessages[Parser.errors[destination]]); + throw new ParserException(lastToken, 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()); + throw new ParserException(lastToken, "Internal parser error: invalid action table entry " + action + ", destination " + destination + ", current state " + state()); } } } @@ -506,20 +504,31 @@ Macro:ParserException package $0$parser; -import $0$node.*; +import $0$node.Token; @SuppressWarnings("serial") public class ParserException extends Exception { - Token token; - String realMsg; + private final Token token; + private final String realMsg; - public ParserException(Token token, String message) + public ParserException(Token token, String message, Throwable cause) { - super(message); + super("[" + token.getLine() + "," + token.getPos() + "] " + message, cause); this.token = token; + this.realMsg = message; + } + + public ParserException(Token token, String message) + { + this(token, message, (Throwable)null); } + /** + * @deprecated Use {@link #ParserException(Token, String)} instead. + * The token position info is now added automatically to the message. + */ + @Deprecated public ParserException(Token token, String prefix, String message) { super(prefix+message);