From f04ab28c3f84cbee7569e55f329b4c404a963db1 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Fri, 14 Oct 2016 21:08:23 +1300 Subject: [PATCH] #831 - EQL query language parser needs to throw exception on invalid query ... "find ..." --- .../server/grammer/EqlAdapter.java | 6 +- .../server/grammer/EqlParser.java | 16 ++ .../server/grammer/antlr/EQLBaseListener.java | 2 +- .../server/grammer/antlr/EQLLexer.java | 23 +- .../server/grammer/antlr/EQLListener.java | 2 +- .../server/grammer/antlr/EQLParser.java | 249 ++++++++++-------- src/test/resources/EQL.g4 | 15 ++ 7 files changed, 185 insertions(+), 128 deletions(-) diff --git a/src/main/java/com/avaje/ebeaninternal/server/grammer/EqlAdapter.java b/src/main/java/com/avaje/ebeaninternal/server/grammer/EqlAdapter.java index 3dfc85493..7a476f114 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/grammer/EqlAdapter.java +++ b/src/main/java/com/avaje/ebeaninternal/server/grammer/EqlAdapter.java @@ -288,6 +288,10 @@ class EqlAdapter extends EQLBaseListener { throw new IllegalStateException("expecting 3 children for comparison? " + ctx); } String path = getLeftHandSidePath(ctx); + String child = child(ctx, 2); + if (path.equals(child)) { + throw new IllegalArgumentException("Invalid expression "+path+" must be on LHS of expression"); + } String operator = child(ctx, 1); EqlOperator op = operatorMapping.get(operator); if (op == null) { @@ -295,7 +299,7 @@ class EqlAdapter extends EQLBaseListener { } // RHS is Path, Literal or Named input parameter - helper.addExpression(path, op, child(ctx, 2)); + helper.addExpression(path, op, child); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/grammer/EqlParser.java b/src/main/java/com/avaje/ebeaninternal/server/grammer/EqlParser.java index 083c49e49..12b5e7a41 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/grammer/EqlParser.java +++ b/src/main/java/com/avaje/ebeaninternal/server/grammer/EqlParser.java @@ -4,7 +4,10 @@ import com.avaje.ebeaninternal.api.SpiQuery; import com.avaje.ebeaninternal.server.grammer.antlr.EQLLexer; import com.avaje.ebeaninternal.server.grammer.antlr.EQLParser; import org.antlr.v4.runtime.ANTLRInputStream; +import org.antlr.v4.runtime.BaseErrorListener; import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; import org.antlr.v4.runtime.tree.ParseTreeWalker; /** @@ -12,6 +15,8 @@ import org.antlr.v4.runtime.tree.ParseTreeWalker; */ public class EqlParser { + private static final ErrorListener errorListener = new ErrorListener(); + /** * Parse the raw EQL query and apply it to the supplied query. */ @@ -20,6 +25,7 @@ public class EqlParser { EQLLexer lexer = new EQLLexer(new ANTLRInputStream(raw)); CommonTokenStream tokens = new CommonTokenStream(lexer); EQLParser parser = new EQLParser(tokens); + parser.addErrorListener(errorListener); EQLParser.Select_statementContext context = parser.select_statement(); EqlAdapter adapter = new EqlAdapter(query); @@ -29,4 +35,14 @@ public class EqlParser { query.simplifyExpressions(); } + + static class ErrorListener extends BaseErrorListener { + + @Override + public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { + + String reportMsg = "line " + line + ":" + charPositionInLine + " " + msg; + throw new IllegalArgumentException(reportMsg); + } + } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLBaseListener.java b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLBaseListener.java index 9bea015fd..9c4201e44 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLBaseListener.java +++ b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLBaseListener.java @@ -1,4 +1,4 @@ -// Generated from /home/rob/github/avaje-ebeanorm/src/test/resources/EQL.g4 by ANTLR 4.5.3 +// Generated from /home/rob/github/ebean/src/test/resources/EQL.g4 by ANTLR 4.5.3 package com.avaje.ebeaninternal.server.grammer.antlr; import org.antlr.v4.runtime.ParserRuleContext; diff --git a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLLexer.java b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLLexer.java index d65b01136..42b4b904f 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLLexer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLLexer.java @@ -1,16 +1,13 @@ -// Generated from /home/rob/github/avaje-ebeanorm/src/test/resources/EQL.g4 by ANTLR 4.5.3 +// Generated from /home/rob/github/ebean/src/test/resources/EQL.g4 by ANTLR 4.5.3 package com.avaje.ebeaninternal.server.grammer.antlr; - -import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.RuntimeMetaData; -import org.antlr.v4.runtime.Vocabulary; -import org.antlr.v4.runtime.VocabularyImpl; -import org.antlr.v4.runtime.atn.ATN; -import org.antlr.v4.runtime.atn.ATNDeserializer; -import org.antlr.v4.runtime.atn.LexerATNSimulator; -import org.antlr.v4.runtime.atn.PredictionContextCache; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class EQLLexer extends Lexer { @@ -100,6 +97,12 @@ public class EQLLexer extends Lexer { } + @Override + public void recover(RecognitionException e) { + throw new RuntimeException("Error in grammer - " + e.getMessage()); + } + + public EQLLexer(CharStream input) { super(input); _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); diff --git a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLListener.java b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLListener.java index 758e36fed..8a340bf8a 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLListener.java +++ b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLListener.java @@ -1,4 +1,4 @@ -// Generated from /home/rob/github/avaje-ebeanorm/src/test/resources/EQL.g4 by ANTLR 4.5.3 +// Generated from /home/rob/github/ebean/src/test/resources/EQL.g4 by ANTLR 4.5.3 package com.avaje.ebeaninternal.server.grammer.antlr; import org.antlr.v4.runtime.tree.ParseTreeListener; diff --git a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLParser.java b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLParser.java index 7644c2e38..a2f63fc6f 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLParser.java +++ b/src/main/java/com/avaje/ebeaninternal/server/grammer/antlr/EQLParser.java @@ -1,23 +1,13 @@ -// Generated from /home/rob/github/avaje-ebeanorm/src/test/resources/EQL.g4 by ANTLR 4.5.3 +// Generated from /home/rob/github/ebean/src/test/resources/EQL.g4 by ANTLR 4.5.3 package com.avaje.ebeaninternal.server.grammer.antlr; - -import org.antlr.v4.runtime.NoViableAltException; -import org.antlr.v4.runtime.Parser; -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.RecognitionException; -import org.antlr.v4.runtime.RuntimeMetaData; -import org.antlr.v4.runtime.TokenStream; -import org.antlr.v4.runtime.Vocabulary; -import org.antlr.v4.runtime.VocabularyImpl; -import org.antlr.v4.runtime.atn.ATN; -import org.antlr.v4.runtime.atn.ATNDeserializer; -import org.antlr.v4.runtime.atn.ParserATNSimulator; -import org.antlr.v4.runtime.atn.PredictionContextCache; +import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.tree.ParseTreeListener; -import org.antlr.v4.runtime.tree.TerminalNode; - +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class EQLParser extends Parser { @@ -130,6 +120,12 @@ public class EQLParser extends Parser { @Override public ATN getATN() { return _ATN; } + +// @Override +// public void recover(RecognitionException e) { +// throw new RuntimeException("Error in grammer - " + e.getMessage()); +// } + public EQLParser(TokenStream input) { super(input); _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); @@ -2178,14 +2174,35 @@ public class EQLParser extends Parser { Comparison_expressionContext _localctx = new Comparison_expressionContext(_ctx, getState()); enterRule(_localctx, 72, RULE_comparison_expression); try { - enterOuterAlt(_localctx, 1); - { - setState(306); - match(PATH_VARIABLE); - setState(307); - comparison_operator(); - setState(308); - value_expression(); + setState(314); + switch (_input.LA(1)) { + case PATH_VARIABLE: + enterOuterAlt(_localctx, 1); + { + setState(306); + match(PATH_VARIABLE); + setState(307); + comparison_operator(); + setState(308); + value_expression(); + } + break; + case INPUT_VARIABLE: + case BOOLEAN_LITERAL: + case NUMBER_LITERAL: + case STRING_LITERAL: + enterOuterAlt(_localctx, 2); + { + setState(310); + value_expression(); + setState(311); + comparison_operator(); + setState(312); + match(PATH_VARIABLE); + } + break; + default: + throw new NoViableAltException(this); } } catch (RecognitionException re) { @@ -2221,7 +2238,7 @@ public class EQLParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(310); + setState(316); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__46) | (1L << T__47) | (1L << T__48) | (1L << T__49) | (1L << T__50) | (1L << T__51) | (1L << T__52) | (1L << T__53) | (1L << T__54) | (1L << T__55) | (1L << T__56))) != 0)) ) { _errHandler.recoverInline(this); @@ -2264,21 +2281,21 @@ public class EQLParser extends Parser { Value_expressionContext _localctx = new Value_expressionContext(_ctx, getState()); enterRule(_localctx, 76, RULE_value_expression); try { - setState(314); + setState(320); switch (_input.LA(1)) { case BOOLEAN_LITERAL: case NUMBER_LITERAL: case STRING_LITERAL: enterOuterAlt(_localctx, 1); { - setState(312); + setState(318); literal(); } break; case INPUT_VARIABLE: enterOuterAlt(_localctx, 2); { - setState(313); + setState(319); match(INPUT_VARIABLE); } break; @@ -2322,7 +2339,7 @@ public class EQLParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(316); + setState(322); _la = _input.LA(1); if ( !(((((_la - 60)) & ~0x3f) == 0 && ((1L << (_la - 60)) & ((1L << (BOOLEAN_LITERAL - 60)) | (1L << (NUMBER_LITERAL - 60)) | (1L << (STRING_LITERAL - 60)))) != 0)) ) { _errHandler.recoverInline(this); @@ -2343,7 +2360,7 @@ public class EQLParser extends Parser { } public static final String _serializedATN = - "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3D\u0141\4\2\t\2\4"+ + "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3D\u0147\4\2\t\2\4"+ "\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+ "\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -2365,90 +2382,92 @@ public class EQLParser extends Parser { "\35\3\35\3\35\5\35\u00ff\n\35\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37"+ "\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \5 \u0112\n \3!\3!\3!\3!\3!\3!\3!\3"+ "!\5!\u011c\n!\3\"\3\"\3\"\3\"\3\"\5\"\u0123\n\"\3#\3#\3#\3#\3#\3#\3#\3"+ - "#\5#\u012d\n#\3$\3$\3$\3$\3%\3%\3&\3&\3&\3&\3\'\3\'\3(\3(\5(\u013d\n("+ - "\3)\3)\3)\2\2*\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64"+ - "\668:<>@BDFHJLNP\2\6\3\2\16\17\3\2$+\3\2,;\4\2>?CC\u0141\2S\3\2\2\2\4"+ - "d\3\2\2\2\6l\3\2\2\2\bn\3\2\2\2\np\3\2\2\2\fs\3\2\2\2\16}\3\2\2\2\20\u0088"+ - "\3\2\2\2\22\u008a\3\2\2\2\24\u008c\3\2\2\2\26\u0091\3\2\2\2\30\u0094\3"+ - "\2\2\2\32\u009c\3\2\2\2\34\u00a0\3\2\2\2\36\u00ab\3\2\2\2 \u00ad\3\2\2"+ - "\2\"\u00b0\3\2\2\2$\u00b5\3\2\2\2&\u00b7\3\2\2\2(\u00bb\3\2\2\2*\u00bf"+ - "\3\2\2\2,\u00c3\3\2\2\2.\u00cb\3\2\2\2\60\u00d4\3\2\2\2\62\u00dd\3\2\2"+ - "\2\64\u00ec\3\2\2\2\66\u00ee\3\2\2\28\u00fe\3\2\2\2:\u0100\3\2\2\2<\u0106"+ - "\3\2\2\2>\u0111\3\2\2\2@\u011b\3\2\2\2B\u0122\3\2\2\2D\u012c\3\2\2\2F"+ - "\u012e\3\2\2\2H\u0132\3\2\2\2J\u0134\3\2\2\2L\u0138\3\2\2\2N\u013c\3\2"+ - "\2\2P\u013e\3\2\2\2RT\5\4\3\2SR\3\2\2\2ST\3\2\2\2TX\3\2\2\2UW\5\b\5\2"+ - "VU\3\2\2\2WZ\3\2\2\2XV\3\2\2\2XY\3\2\2\2Y\\\3\2\2\2ZX\3\2\2\2[]\5\n\6"+ - "\2\\[\3\2\2\2\\]\3\2\2\2]_\3\2\2\2^`\5\f\7\2_^\3\2\2\2_`\3\2\2\2`b\3\2"+ - "\2\2ac\5\24\13\2ba\3\2\2\2bc\3\2\2\2c\3\3\2\2\2df\7\3\2\2eg\5\6\4\2fe"+ - "\3\2\2\2fg\3\2\2\2gh\3\2\2\2hi\7\4\2\2ij\5\34\17\2jk\7\5\2\2k\5\3\2\2"+ - "\2lm\7\6\2\2m\7\3\2\2\2no\5\30\r\2o\t\3\2\2\2pq\7\7\2\2qr\5,\27\2r\13"+ - "\3\2\2\2st\7\b\2\2tu\7\t\2\2uz\5\16\b\2vw\7\n\2\2wy\5\16\b\2xv\3\2\2\2"+ - "y|\3\2\2\2zx\3\2\2\2z{\3\2\2\2{\r\3\2\2\2|z\3\2\2\2}\177\7=\2\2~\u0080"+ - "\5\22\n\2\177~\3\2\2\2\177\u0080\3\2\2\2\u0080\u0082\3\2\2\2\u0081\u0083"+ - "\5\20\t\2\u0082\u0081\3\2\2\2\u0082\u0083\3\2\2\2\u0083\17\3\2\2\2\u0084"+ - "\u0085\7\13\2\2\u0085\u0089\7\f\2\2\u0086\u0087\7\13\2\2\u0087\u0089\7"+ - "\r\2\2\u0088\u0084\3\2\2\2\u0088\u0086\3\2\2\2\u0089\21\3\2\2\2\u008a"+ - "\u008b\t\2\2\2\u008b\23\3\2\2\2\u008c\u008d\7\20\2\2\u008d\u008f\7?\2"+ - "\2\u008e\u0090\5\26\f\2\u008f\u008e\3\2\2\2\u008f\u0090\3\2\2\2\u0090"+ - "\25\3\2\2\2\u0091\u0092\7\21\2\2\u0092\u0093\7?\2\2\u0093\27\3\2\2\2\u0094"+ - "\u0096\7\22\2\2\u0095\u0097\5$\23\2\u0096\u0095\3\2\2\2\u0096\u0097\3"+ - "\2\2\2\u0097\u0098\3\2\2\2\u0098\u009a\7=\2\2\u0099\u009b\5\32\16\2\u009a"+ - "\u0099\3\2\2\2\u009a\u009b\3\2\2\2\u009b\31\3\2\2\2\u009c\u009d\7\4\2"+ - "\2\u009d\u009e\5\34\17\2\u009e\u009f\7\5\2\2\u009f\33\3\2\2\2\u00a0\u00a5"+ - "\5\36\20\2\u00a1\u00a2\7\n\2\2\u00a2\u00a4\5\36\20\2\u00a3\u00a1\3\2\2"+ - "\2\u00a4\u00a7\3\2\2\2\u00a5\u00a3\3\2\2\2\u00a5\u00a6\3\2\2\2\u00a6\35"+ - "\3\2\2\2\u00a7\u00a5\3\2\2\2\u00a8\u00ac\7=\2\2\u00a9\u00ac\5 \21\2\u00aa"+ - "\u00ac\5\"\22\2\u00ab\u00a8\3\2\2\2\u00ab\u00a9\3\2\2\2\u00ab\u00aa\3"+ - "\2\2\2\u00ac\37\3\2\2\2\u00ad\u00ae\7\23\2\2\u00ae\u00af\5&\24\2\u00af"+ - "!\3\2\2\2\u00b0\u00b1\7\23\2\2\u00b1\u00b2\5(\25\2\u00b2#\3\2\2\2\u00b3"+ - "\u00b6\5&\24\2\u00b4\u00b6\5(\25\2\u00b5\u00b3\3\2\2\2\u00b5\u00b4\3\2"+ - "\2\2\u00b6%\3\2\2\2\u00b7\u00b9\7\24\2\2\u00b8\u00ba\5*\26\2\u00b9\u00b8"+ - "\3\2\2\2\u00b9\u00ba\3\2\2\2\u00ba\'\3\2\2\2\u00bb\u00bd\7\25\2\2\u00bc"+ - "\u00be\5*\26\2\u00bd\u00bc\3\2\2\2\u00bd\u00be\3\2\2\2\u00be)\3\2\2\2"+ - "\u00bf\u00c0\7\4\2\2\u00c0\u00c1\7?\2\2\u00c1\u00c2\7\5\2\2\u00c2+\3\2"+ - "\2\2\u00c3\u00c8\5.\30\2\u00c4\u00c5\7\26\2\2\u00c5\u00c7\5.\30\2\u00c6"+ - "\u00c4\3\2\2\2\u00c7\u00ca\3\2\2\2\u00c8\u00c6\3\2\2\2\u00c8\u00c9\3\2"+ - "\2\2\u00c9-\3\2\2\2\u00ca\u00c8\3\2\2\2\u00cb\u00d0\5\60\31\2\u00cc\u00cd"+ - "\7\27\2\2\u00cd\u00cf\5\60\31\2\u00ce\u00cc\3\2\2\2\u00cf\u00d2\3\2\2"+ - "\2\u00d0\u00ce\3\2\2\2\u00d0\u00d1\3\2\2\2\u00d1/\3\2\2\2\u00d2\u00d0"+ - "\3\2\2\2\u00d3\u00d5\7\30\2\2\u00d4\u00d3\3\2\2\2\u00d4\u00d5\3\2\2\2"+ - "\u00d5\u00d6\3\2\2\2\u00d6\u00d7\5\62\32\2\u00d7\61\3\2\2\2\u00d8\u00de"+ - "\5\64\33\2\u00d9\u00da\7\4\2\2\u00da\u00db\5,\27\2\u00db\u00dc\7\5\2\2"+ - "\u00dc\u00de\3\2\2\2\u00dd\u00d8\3\2\2\2\u00dd\u00d9\3\2\2\2\u00de\63"+ - "\3\2\2\2\u00df\u00ed\5J&\2\u00e0\u00ed\5F$\2\u00e1\u00ed\5:\36\2\u00e2"+ - "\u00ed\5<\37\2\u00e3\u00ed\5\66\34\2\u00e4\u00ed\5> \2\u00e5\u00ed\5@"+ - "!\2\u00e6\u00ed\5B\"\2\u00e7\u00ed\5D#\2\u00e8\u00e9\7\4\2\2\u00e9\u00ea"+ - "\5\64\33\2\u00ea\u00eb\7\5\2\2\u00eb\u00ed\3\2\2\2\u00ec\u00df\3\2\2\2"+ - "\u00ec\u00e0\3\2\2\2\u00ec\u00e1\3\2\2\2\u00ec\u00e2\3\2\2\2\u00ec\u00e3"+ - "\3\2\2\2\u00ec\u00e4\3\2\2\2\u00ec\u00e5\3\2\2\2\u00ec\u00e6\3\2\2\2\u00ec"+ - "\u00e7\3\2\2\2\u00ec\u00e8\3\2\2\2\u00ed\65\3\2\2\2\u00ee\u00ef\7=\2\2"+ - "\u00ef\u00f0\7\31\2\2\u00f0\u00f1\58\35\2\u00f1\67\3\2\2\2\u00f2\u00ff"+ - "\7<\2\2\u00f3\u00f4\7\4\2\2\u00f4\u00f9\5N(\2\u00f5\u00f6\7\n\2\2\u00f6"+ - "\u00f8\5N(\2\u00f7\u00f5\3\2\2\2\u00f8\u00fb\3\2\2\2\u00f9\u00f7\3\2\2"+ - "\2\u00f9\u00fa\3\2\2\2\u00fa\u00fc\3\2\2\2\u00fb\u00f9\3\2\2\2\u00fc\u00fd"+ - "\7\5\2\2\u00fd\u00ff\3\2\2\2\u00fe\u00f2\3\2\2\2\u00fe\u00f3\3\2\2\2\u00ff"+ - "9\3\2\2\2\u0100\u0101\7=\2\2\u0101\u0102\7\32\2\2\u0102\u0103\5N(\2\u0103"+ - "\u0104\7\27\2\2\u0104\u0105\5N(\2\u0105;\3\2\2\2\u0106\u0107\5N(\2\u0107"+ - "\u0108\7\32\2\2\u0108\u0109\7=\2\2\u0109\u010a\7\27\2\2\u010a\u010b\7"+ - "=\2\2\u010b=\3\2\2\2\u010c\u010d\7=\2\2\u010d\u010e\7\33\2\2\u010e\u0112"+ - "\7\34\2\2\u010f\u0110\7=\2\2\u0110\u0112\7\35\2\2\u0111\u010c\3\2\2\2"+ - "\u0111\u010f\3\2\2\2\u0112?\3\2\2\2\u0113\u0114\7=\2\2\u0114\u0115\7\33"+ - "\2\2\u0115\u0116\7\30\2\2\u0116\u011c\7\34\2\2\u0117\u0118\7=\2\2\u0118"+ - "\u011c\7\36\2\2\u0119\u011a\7=\2\2\u011a\u011c\7\37\2\2\u011b\u0113\3"+ - "\2\2\2\u011b\u0117\3\2\2\2\u011b\u0119\3\2\2\2\u011cA\3\2\2\2\u011d\u011e"+ - "\7=\2\2\u011e\u011f\7\33\2\2\u011f\u0123\7 \2\2\u0120\u0121\7=\2\2\u0121"+ - "\u0123\7!\2\2\u0122\u011d\3\2\2\2\u0122\u0120\3\2\2\2\u0123C\3\2\2\2\u0124"+ - "\u0125\7=\2\2\u0125\u0126\7\33\2\2\u0126\u0127\7\30\2\2\u0127\u012d\7"+ - " \2\2\u0128\u0129\7=\2\2\u0129\u012d\7\"\2\2\u012a\u012b\7=\2\2\u012b"+ - "\u012d\7#\2\2\u012c\u0124\3\2\2\2\u012c\u0128\3\2\2\2\u012c\u012a\3\2"+ - "\2\2\u012dE\3\2\2\2\u012e\u012f\7=\2\2\u012f\u0130\5H%\2\u0130\u0131\5"+ - "N(\2\u0131G\3\2\2\2\u0132\u0133\t\3\2\2\u0133I\3\2\2\2\u0134\u0135\7="+ - "\2\2\u0135\u0136\5L\'\2\u0136\u0137\5N(\2\u0137K\3\2\2\2\u0138\u0139\t"+ - "\4\2\2\u0139M\3\2\2\2\u013a\u013d\5P)\2\u013b\u013d\7<\2\2\u013c\u013a"+ - "\3\2\2\2\u013c\u013b\3\2\2\2\u013dO\3\2\2\2\u013e\u013f\t\5\2\2\u013f"+ - "Q\3\2\2\2 SX\\_bfz\177\u0082\u0088\u008f\u0096\u009a\u00a5\u00ab\u00b5"+ - "\u00b9\u00bd\u00c8\u00d0\u00d4\u00dd\u00ec\u00f9\u00fe\u0111\u011b\u0122"+ - "\u012c\u013c"; + "#\5#\u012d\n#\3$\3$\3$\3$\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\5&\u013d\n&\3"+ + "\'\3\'\3(\3(\5(\u0143\n(\3)\3)\3)\2\2*\2\4\6\b\n\f\16\20\22\24\26\30\32"+ + "\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNP\2\6\3\2\16\17\3\2$+\3\2,;\4\2"+ + ">?CC\u0148\2S\3\2\2\2\4d\3\2\2\2\6l\3\2\2\2\bn\3\2\2\2\np\3\2\2\2\fs\3"+ + "\2\2\2\16}\3\2\2\2\20\u0088\3\2\2\2\22\u008a\3\2\2\2\24\u008c\3\2\2\2"+ + "\26\u0091\3\2\2\2\30\u0094\3\2\2\2\32\u009c\3\2\2\2\34\u00a0\3\2\2\2\36"+ + "\u00ab\3\2\2\2 \u00ad\3\2\2\2\"\u00b0\3\2\2\2$\u00b5\3\2\2\2&\u00b7\3"+ + "\2\2\2(\u00bb\3\2\2\2*\u00bf\3\2\2\2,\u00c3\3\2\2\2.\u00cb\3\2\2\2\60"+ + "\u00d4\3\2\2\2\62\u00dd\3\2\2\2\64\u00ec\3\2\2\2\66\u00ee\3\2\2\28\u00fe"+ + "\3\2\2\2:\u0100\3\2\2\2<\u0106\3\2\2\2>\u0111\3\2\2\2@\u011b\3\2\2\2B"+ + "\u0122\3\2\2\2D\u012c\3\2\2\2F\u012e\3\2\2\2H\u0132\3\2\2\2J\u013c\3\2"+ + "\2\2L\u013e\3\2\2\2N\u0142\3\2\2\2P\u0144\3\2\2\2RT\5\4\3\2SR\3\2\2\2"+ + "ST\3\2\2\2TX\3\2\2\2UW\5\b\5\2VU\3\2\2\2WZ\3\2\2\2XV\3\2\2\2XY\3\2\2\2"+ + "Y\\\3\2\2\2ZX\3\2\2\2[]\5\n\6\2\\[\3\2\2\2\\]\3\2\2\2]_\3\2\2\2^`\5\f"+ + "\7\2_^\3\2\2\2_`\3\2\2\2`b\3\2\2\2ac\5\24\13\2ba\3\2\2\2bc\3\2\2\2c\3"+ + "\3\2\2\2df\7\3\2\2eg\5\6\4\2fe\3\2\2\2fg\3\2\2\2gh\3\2\2\2hi\7\4\2\2i"+ + "j\5\34\17\2jk\7\5\2\2k\5\3\2\2\2lm\7\6\2\2m\7\3\2\2\2no\5\30\r\2o\t\3"+ + "\2\2\2pq\7\7\2\2qr\5,\27\2r\13\3\2\2\2st\7\b\2\2tu\7\t\2\2uz\5\16\b\2"+ + "vw\7\n\2\2wy\5\16\b\2xv\3\2\2\2y|\3\2\2\2zx\3\2\2\2z{\3\2\2\2{\r\3\2\2"+ + "\2|z\3\2\2\2}\177\7=\2\2~\u0080\5\22\n\2\177~\3\2\2\2\177\u0080\3\2\2"+ + "\2\u0080\u0082\3\2\2\2\u0081\u0083\5\20\t\2\u0082\u0081\3\2\2\2\u0082"+ + "\u0083\3\2\2\2\u0083\17\3\2\2\2\u0084\u0085\7\13\2\2\u0085\u0089\7\f\2"+ + "\2\u0086\u0087\7\13\2\2\u0087\u0089\7\r\2\2\u0088\u0084\3\2\2\2\u0088"+ + "\u0086\3\2\2\2\u0089\21\3\2\2\2\u008a\u008b\t\2\2\2\u008b\23\3\2\2\2\u008c"+ + "\u008d\7\20\2\2\u008d\u008f\7?\2\2\u008e\u0090\5\26\f\2\u008f\u008e\3"+ + "\2\2\2\u008f\u0090\3\2\2\2\u0090\25\3\2\2\2\u0091\u0092\7\21\2\2\u0092"+ + "\u0093\7?\2\2\u0093\27\3\2\2\2\u0094\u0096\7\22\2\2\u0095\u0097\5$\23"+ + "\2\u0096\u0095\3\2\2\2\u0096\u0097\3\2\2\2\u0097\u0098\3\2\2\2\u0098\u009a"+ + "\7=\2\2\u0099\u009b\5\32\16\2\u009a\u0099\3\2\2\2\u009a\u009b\3\2\2\2"+ + "\u009b\31\3\2\2\2\u009c\u009d\7\4\2\2\u009d\u009e\5\34\17\2\u009e\u009f"+ + "\7\5\2\2\u009f\33\3\2\2\2\u00a0\u00a5\5\36\20\2\u00a1\u00a2\7\n\2\2\u00a2"+ + "\u00a4\5\36\20\2\u00a3\u00a1\3\2\2\2\u00a4\u00a7\3\2\2\2\u00a5\u00a3\3"+ + "\2\2\2\u00a5\u00a6\3\2\2\2\u00a6\35\3\2\2\2\u00a7\u00a5\3\2\2\2\u00a8"+ + "\u00ac\7=\2\2\u00a9\u00ac\5 \21\2\u00aa\u00ac\5\"\22\2\u00ab\u00a8\3\2"+ + "\2\2\u00ab\u00a9\3\2\2\2\u00ab\u00aa\3\2\2\2\u00ac\37\3\2\2\2\u00ad\u00ae"+ + "\7\23\2\2\u00ae\u00af\5&\24\2\u00af!\3\2\2\2\u00b0\u00b1\7\23\2\2\u00b1"+ + "\u00b2\5(\25\2\u00b2#\3\2\2\2\u00b3\u00b6\5&\24\2\u00b4\u00b6\5(\25\2"+ + "\u00b5\u00b3\3\2\2\2\u00b5\u00b4\3\2\2\2\u00b6%\3\2\2\2\u00b7\u00b9\7"+ + "\24\2\2\u00b8\u00ba\5*\26\2\u00b9\u00b8\3\2\2\2\u00b9\u00ba\3\2\2\2\u00ba"+ + "\'\3\2\2\2\u00bb\u00bd\7\25\2\2\u00bc\u00be\5*\26\2\u00bd\u00bc\3\2\2"+ + "\2\u00bd\u00be\3\2\2\2\u00be)\3\2\2\2\u00bf\u00c0\7\4\2\2\u00c0\u00c1"+ + "\7?\2\2\u00c1\u00c2\7\5\2\2\u00c2+\3\2\2\2\u00c3\u00c8\5.\30\2\u00c4\u00c5"+ + "\7\26\2\2\u00c5\u00c7\5.\30\2\u00c6\u00c4\3\2\2\2\u00c7\u00ca\3\2\2\2"+ + "\u00c8\u00c6\3\2\2\2\u00c8\u00c9\3\2\2\2\u00c9-\3\2\2\2\u00ca\u00c8\3"+ + "\2\2\2\u00cb\u00d0\5\60\31\2\u00cc\u00cd\7\27\2\2\u00cd\u00cf\5\60\31"+ + "\2\u00ce\u00cc\3\2\2\2\u00cf\u00d2\3\2\2\2\u00d0\u00ce\3\2\2\2\u00d0\u00d1"+ + "\3\2\2\2\u00d1/\3\2\2\2\u00d2\u00d0\3\2\2\2\u00d3\u00d5\7\30\2\2\u00d4"+ + "\u00d3\3\2\2\2\u00d4\u00d5\3\2\2\2\u00d5\u00d6\3\2\2\2\u00d6\u00d7\5\62"+ + "\32\2\u00d7\61\3\2\2\2\u00d8\u00de\5\64\33\2\u00d9\u00da\7\4\2\2\u00da"+ + "\u00db\5,\27\2\u00db\u00dc\7\5\2\2\u00dc\u00de\3\2\2\2\u00dd\u00d8\3\2"+ + "\2\2\u00dd\u00d9\3\2\2\2\u00de\63\3\2\2\2\u00df\u00ed\5J&\2\u00e0\u00ed"+ + "\5F$\2\u00e1\u00ed\5:\36\2\u00e2\u00ed\5<\37\2\u00e3\u00ed\5\66\34\2\u00e4"+ + "\u00ed\5> \2\u00e5\u00ed\5@!\2\u00e6\u00ed\5B\"\2\u00e7\u00ed\5D#\2\u00e8"+ + "\u00e9\7\4\2\2\u00e9\u00ea\5\64\33\2\u00ea\u00eb\7\5\2\2\u00eb\u00ed\3"+ + "\2\2\2\u00ec\u00df\3\2\2\2\u00ec\u00e0\3\2\2\2\u00ec\u00e1\3\2\2\2\u00ec"+ + "\u00e2\3\2\2\2\u00ec\u00e3\3\2\2\2\u00ec\u00e4\3\2\2\2\u00ec\u00e5\3\2"+ + "\2\2\u00ec\u00e6\3\2\2\2\u00ec\u00e7\3\2\2\2\u00ec\u00e8\3\2\2\2\u00ed"+ + "\65\3\2\2\2\u00ee\u00ef\7=\2\2\u00ef\u00f0\7\31\2\2\u00f0\u00f1\58\35"+ + "\2\u00f1\67\3\2\2\2\u00f2\u00ff\7<\2\2\u00f3\u00f4\7\4\2\2\u00f4\u00f9"+ + "\5N(\2\u00f5\u00f6\7\n\2\2\u00f6\u00f8\5N(\2\u00f7\u00f5\3\2\2\2\u00f8"+ + "\u00fb\3\2\2\2\u00f9\u00f7\3\2\2\2\u00f9\u00fa\3\2\2\2\u00fa\u00fc\3\2"+ + "\2\2\u00fb\u00f9\3\2\2\2\u00fc\u00fd\7\5\2\2\u00fd\u00ff\3\2\2\2\u00fe"+ + "\u00f2\3\2\2\2\u00fe\u00f3\3\2\2\2\u00ff9\3\2\2\2\u0100\u0101\7=\2\2\u0101"+ + "\u0102\7\32\2\2\u0102\u0103\5N(\2\u0103\u0104\7\27\2\2\u0104\u0105\5N"+ + "(\2\u0105;\3\2\2\2\u0106\u0107\5N(\2\u0107\u0108\7\32\2\2\u0108\u0109"+ + "\7=\2\2\u0109\u010a\7\27\2\2\u010a\u010b\7=\2\2\u010b=\3\2\2\2\u010c\u010d"+ + "\7=\2\2\u010d\u010e\7\33\2\2\u010e\u0112\7\34\2\2\u010f\u0110\7=\2\2\u0110"+ + "\u0112\7\35\2\2\u0111\u010c\3\2\2\2\u0111\u010f\3\2\2\2\u0112?\3\2\2\2"+ + "\u0113\u0114\7=\2\2\u0114\u0115\7\33\2\2\u0115\u0116\7\30\2\2\u0116\u011c"+ + "\7\34\2\2\u0117\u0118\7=\2\2\u0118\u011c\7\36\2\2\u0119\u011a\7=\2\2\u011a"+ + "\u011c\7\37\2\2\u011b\u0113\3\2\2\2\u011b\u0117\3\2\2\2\u011b\u0119\3"+ + "\2\2\2\u011cA\3\2\2\2\u011d\u011e\7=\2\2\u011e\u011f\7\33\2\2\u011f\u0123"+ + "\7 \2\2\u0120\u0121\7=\2\2\u0121\u0123\7!\2\2\u0122\u011d\3\2\2\2\u0122"+ + "\u0120\3\2\2\2\u0123C\3\2\2\2\u0124\u0125\7=\2\2\u0125\u0126\7\33\2\2"+ + "\u0126\u0127\7\30\2\2\u0127\u012d\7 \2\2\u0128\u0129\7=\2\2\u0129\u012d"+ + "\7\"\2\2\u012a\u012b\7=\2\2\u012b\u012d\7#\2\2\u012c\u0124\3\2\2\2\u012c"+ + "\u0128\3\2\2\2\u012c\u012a\3\2\2\2\u012dE\3\2\2\2\u012e\u012f\7=\2\2\u012f"+ + "\u0130\5H%\2\u0130\u0131\5N(\2\u0131G\3\2\2\2\u0132\u0133\t\3\2\2\u0133"+ + "I\3\2\2\2\u0134\u0135\7=\2\2\u0135\u0136\5L\'\2\u0136\u0137\5N(\2\u0137"+ + "\u013d\3\2\2\2\u0138\u0139\5N(\2\u0139\u013a\5L\'\2\u013a\u013b\7=\2\2"+ + "\u013b\u013d\3\2\2\2\u013c\u0134\3\2\2\2\u013c\u0138\3\2\2\2\u013dK\3"+ + "\2\2\2\u013e\u013f\t\4\2\2\u013fM\3\2\2\2\u0140\u0143\5P)\2\u0141\u0143"+ + "\7<\2\2\u0142\u0140\3\2\2\2\u0142\u0141\3\2\2\2\u0143O\3\2\2\2\u0144\u0145"+ + "\t\5\2\2\u0145Q\3\2\2\2!SX\\_bfz\177\u0082\u0088\u008f\u0096\u009a\u00a5"+ + "\u00ab\u00b5\u00b9\u00bd\u00c8\u00d0\u00d4\u00dd\u00ec\u00f9\u00fe\u0111"+ + "\u011b\u0122\u012c\u013c\u0142"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/test/resources/EQL.g4 b/src/test/resources/EQL.g4 index 82037c7cc..da25a2851 100644 --- a/src/test/resources/EQL.g4 +++ b/src/test/resources/EQL.g4 @@ -1,5 +1,19 @@ grammar EQL; +@parser::members { + @Override + public void reportError(RecognitionException e) { + throw new RuntimeException("Error in grammer - " + e.getMessage()); + } +} + +@lexer::members { + @Override + public void reportError(RecognitionException e) { + throw new RuntimeException("Error in grammer - " + e.getMessage()); + } +} + select_statement : select_clause? fetch_clause* where_clause? orderby_clause? limit_clause? ; @@ -171,6 +185,7 @@ like_op comparison_expression : PATH_VARIABLE comparison_operator value_expression + | value_expression comparison_operator PATH_VARIABLE ; comparison_operator