From 78b94fbd339d0977312c92f7508c8000e574745e Mon Sep 17 00:00:00 2001 From: Craig Wisniewski Date: Fri, 14 Aug 2020 14:01:14 +0930 Subject: [PATCH 1/3] Changes so variables starting with tru / fal will no longer fail --- src/main/antlr/net/rptools/parser/expression.g | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/antlr/net/rptools/parser/expression.g b/src/main/antlr/net/rptools/parser/expression.g index 88ab1a9..6239cde 100755 --- a/src/main/antlr/net/rptools/parser/expression.g +++ b/src/main/antlr/net/rptools/parser/expression.g @@ -160,7 +160,7 @@ parameterList: (expr (COMMA! expr)* )? class ExpressionLexer extends Lexer; options { - k=3; // needed for newline junk + k=5; // needed for newline junk charVocabulary='\u0000'..'\u00FF'; // allow ISO 8859-1 } From 2a42262aec901d9da84189b43ac5abfe808a2c6c Mon Sep 17 00:00:00 2001 From: Craig Wisniewski Date: Sun, 16 Aug 2020 23:17:33 +0930 Subject: [PATCH 2/3] TRUE/FALSE are no longer tokens but constants --- build.gradle | 4 ++-- .../antlr/net/rptools/parser/expression.g | 6 ------ .../parser/DeterministicTreeParser.java | 4 ---- .../rptools/parser/EvaluationTreeParser.java | 6 ------ .../rptools/parser/InlineTreeFormatter.java | 2 -- .../rptools/parser/MapVariableResolver.java | 13 ++++++++++++ .../java/net/rptools/parser/ParserTest.java | 20 +++++++++++++++++++ 7 files changed, 35 insertions(+), 20 deletions(-) diff --git a/build.gradle b/build.gradle index 9f275de..5631c7a 100755 --- a/build.gradle +++ b/build.gradle @@ -22,8 +22,8 @@ apply plugin: 'com.diffplug.gradle.spotless' apply plugin: 'maven' -project.sourceCompatibility = 10 -project.targetCompatibility = 10 +project.sourceCompatibility = 14 +project.targetCompatibility = 14 // In this section you declare where to find the dependencies of your project diff --git a/src/main/antlr/net/rptools/parser/expression.g b/src/main/antlr/net/rptools/parser/expression.g index 6239cde..f018b8b 100755 --- a/src/main/antlr/net/rptools/parser/expression.g +++ b/src/main/antlr/net/rptools/parser/expression.g @@ -128,10 +128,6 @@ constantExpression: | HEXNUMBER | - TRUE - | - FALSE - | variable | t1:SINGLE_QUOTED_STRING {#t1.setType(STRING);} @@ -177,8 +173,6 @@ GE : ">=" ; GT : ">" ; LT : "<" ; LE : "<=" ; -TRUE : "true"; -FALSE : "false"; // Math operators PLUS : '+' ; diff --git a/src/main/java/net/rptools/parser/DeterministicTreeParser.java b/src/main/java/net/rptools/parser/DeterministicTreeParser.java index e6f3240..f9add59 100755 --- a/src/main/java/net/rptools/parser/DeterministicTreeParser.java +++ b/src/main/java/net/rptools/parser/DeterministicTreeParser.java @@ -15,14 +15,12 @@ package net.rptools.parser; import static net.rptools.parser.ExpressionParserTokenTypes.ASSIGNEE; -import static net.rptools.parser.ExpressionParserTokenTypes.FALSE; import static net.rptools.parser.ExpressionParserTokenTypes.FUNCTION; import static net.rptools.parser.ExpressionParserTokenTypes.HEXNUMBER; import static net.rptools.parser.ExpressionParserTokenTypes.NUMBER; import static net.rptools.parser.ExpressionParserTokenTypes.OPERATOR; import static net.rptools.parser.ExpressionParserTokenTypes.PROMPTVARIABLE; import static net.rptools.parser.ExpressionParserTokenTypes.STRING; -import static net.rptools.parser.ExpressionParserTokenTypes.TRUE; import static net.rptools.parser.ExpressionParserTokenTypes.UNARY_OPERATOR; import static net.rptools.parser.ExpressionParserTokenTypes.VARIABLE; @@ -52,8 +50,6 @@ public AST evaluate(AST node, VariableResolver resolver) throws ParserException case NUMBER: case HEXNUMBER: case ASSIGNEE: - case TRUE: - case FALSE: node.setNextSibling(evaluate(node.getNextSibling(), resolver)); return node; case VARIABLE: diff --git a/src/main/java/net/rptools/parser/EvaluationTreeParser.java b/src/main/java/net/rptools/parser/EvaluationTreeParser.java index 3626ba0..3804c6d 100755 --- a/src/main/java/net/rptools/parser/EvaluationTreeParser.java +++ b/src/main/java/net/rptools/parser/EvaluationTreeParser.java @@ -15,14 +15,12 @@ package net.rptools.parser; import static net.rptools.parser.ExpressionParserTokenTypes.ASSIGNEE; -import static net.rptools.parser.ExpressionParserTokenTypes.FALSE; import static net.rptools.parser.ExpressionParserTokenTypes.FUNCTION; import static net.rptools.parser.ExpressionParserTokenTypes.HEXNUMBER; import static net.rptools.parser.ExpressionParserTokenTypes.NUMBER; import static net.rptools.parser.ExpressionParserTokenTypes.OPERATOR; import static net.rptools.parser.ExpressionParserTokenTypes.PROMPTVARIABLE; import static net.rptools.parser.ExpressionParserTokenTypes.STRING; -import static net.rptools.parser.ExpressionParserTokenTypes.TRUE; import static net.rptools.parser.ExpressionParserTokenTypes.UNARY_OPERATOR; import static net.rptools.parser.ExpressionParserTokenTypes.VARIABLE; @@ -54,10 +52,6 @@ public Object evaluate(AST node, VariableResolver resolver) throws ParserExcepti String name = node.getText(); return name; } - case TRUE: - return BigDecimal.ONE; - case FALSE: - return BigDecimal.ZERO; case NUMBER: { BigDecimal d = new BigDecimal(node.getText()); diff --git a/src/main/java/net/rptools/parser/InlineTreeFormatter.java b/src/main/java/net/rptools/parser/InlineTreeFormatter.java index ef3c0c4..ea61cbd 100755 --- a/src/main/java/net/rptools/parser/InlineTreeFormatter.java +++ b/src/main/java/net/rptools/parser/InlineTreeFormatter.java @@ -67,8 +67,6 @@ private void format(AST node, StringBuilder sb) { case VARIABLE: case NUMBER: case HEXNUMBER: - case TRUE: - case FALSE: { sb.append(node.getText()); return; diff --git a/src/main/java/net/rptools/parser/MapVariableResolver.java b/src/main/java/net/rptools/parser/MapVariableResolver.java index 4d162b1..b08e81a 100644 --- a/src/main/java/net/rptools/parser/MapVariableResolver.java +++ b/src/main/java/net/rptools/parser/MapVariableResolver.java @@ -14,6 +14,7 @@ */ package net.rptools.parser; +import java.math.BigDecimal; import java.util.Collections; import java.util.Map; import java.util.Set; @@ -26,11 +27,23 @@ public class MapVariableResolver implements VariableResolver { private final Map variables = new CaseInsensitiveHashMap(); + private static final Map constants = + Map.of( + "true", BigDecimal.ONE, + "false", BigDecimal.ZERO); + + public MapVariableResolver() { + variables.putAll(constants); + } + public boolean containsVariable(String name) throws ParserException { return containsVariable(name, VariableModifiers.None); } public void setVariable(String name, Object value) throws ParserException { + if (constants.containsKey(name)) { + throw new ParserException(name + " can not be the target of assignment."); + } setVariable(name, VariableModifiers.None, value); } diff --git a/src/test/java/net/rptools/parser/ParserTest.java b/src/test/java/net/rptools/parser/ParserTest.java index 9ff0ccc..f35a1d4 100755 --- a/src/test/java/net/rptools/parser/ParserTest.java +++ b/src/test/java/net/rptools/parser/ParserTest.java @@ -318,4 +318,24 @@ private void evaluateStringExpression( assertEquals(answer, result); } + + public void testAssignToTrue() throws ParserException { + Parser p = new Parser(); + try { + evaluateExpression(p, "true = 2", BigDecimal.valueOf(2)); + fail("Was able to assign to 'true'"); + } catch (ParserException ex) { + // Expected + } + } + + public void testAssignToFalse() throws ParserException { + Parser p = new Parser(); + try { + evaluateExpression(p, "false = 2", BigDecimal.valueOf(2)); + fail("Was able to assign to 'fakse'"); + } catch (ParserException ex) { + // Expected + } + } } From 740932f1d1d77f9be626008dc11a9da743d0f577 Mon Sep 17 00:00:00 2001 From: Craig Wisniewski Date: Sun, 16 Aug 2020 23:26:41 +0930 Subject: [PATCH 3/3] no longer need 5 lookahead for parser --- build.gradle | 4 ++-- src/main/antlr/net/rptools/parser/expression.g | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 5631c7a..9f275de 100755 --- a/build.gradle +++ b/build.gradle @@ -22,8 +22,8 @@ apply plugin: 'com.diffplug.gradle.spotless' apply plugin: 'maven' -project.sourceCompatibility = 14 -project.targetCompatibility = 14 +project.sourceCompatibility = 10 +project.targetCompatibility = 10 // In this section you declare where to find the dependencies of your project diff --git a/src/main/antlr/net/rptools/parser/expression.g b/src/main/antlr/net/rptools/parser/expression.g index f018b8b..735484d 100755 --- a/src/main/antlr/net/rptools/parser/expression.g +++ b/src/main/antlr/net/rptools/parser/expression.g @@ -156,7 +156,7 @@ parameterList: (expr (COMMA! expr)* )? class ExpressionLexer extends Lexer; options { - k=5; // needed for newline junk + k=3; // needed for newline junk charVocabulary='\u0000'..'\u00FF'; // allow ISO 8859-1 }