CAY-2196 Support for new function expressions in expression parser - updated and refactored grammar for parser - add token id to AST* function call nodes - escape in parse exception message - tests
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/c44ccfde Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/c44ccfde Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/c44ccfde Branch: refs/heads/master Commit: c44ccfde3a2e0c85eb3f0853a257cb990568766a Parents: 666c96d Author: Nikita Timofeev <[email protected]> Authored: Thu Jan 19 14:31:41 2017 +0300 Committer: Nikita Timofeev <[email protected]> Committed: Thu Jan 19 14:31:41 2017 +0300 ---------------------------------------------------------------------- cayenne-server/pom.xml | 20 +- .../apache/cayenne/exp/ExpressionFactory.java | 15 +- .../org/apache/cayenne/exp/parser/ASTAbs.java | 2 +- .../exp/parser/ASTAggregateFunctionCall.java | 4 +- .../org/apache/cayenne/exp/parser/ASTAvg.java | 2 +- .../apache/cayenne/exp/parser/ASTConcat.java | 2 +- .../org/apache/cayenne/exp/parser/ASTCount.java | 4 +- .../cayenne/exp/parser/ASTFunctionCall.java | 4 +- .../apache/cayenne/exp/parser/ASTLength.java | 2 +- .../apache/cayenne/exp/parser/ASTLocate.java | 4 +- .../org/apache/cayenne/exp/parser/ASTLower.java | 2 +- .../org/apache/cayenne/exp/parser/ASTMax.java | 2 +- .../org/apache/cayenne/exp/parser/ASTMin.java | 2 +- .../org/apache/cayenne/exp/parser/ASTMod.java | 2 +- .../org/apache/cayenne/exp/parser/ASTSqrt.java | 2 +- .../apache/cayenne/exp/parser/ASTSubstring.java | 2 +- .../org/apache/cayenne/exp/parser/ASTSum.java | 2 +- .../org/apache/cayenne/exp/parser/ASTTrim.java | 2 +- .../org/apache/cayenne/exp/parser/ASTUpper.java | 2 +- .../cayenne/exp/parser/ExpressionParser.java | 707 ++++++++-- .../exp/parser/ExpressionParserConstants.java | 100 +- .../parser/ExpressionParserTokenManager.java | 1294 +++++++++++------- .../parser/ExpressionParserTreeConstants.java | 47 +- .../exp/parser/JJTExpressionParserState.java | 19 + .../cayenne/exp/parser/JavaCharStream.java | 1099 ++++++++------- .../cayenne/exp/parser/ExpressionParser.jjt | 246 +++- .../cayenne/exp/ExpressionFactoryTest.java | 13 + .../exp/parser/ASTFunctionCallMathIT.java | 27 + .../exp/parser/ASTFunctionCallStringIT.java | 43 + 29 files changed, 2435 insertions(+), 1237 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/pom.xml ---------------------------------------------------------------------- diff --git a/cayenne-server/pom.xml b/cayenne-server/pom.xml index 913ceca..1e27e2f 100644 --- a/cayenne-server/pom.xml +++ b/cayenne-server/pom.xml @@ -199,11 +199,21 @@ <goal>jjtree-javacc</goal> </goals> </execution> - <!-- src/main/jjtree/org/apache/cayenne/exp/parser for now is generated - outside of Maven with JavaCC command line tools (maybe we should do the same - for EJBQL) : # Parser grammar out of tree grammar: $ ./javacc-5.0/bin/jjtree - src/main/jjtree/org/apache/cayenne/exp/parser/ExpressionParser.jjt # docs - $ ./javacc-5.0/bin/jjdoc -TEXT=true ExpressionParser.jj --> + <!-- + src/main/jjtree/org/apache/cayenne/exp/parser for now is generated + outside of Maven with JavaCC command line tools (maybe we should do the same for EJBQL) : + $ cd cayenne-server/src/main/jjtree/org/apache/cayenne/exp/parser + # Parser grammar out of tree grammar: + $ ~/javacc-5.0/bin/jjtree ExpressionParser.jjt + # Parser java code: + $ ~/javacc-5.0/bin/javacc ExpressionParser.jj + + # Copy generated classes to src/main/jjtree/org/apache/cayenne/exp/parser + # except all AST*, Node, SimpleNode, JavaCharStream + + # docs + $ ./javacc-5.0/bin/jjdoc -TEXT=true ExpressionParser.jj + --> </executions> </plugin> <plugin> http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java index 22dec9f..8d132a9 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/ExpressionFactory.java @@ -57,7 +57,6 @@ import org.apache.cayenne.exp.parser.ASTTrue; import org.apache.cayenne.exp.parser.ExpressionParser; import org.apache.cayenne.exp.parser.ExpressionParserTokenManager; import org.apache.cayenne.exp.parser.JavaCharStream; -import org.apache.cayenne.exp.parser.ParseException; import org.apache.cayenne.exp.parser.SimpleNode; import org.apache.cayenne.map.Entity; @@ -1310,8 +1309,8 @@ public class ExpressionFactory { // optimizing parser buffers per CAY-1667... // adding 1 extra char to the buffer size above the String length, as // otherwise resizing still occurs at the end of the stream - int bufferSize = expressionString.length() > PARSE_BUFFER_MAX_SIZE ? PARSE_BUFFER_MAX_SIZE : expressionString - .length() + 1; + int bufferSize = expressionString.length() > PARSE_BUFFER_MAX_SIZE ? + PARSE_BUFFER_MAX_SIZE : expressionString.length() + 1; Reader reader = new StringReader(expressionString); JavaCharStream stream = new JavaCharStream(reader, 1, 1, bufferSize); ExpressionParserTokenManager tm = new ExpressionParserTokenManager(stream); @@ -1319,17 +1318,9 @@ public class ExpressionFactory { try { return parser.expression(); - } catch (ParseException ex) { - - // can be null - String message = ex.getMessage(); - throw new ExpressionException(message != null ? message : "", ex); } catch (Throwable th) { - // can be null String message = th.getMessage(); - - // another common error is TokenManagerError - throw new ExpressionException(message != null ? message : "", th); + throw new ExpressionException("%s", th, message != null ? message : ""); } } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAbs.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAbs.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAbs.java index 47b06dc..b5220bb 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAbs.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAbs.java @@ -32,7 +32,7 @@ public class ASTAbs extends ASTFunctionCall { } public ASTAbs(Expression expression) { - super("ABS", expression); + super(ExpressionParserTreeConstants.JJTABS, "ABS", expression); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAggregateFunctionCall.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAggregateFunctionCall.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAggregateFunctionCall.java index d4dec9e..b6e692d 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAggregateFunctionCall.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAggregateFunctionCall.java @@ -30,7 +30,7 @@ public abstract class ASTAggregateFunctionCall extends ASTFunctionCall { super(id, functionName); } - ASTAggregateFunctionCall(String functionName, Object... nodes) { - super(functionName, nodes); + ASTAggregateFunctionCall(int id, String functionName, Object... nodes) { + super(id, functionName, nodes); } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAvg.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAvg.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAvg.java index 16146cf..eb95216 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAvg.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTAvg.java @@ -31,7 +31,7 @@ public class ASTAvg extends ASTAggregateFunctionCall { } public ASTAvg(Expression expression) { - super("AVG", expression); + super(0, "AVG", expression); } http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTConcat.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTConcat.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTConcat.java index efb11ad..0e285c4 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTConcat.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTConcat.java @@ -32,7 +32,7 @@ public class ASTConcat extends ASTFunctionCall { } public ASTConcat(Expression... expressions) { - super("CONCAT", expressions); + super(ExpressionParserTreeConstants.JJTCONCAT, "CONCAT", expressions); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTCount.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTCount.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTCount.java index 72172f7..ee3a65e 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTCount.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTCount.java @@ -31,11 +31,11 @@ public class ASTCount extends ASTAggregateFunctionCall { } public ASTCount(Expression expression) { - super("COUNT", expression); + super(0, "COUNT", expression); } public ASTCount() { - super("COUNT", new ASTAsterisk()); + super(0, "COUNT", new ASTAsterisk()); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTFunctionCall.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTFunctionCall.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTFunctionCall.java index 9c3aa07..8080a52 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTFunctionCall.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTFunctionCall.java @@ -33,8 +33,8 @@ public abstract class ASTFunctionCall extends SimpleNode { this.functionName = functionName; } - public ASTFunctionCall(String functionName, Object... nodes) { - this(0, functionName); + public ASTFunctionCall(int id, String functionName, Object... nodes) { + this(id, functionName); this.functionName = functionName; int len = nodes.length; for (int i = 0; i < len; i++) { http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLength.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLength.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLength.java index 5d1eea8..e12512e 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLength.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLength.java @@ -32,7 +32,7 @@ public class ASTLength extends ASTFunctionCall { } public ASTLength(Expression expression) { - super("LENGTH", expression); + super(ExpressionParserTreeConstants.JJTLENGTH, "LENGTH", expression); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLocate.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLocate.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLocate.java index 1c537e5..d26dbb5 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLocate.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLocate.java @@ -32,11 +32,11 @@ public class ASTLocate extends ASTFunctionCall { } public ASTLocate(Expression substring, Expression path) { - super("LOCATE", substring, path); + super(ExpressionParserTreeConstants.JJTLOCATE, "LOCATE", substring, path); } public ASTLocate(Expression substring, Expression path, Expression offset) { - super("LOCATE", substring, path, offset); + super(ExpressionParserTreeConstants.JJTLOCATE, "LOCATE", substring, path, offset); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLower.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLower.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLower.java index b63319a..78b6f80 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLower.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTLower.java @@ -33,7 +33,7 @@ public class ASTLower extends ASTFunctionCall { } public ASTLower(Expression expression) { - super("LOWER", expression); + super(ExpressionParserTreeConstants.JJTLOWER, "LOWER", expression); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMax.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMax.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMax.java index b0356eb..2a59d76 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMax.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMax.java @@ -31,7 +31,7 @@ public class ASTMax extends ASTAggregateFunctionCall { } public ASTMax(Expression expression) { - super("MAX", expression); + super(0, "MAX", expression); } http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMin.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMin.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMin.java index c55b5df..dc5142f 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMin.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMin.java @@ -31,7 +31,7 @@ public class ASTMin extends ASTAggregateFunctionCall { } public ASTMin(Expression expression) { - super("MIN", expression); + super(0, "MIN", expression); } http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMod.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMod.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMod.java index f951cb7..c4f79a7 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMod.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTMod.java @@ -32,7 +32,7 @@ public class ASTMod extends ASTFunctionCall { } public ASTMod(Expression expression, Expression divisor) { - super("MOD", expression, divisor); + super(ExpressionParserTreeConstants.JJTMOD, "MOD", expression, divisor); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSqrt.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSqrt.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSqrt.java index d311444..71e8e32 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSqrt.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSqrt.java @@ -32,7 +32,7 @@ public class ASTSqrt extends ASTFunctionCall { } public ASTSqrt(Expression expression) { - super("SQRT", expression); + super(ExpressionParserTreeConstants.JJTSQRT, "SQRT", expression); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSubstring.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSubstring.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSubstring.java index c6ae864..33ac4e0 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSubstring.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSubstring.java @@ -33,7 +33,7 @@ public class ASTSubstring extends ASTFunctionCall { } public ASTSubstring(Expression path, Expression length, Expression offset) { - super("SUBSTRING", path, length, offset); + super(ExpressionParserTreeConstants.JJTSUBSTRING, "SUBSTRING", path, length, offset); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSum.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSum.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSum.java index bcc5e12..73e0b8c 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSum.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTSum.java @@ -31,7 +31,7 @@ public class ASTSum extends ASTAggregateFunctionCall { } public ASTSum(Expression expression) { - super("SUM", expression); + super(0, "SUM", expression); } http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTTrim.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTTrim.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTTrim.java index 2a0077a..f037dd0 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTTrim.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTTrim.java @@ -32,7 +32,7 @@ public class ASTTrim extends ASTFunctionCall { } public ASTTrim(Expression path) { - super("TRIM", path); + super(ExpressionParserTreeConstants.JJTTRIM, "TRIM", path); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTUpper.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTUpper.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTUpper.java index fad6026..60716fc 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTUpper.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTUpper.java @@ -32,7 +32,7 @@ public class ASTUpper extends ASTFunctionCall { } public ASTUpper(Expression expression) { - super("UPPER", expression); + super(ExpressionParserTreeConstants.JJTUPPER, "UPPER", expression); } @Override http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java index 77fea61..20a6f42 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java @@ -163,13 +163,23 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon case 25: case 26: case 29: - case 30: - case 31: - case 32: - case 33: case NULL: case TRUE: case FALSE: + case CONCAT: + case SUBSTRING: + case TRIM: + case LOWER: + case UPPER: + case LENGTH: + case LOCATE: + case ABS: + case SQRT: + case MOD: + case 55: + case 56: + case 57: + case 58: case PROPERTY_PATH: case SINGLE_QUOTED_STRING: case DOUBLE_QUOTED_STRING: @@ -214,17 +224,27 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon case 25: case 26: case 29: - case 30: - case 31: - case 32: - case 33: case NULL: + case CONCAT: + case SUBSTRING: + case TRIM: + case LOWER: + case UPPER: + case LENGTH: + case LOCATE: + case ABS: + case SQRT: + case MOD: + case 55: + case 56: + case 57: + case 58: case PROPERTY_PATH: case SINGLE_QUOTED_STRING: case DOUBLE_QUOTED_STRING: case INT_LITERAL: case FLOAT_LITERAL: - scalarConditionExpression(); + conditionExpression(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 3: case 4: @@ -241,10 +261,6 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon case 15: case 18: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { - case 3: - case 4: - simpleNotCondition(); - break; case 5: case 6: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -492,7 +508,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon jjtree.openNodeScope(jjtn011); try { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { - case 30: + case 55: namedParameter(); break; case 16: @@ -554,6 +570,10 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } } break; + case 3: + case 4: + simpleNotCondition(); + break; default: jj_la1[7] = jj_gen; jj_consume_token(-1); @@ -647,7 +667,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon jjtree.openNodeScope(jjtn003); try { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { - case 30: + case 55: namedParameter(); break; case 16: @@ -756,21 +776,80 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } } - final public void scalarConditionExpression() throws ParseException { + final public void conditionExpression() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 16: case 25: case 26: case 29: - case 30: - case 31: - case 32: - case 33: + case LENGTH: + case LOCATE: + case ABS: + case SQRT: + case MOD: + case 55: + case 56: + case 57: + case 58: case PROPERTY_PATH: case INT_LITERAL: case FLOAT_LITERAL: - scalarNumericExpression(); + numericExpression(); + break; + case CONCAT: + case SUBSTRING: + case TRIM: + case LOWER: + case UPPER: + case SINGLE_QUOTED_STRING: + case DOUBLE_QUOTED_STRING: + stringExpression(); + break; + case NULL: + ASTScalar jjtn001 = new ASTScalar(JJTSCALAR); + boolean jjtc001 = true; + jjtree.openNodeScope(jjtn001); + try { + jj_consume_token(NULL); + } finally { + if (jjtc001) { + jjtree.closeNodeScope(jjtn001, 0); + } + } break; + default: + jj_la1[14] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + + final public void stringParameter() throws ParseException { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 56: + case 57: + case 58: + case PROPERTY_PATH: + pathExpression(); + break; + case CONCAT: + case SUBSTRING: + case TRIM: + case LOWER: + case UPPER: + case SINGLE_QUOTED_STRING: + case DOUBLE_QUOTED_STRING: + stringExpression(); + break; + default: + jj_la1[15] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + + final public void stringExpression() throws ParseException { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case SINGLE_QUOTED_STRING: jj_consume_token(SINGLE_QUOTED_STRING); ASTScalar jjtn001 = new ASTScalar(JJTSCALAR); @@ -801,20 +880,15 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } } break; - case NULL: - ASTScalar jjtn003 = new ASTScalar(JJTSCALAR); - boolean jjtc003 = true; - jjtree.openNodeScope(jjtn003); - try { - jj_consume_token(NULL); - } finally { - if (jjtc003) { - jjtree.closeNodeScope(jjtn003, 0); - } - } + case CONCAT: + case SUBSTRING: + case TRIM: + case LOWER: + case UPPER: + functionsReturningStrings(); break; default: - jj_la1[14] = jj_gen; + jj_la1[16] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -826,17 +900,27 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon case 25: case 26: case 29: - case 30: - case 31: - case 32: - case 33: case NULL: + case CONCAT: + case SUBSTRING: + case TRIM: + case LOWER: + case UPPER: + case LENGTH: + case LOCATE: + case ABS: + case SQRT: + case MOD: + case 55: + case 56: + case 57: + case 58: case PROPERTY_PATH: case SINGLE_QUOTED_STRING: case DOUBLE_QUOTED_STRING: case INT_LITERAL: case FLOAT_LITERAL: - scalarConditionExpression(); + conditionExpression(); break; case TRUE: jj_consume_token(TRUE); @@ -869,7 +953,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } break; default: - jj_la1[15] = jj_gen; + jj_la1[17] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -907,7 +991,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } } break; - case 30: + case 55: namedParameter(); break; case INT_LITERAL: @@ -971,13 +1055,13 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } break; default: - jj_la1[16] = jj_gen; + jj_la1[18] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } - final public void scalarNumericExpression() throws ParseException { + final public void numericExpression() throws ParseException { bitwiseOr(); } @@ -990,7 +1074,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon ; break; default: - jj_la1[17] = jj_gen; + jj_la1[19] = jj_gen; break label_4; } jj_consume_token(20); @@ -1030,7 +1114,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon ; break; default: - jj_la1[18] = jj_gen; + jj_la1[20] = jj_gen; break label_5; } jj_consume_token(21); @@ -1070,7 +1154,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon ; break; default: - jj_la1[19] = jj_gen; + jj_la1[21] = jj_gen; break label_6; } jj_consume_token(22); @@ -1111,7 +1195,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon ; break; default: - jj_la1[20] = jj_gen; + jj_la1[22] = jj_gen; break label_7; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -1170,7 +1254,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } break; default: - jj_la1[21] = jj_gen; + jj_la1[23] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1187,7 +1271,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon ; break; default: - jj_la1[22] = jj_gen; + jj_la1[24] = jj_gen; break label_8; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -1246,7 +1330,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } break; default: - jj_la1[23] = jj_gen; + jj_la1[25] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1263,7 +1347,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon ; break; default: - jj_la1[24] = jj_gen; + jj_la1[26] = jj_gen; break label_9; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -1322,7 +1406,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } break; default: - jj_la1[25] = jj_gen; + jj_la1[27] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1334,10 +1418,15 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon case 16: case 25: case 26: - case 30: - case 31: - case 32: - case 33: + case LENGTH: + case LOCATE: + case ABS: + case SQRT: + case MOD: + case 55: + case 56: + case 57: + case 58: case PROPERTY_PATH: case INT_LITERAL: case FLOAT_LITERAL: @@ -1371,7 +1460,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } break; default: - jj_la1[26] = jj_gen; + jj_la1[28] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1381,10 +1470,15 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 16: case 25: - case 30: - case 31: - case 32: - case 33: + case LENGTH: + case LOCATE: + case ABS: + case SQRT: + case MOD: + case 55: + case 56: + case 57: + case 58: case PROPERTY_PATH: case INT_LITERAL: case FLOAT_LITERAL: @@ -1393,7 +1487,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon jj_consume_token(25); break; default: - jj_la1[27] = jj_gen; + jj_la1[29] = jj_gen; ; } numericPrimary(); @@ -1426,7 +1520,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } break; default: - jj_la1[28] = jj_gen; + jj_la1[30] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1439,15 +1533,6 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon orCondition(); jj_consume_token(17); break; - case 31: - case 32: - case 33: - case PROPERTY_PATH: - pathExpression(); - break; - case 30: - namedParameter(); - break; case INT_LITERAL: jj_consume_token(INT_LITERAL); ASTScalar jjtn001 = new ASTScalar(JJTSCALAR); @@ -1478,16 +1563,416 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } } break; + case 55: + namedParameter(); + break; + case LENGTH: + case LOCATE: + case ABS: + case SQRT: + case MOD: + functionsReturningNumerics(); + break; + case 56: + case 57: + case 58: + case PROPERTY_PATH: + pathExpression(); + break; + default: + jj_la1[31] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + + final public void functionsReturningStrings() throws ParseException { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case CONCAT: + concat(); + break; + case SUBSTRING: + substring(); + break; + case TRIM: + trim(); + break; + case LOWER: + lower(); + break; + case UPPER: + upper(); + break; default: - jj_la1[29] = jj_gen; + jj_la1[32] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } + final public void concat() throws ParseException { + /*@bgen(jjtree) Concat */ + ASTConcat jjtn000 = new ASTConcat(JJTCONCAT); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + try { + jj_consume_token(CONCAT); + jj_consume_token(16); + stringParameter(); + jj_consume_token(19); + stringParameter(); + jj_consume_token(17); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + } + } + } + + final public void substring() throws ParseException { + /*@bgen(jjtree) Substring */ + ASTSubstring jjtn000 = new ASTSubstring(JJTSUBSTRING); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + try { + jj_consume_token(SUBSTRING); + jj_consume_token(16); + stringParameter(); + jj_consume_token(19); + numericExpression(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 19: + jj_consume_token(19); + numericExpression(); + break; + default: + jj_la1[33] = jj_gen; + ; + } + jj_consume_token(17); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + } + } + } + + final public void trim() throws ParseException { + /*@bgen(jjtree) Trim */ + ASTTrim jjtn000 = new ASTTrim(JJTTRIM); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + try { + jj_consume_token(TRIM); + jj_consume_token(16); + stringParameter(); + jj_consume_token(17); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + } + } + } + + final public void lower() throws ParseException { + /*@bgen(jjtree) Lower */ + ASTLower jjtn000 = new ASTLower(JJTLOWER); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + try { + jj_consume_token(LOWER); + jj_consume_token(16); + stringParameter(); + jj_consume_token(17); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + } + } + } + + final public void upper() throws ParseException { + /*@bgen(jjtree) Upper */ + ASTUpper jjtn000 = new ASTUpper(JJTUPPER); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + try { + jj_consume_token(UPPER); + jj_consume_token(16); + stringParameter(); + jj_consume_token(17); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + } + } + } + + final public void functionsReturningNumerics() throws ParseException { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case LENGTH: + length(); + break; + case LOCATE: + locate(); + break; + case ABS: + abs(); + break; + case SQRT: + sqrt(); + break; + case MOD: + mod(); + break; + default: + jj_la1[34] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + + final public void length() throws ParseException { + /*@bgen(jjtree) Length */ + ASTLength jjtn000 = new ASTLength(JJTLENGTH); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + try { + jj_consume_token(LENGTH); + jj_consume_token(16); + stringParameter(); + jj_consume_token(17); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + } + } + } + + final public void locate() throws ParseException { + /*@bgen(jjtree) Locate */ + ASTLocate jjtn000 = new ASTLocate(JJTLOCATE); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + try { + jj_consume_token(LOCATE); + jj_consume_token(16); + stringParameter(); + jj_consume_token(19); + stringParameter(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 19: + jj_consume_token(19); + numericExpression(); + break; + default: + jj_la1[35] = jj_gen; + ; + } + jj_consume_token(17); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + } + } + } + + final public void abs() throws ParseException { + /*@bgen(jjtree) Abs */ + ASTAbs jjtn000 = new ASTAbs(JJTABS); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + try { + jj_consume_token(ABS); + jj_consume_token(16); + numericExpression(); + jj_consume_token(17); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + } + } + } + + final public void sqrt() throws ParseException { + /*@bgen(jjtree) Sqrt */ + ASTSqrt jjtn000 = new ASTSqrt(JJTSQRT); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + try { + jj_consume_token(SQRT); + jj_consume_token(16); + numericExpression(); + jj_consume_token(17); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + } + } + } + + final public void mod() throws ParseException { + /*@bgen(jjtree) Mod */ + ASTMod jjtn000 = new ASTMod(JJTMOD); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + try { + jj_consume_token(MOD); + jj_consume_token(16); + numericExpression(); + jj_consume_token(19); + numericExpression(); + jj_consume_token(17); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + } + } + } + final public void namedParameter() throws ParseException { Token t; - jj_consume_token(30); + jj_consume_token(55); t = jj_consume_token(PROPERTY_PATH); ASTNamedParameter jjtn001 = new ASTNamedParameter(JJTNAMEDPARAMETER); boolean jjtc001 = true; @@ -1521,8 +2006,8 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } } break; - case 31: - jj_consume_token(31); + case 56: + jj_consume_token(56); t = jj_consume_token(PROPERTY_PATH); ASTObjPath jjtn002 = new ASTObjPath(JJTOBJPATH); boolean jjtc002 = true; @@ -1537,8 +2022,8 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } } break; - case 32: - jj_consume_token(32); + case 57: + jj_consume_token(57); t = jj_consume_token(PROPERTY_PATH); ASTDbPath jjtn003 = new ASTDbPath(JJTDBPATH); boolean jjtc003 = true; @@ -1553,8 +2038,8 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } } break; - case 33: - jj_consume_token(33); + case 58: + jj_consume_token(58); t = jj_consume_token(PROPERTY_PATH); ASTScalar jjtn004 = new ASTScalar(JJTSCALAR); boolean jjtc004 = true; @@ -1570,7 +2055,7 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon } break; default: - jj_la1[30] = jj_gen; + jj_la1[36] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1585,18 +2070,23 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon public Token jj_nt; private int jj_ntk; private int jj_gen; - final private int[] jj_la1 = new int[31]; + final private int[] jj_la1 = new int[37]; static private int[] jj_la1_0; static private int[] jj_la1_1; + static private int[] jj_la1_2; static { jj_la1_init_0(); jj_la1_init_1(); + jj_la1_init_2(); } private static void jj_la1_init_0() { - jj_la1_0 = new int[] {0x2,0x4,0x18,0xe6010018,0x60,0x180,0x40010000,0x4fff8,0x4fff8,0xe6010000,0x18,0x40010000,0x4e000,0x80000,0xe6010000,0xe6010000,0x40000000,0x100000,0x200000,0x400000,0x1800000,0x1800000,0x6000000,0x6000000,0x18000000,0x18000000,0xe6010000,0x2000000,0xc6010000,0xc0010000,0x80000000,}; + jj_la1_0 = new int[] {0x2,0x4,0x18,0x26010018,0x60,0x180,0x10000,0x4fff8,0x4fff8,0x26010000,0x18,0x10000,0x4e000,0x80000,0x26010000,0x0,0x0,0x26010000,0x0,0x100000,0x200000,0x400000,0x1800000,0x1800000,0x6000000,0x6000000,0x18000000,0x18000000,0x26010000,0x2000000,0x6010000,0x10000,0x0,0x80000,0x0,0x80000,0x0,}; } private static void jj_la1_init_1() { - jj_la1_1 = new int[] {0x0,0x0,0x0,0x7203c3,0x0,0x0,0x0,0x0,0x0,0x7203c3,0x0,0x0,0x0,0x0,0x720243,0x7203c3,0x720180,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x600203,0x0,0x600203,0x600203,0x203,}; + jj_la1_1 = new int[] {0x0,0x0,0x0,0xf8ffc1c,0x0,0x0,0x800000,0x0,0x0,0xf8ffc1c,0x0,0x800000,0x0,0x0,0xf8ffc04,0xf007c00,0x7c00,0xf8ffc1c,0x800018,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf8f8000,0x0,0xf8f8000,0xf8f8000,0x7c00,0x0,0xf8000,0x0,0xf000000,}; + } + private static void jj_la1_init_2() { + jj_la1_2 = new int[] {0x0,0x0,0x0,0x1c8,0x0,0x0,0x0,0x0,0x0,0x1c8,0x0,0x0,0x0,0x0,0x1c8,0x48,0x48,0x1c8,0x1c8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x0,0x180,0x180,0x0,0x0,0x0,0x0,0x0,}; } /** Constructor with InputStream. */ @@ -1610,7 +2100,22 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 31; i++) jj_la1[i] = -1; + for (int i = 0; i < 37; i++) jj_la1[i] = -1; + } + + /** Reinitialise. */ + public void ReInit(java.io.InputStream stream) { + ReInit(stream, null); + } + /** Reinitialise. */ + public void ReInit(java.io.InputStream stream, String encoding) { + try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); } + token_source.ReInit(jj_input_stream); + token = new Token(); + jj_ntk = -1; + jjtree.reset(); + jj_gen = 0; + for (int i = 0; i < 37; i++) jj_la1[i] = -1; } /** Constructor. */ @@ -1620,7 +2125,18 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 31; i++) jj_la1[i] = -1; + for (int i = 0; i < 37; i++) jj_la1[i] = -1; + } + + /** Reinitialise. */ + public void ReInit(java.io.Reader stream) { + jj_input_stream.ReInit(stream, 1, 1); + token_source.ReInit(jj_input_stream); + token = new Token(); + jj_ntk = -1; + jjtree.reset(); + jj_gen = 0; + for (int i = 0; i < 37; i++) jj_la1[i] = -1; } /** Constructor with generated Token Manager. */ @@ -1629,7 +2145,17 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 31; i++) jj_la1[i] = -1; + for (int i = 0; i < 37; i++) jj_la1[i] = -1; + } + + /** Reinitialise. */ + public void ReInit(ExpressionParserTokenManager tm) { + token_source = tm; + token = new Token(); + jj_ntk = -1; + jjtree.reset(); + jj_gen = 0; + for (int i = 0; i < 37; i++) jj_la1[i] = -1; } private Token jj_consume_token(int kind) throws ParseException { @@ -1680,12 +2206,12 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon /** Generate ParseException. */ public ParseException generateParseException() { jj_expentries.clear(); - boolean[] la1tokens = new boolean[59]; + boolean[] la1tokens = new boolean[77]; if (jj_kind >= 0) { la1tokens[jj_kind] = true; jj_kind = -1; } - for (int i = 0; i < 31; i++) { + for (int i = 0; i < 37; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1<<j)) != 0) { @@ -1694,10 +2220,13 @@ public class ExpressionParser/*@bgen(jjtree)*/implements ExpressionParserTreeCon if ((jj_la1_1[i] & (1<<j)) != 0) { la1tokens[32+j] = true; } + if ((jj_la1_2[i] & (1<<j)) != 0) { + la1tokens[64+j] = true; + } } } } - for (int i = 0; i < 59; i++) { + for (int i = 0; i < 77; i++) { if (la1tokens[i]) { jj_expentry = new int[1]; jj_expentry[0] = i; http://git-wip-us.apache.org/repos/asf/cayenne/blob/c44ccfde/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParserConstants.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParserConstants.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParserConstants.java index d8bf198..7d50af0 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParserConstants.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionParserConstants.java @@ -31,39 +31,75 @@ public interface ExpressionParserConstants { /** End of File. */ int EOF = 0; /** RegularExpression Id. */ - int NULL = 38; + int NULL = 34; /** RegularExpression Id. */ - int TRUE = 39; + int TRUE = 35; /** RegularExpression Id. */ - int FALSE = 40; + int FALSE = 36; /** RegularExpression Id. */ - int PROPERTY_PATH = 41; + int AVG = 37; /** RegularExpression Id. */ - int IDENTIFIER = 42; + int MIN = 38; /** RegularExpression Id. */ - int LETTER = 43; + int MAX = 39; /** RegularExpression Id. */ - int DIGIT = 44; + int SUM = 40; /** RegularExpression Id. */ - int ESC = 47; + int COUNT = 41; /** RegularExpression Id. */ - int SINGLE_QUOTED_STRING = 49; + int CONCAT = 42; /** RegularExpression Id. */ - int STRING_ESC = 50; + int SUBSTRING = 43; /** RegularExpression Id. */ - int DOUBLE_QUOTED_STRING = 52; + int TRIM = 44; /** RegularExpression Id. */ - int INT_LITERAL = 53; + int LOWER = 45; /** RegularExpression Id. */ - int FLOAT_LITERAL = 54; + int UPPER = 46; /** RegularExpression Id. */ - int DEC_FLT = 55; + int LENGTH = 47; /** RegularExpression Id. */ - int DEC_DIGITS = 56; + int LOCATE = 48; /** RegularExpression Id. */ - int EXPONENT = 57; + int ABS = 49; /** RegularExpression Id. */ - int FLT_SUFF = 58; + int SQRT = 50; + /** RegularExpression Id. */ + int MOD = 51; + /** RegularExpression Id. */ + int CURRENT_DATE = 52; + /** RegularExpression Id. */ + int CURRENT_TIME = 53; + /** RegularExpression Id. */ + int CURRENT_TIMESTAMP = 54; + /** RegularExpression Id. */ + int PROPERTY_PATH = 59; + /** RegularExpression Id. */ + int IDENTIFIER = 60; + /** RegularExpression Id. */ + int LETTER = 61; + /** RegularExpression Id. */ + int DIGIT = 62; + /** RegularExpression Id. */ + int ESC = 65; + /** RegularExpression Id. */ + int SINGLE_QUOTED_STRING = 67; + /** RegularExpression Id. */ + int STRING_ESC = 68; + /** RegularExpression Id. */ + int DOUBLE_QUOTED_STRING = 70; + /** RegularExpression Id. */ + int INT_LITERAL = 71; + /** RegularExpression Id. */ + int FLOAT_LITERAL = 72; + /** RegularExpression Id. */ + int DEC_FLT = 73; + /** RegularExpression Id. */ + int DEC_DIGITS = 74; + /** RegularExpression Id. */ + int EXPONENT = 75; + /** RegularExpression Id. */ + int FLT_SUFF = 76; /** Lexical state. */ int DEFAULT = 0; @@ -104,10 +140,6 @@ public interface ExpressionParserConstants { "\"*\"", "\"/\"", "\"~\"", - "\"$\"", - "\"obj:\"", - "\"db:\"", - "\"enum:\"", "\" \"", "\"\\t\"", "\"\\n\"", @@ -115,6 +147,28 @@ public interface ExpressionParserConstants { "<NULL>", "<TRUE>", "<FALSE>", + "\"AVG\"", + "\"MIN\"", + "\"MAX\"", + "\"SUM\"", + "\"COUNT\"", + "\"CONCAT\"", + "\"SUBSTRING\"", + "\"TRIM\"", + "\"LOWER\"", + "\"UPPER\"", + "\"LENGTH\"", + "\"LOCATE\"", + "\"ABS\"", + "\"SQRT\"", + "\"MOD\"", + "\"CURRENT_DATE\"", + "\"CURRENT_TIME\"", + "\"CURRENT_TIMESTAMP\"", + "\"$\"", + "\"obj:\"", + "\"db:\"", + "\"enum:\"", "<PROPERTY_PATH>", "<IDENTIFIER>", "<LETTER>", @@ -122,10 +176,10 @@ public interface ExpressionParserConstants { "\"\\\'\"", "\"\\\"\"", "<ESC>", - "<token of kind 48>", + "<token of kind 66>", "\"\\\'\"", "<STRING_ESC>", - "<token of kind 51>", + "<token of kind 69>", "\"\\\"\"", "<INT_LITERAL>", "<FLOAT_LITERAL>",
