diff --git a/src/main/antlr/net/rptools/parser/expression.g b/src/main/antlr/net/rptools/parser/expression.g index 88ab1a9..735484d 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 + } + } }