From 74dcd97613a047a7ff031cf7537f6878447fe761 Mon Sep 17 00:00:00 2001 From: Cameron Samak Date: Fri, 4 Jun 2021 17:20:20 +0000 Subject: [PATCH] More parser compatibility fixes for JavaCC/JJTree I'm not sure why STATIC=false was commented out? Without it, generating the parser with JavaCC does not work. The Parser constructor taking String throws ParseException (a checked exception) when generated with JavaCC. I'm not sure why, but the StringProvider exception does not. For the pragmaValue changes, unreachable statements were generated. See http://consoliii.blogspot.com/2014/05/javacc-modern-mode-how-to-resolve.html With these changes I'm able to use JavaCC and everything passes again. --- .../apache/commons/jexl3/internal/Engine.java | 5 ++-- .../apache/commons/jexl3/parser/Parser.jjt | 24 ++++++++++++------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/apache/commons/jexl3/internal/Engine.java b/src/main/java/org/apache/commons/jexl3/internal/Engine.java index 2aeed16ce..6b78ad4b9 100644 --- a/src/main/java/org/apache/commons/jexl3/internal/Engine.java +++ b/src/main/java/org/apache/commons/jexl3/internal/Engine.java @@ -40,6 +40,7 @@ import org.apache.commons.jexl3.parser.ASTStringLiteral; import org.apache.commons.jexl3.parser.JexlNode; import org.apache.commons.jexl3.parser.Parser; +import org.apache.commons.jexl3.parser.StringProvider; import org.apache.commons.logging.Log; @@ -148,7 +149,7 @@ private UberspectHolder() {} * The {@link Parser}; when parsing expressions, this engine uses the parser if it * is not already in use otherwise it will create a new temporary one. */ - protected final Parser parser = new Parser(";"); //$NON-NLS-1$ + protected final Parser parser = new Parser(new StringProvider(";")); //$NON-NLS-1$ /** * The expression max length to hit the cache. */ @@ -872,7 +873,7 @@ protected ASTJexlScript parse(final JexlInfo info, final JexlFeatures parsingf, } } else { // ...otherwise parser was in use, create a new temporary one - final Parser lparser = new Parser(";"); + final Parser lparser = new Parser(new StringProvider(";")); script = lparser.parse(ninfo, features, src, scope); } if (source != null) { diff --git a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt index 8621fba1d..301447212 100644 --- a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt +++ b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt @@ -19,7 +19,7 @@ options { MULTI=true; - //STATIC=false; + STATIC=false; JAVA_TEMPLATE_TYPE="modern"; VISITOR=true; NODE_SCOPE_HOOK=true; @@ -454,16 +454,22 @@ Object pragmaValue() #void : { Token v; LinkedList lstr = new LinkedList(); +Object result; } { - LOOKAHEAD(1) v= { return NumberParser.parseInteger(v.image); } - | LOOKAHEAD(1) v= { return NumberParser.parseDouble(v.image); } - | LOOKAHEAD(1) v= { return Parser.buildString(v.image, true); } - | LOOKAHEAD(1) pragmaKey(lstr) { return stringify(lstr); } - | LOOKAHEAD(1) { return true; } - | LOOKAHEAD(1) { return false; } - | LOOKAHEAD(1) { return null; } - | LOOKAHEAD(1) { return Double.NaN; } + ( + LOOKAHEAD(1) v= { result = NumberParser.parseInteger(v.image); } + | LOOKAHEAD(1) v= { result = NumberParser.parseDouble(v.image); } + | LOOKAHEAD(1) v= { result = Parser.buildString(v.image, true); } + | LOOKAHEAD(1) pragmaKey(lstr) { result = stringify(lstr); } + | LOOKAHEAD(1) { result = true; } + | LOOKAHEAD(1) { result = false; } + | LOOKAHEAD(1) { result = null; } + | LOOKAHEAD(1) { result = Double.NaN; } + ) + { + return result; + } }