diff --git a/x-pack/plugin/eql/src/main/antlr/EqlBase.g4 b/x-pack/plugin/eql/src/main/antlr/EqlBase.g4 index aaf0c56519fe9..3b93cbc6e2c11 100644 --- a/x-pack/plugin/eql/src/main/antlr/EqlBase.g4 +++ b/x-pack/plugin/eql/src/main/antlr/EqlBase.g4 @@ -84,11 +84,15 @@ booleanExpression valueExpression - : primaryExpression predicate? #valueExpressionDefault - | operator=(MINUS | PLUS) valueExpression #arithmeticUnary - | left=valueExpression operator=(ASTERISK | SLASH | PERCENT) right=valueExpression #arithmeticBinary - | left=valueExpression operator=(PLUS | MINUS) right=valueExpression #arithmeticBinary - | left=valueExpression comparisonOperator right=valueExpression #comparison + : operatorExpression #valueExpressionDefault + | left=operatorExpression comparisonOperator right=operatorExpression #comparison + ; + +operatorExpression + : primaryExpression predicate? #operatorExpressionDefault + | operator=(MINUS | PLUS) operatorExpression #arithmeticUnary + | left=operatorExpression operator=(ASTERISK | SLASH | PERCENT) right=operatorExpression #arithmeticBinary + | left=operatorExpression operator=(PLUS | MINUS) right=operatorExpression #arithmeticBinary ; // workaround for diff --git a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseBaseListener.java b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseBaseListener.java index d0c10757df199..76e5f219b1609 100644 --- a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseBaseListener.java +++ b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseBaseListener.java @@ -263,6 +263,18 @@ class EqlBaseBaseListener implements EqlBaseListener { *

The default implementation does nothing.

*/ @Override public void exitComparison(EqlBaseParser.ComparisonContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOperatorExpressionDefault(EqlBaseParser.OperatorExpressionDefaultContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOperatorExpressionDefault(EqlBaseParser.OperatorExpressionDefaultContext ctx) { } /** * {@inheritDoc} * diff --git a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseBaseVisitor.java b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseBaseVisitor.java index 48d66d265ed3f..beadef3d09223 100644 --- a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseBaseVisitor.java +++ b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseBaseVisitor.java @@ -158,6 +158,13 @@ class EqlBaseBaseVisitor extends AbstractParseTreeVisitor implements EqlBa * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitComparison(EqlBaseParser.ComparisonContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitOperatorExpressionDefault(EqlBaseParser.OperatorExpressionDefaultContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseListener.java b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseListener.java index 6d360106c1cbd..031f80d8e0377 100644 --- a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseListener.java +++ b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseListener.java @@ -229,27 +229,39 @@ interface EqlBaseListener extends ParseTreeListener { * @param ctx the parse tree */ void exitComparison(EqlBaseParser.ComparisonContext ctx); + /** + * Enter a parse tree produced by the {@code operatorExpressionDefault} + * labeled alternative in {@link EqlBaseParser#operatorExpression}. + * @param ctx the parse tree + */ + void enterOperatorExpressionDefault(EqlBaseParser.OperatorExpressionDefaultContext ctx); + /** + * Exit a parse tree produced by the {@code operatorExpressionDefault} + * labeled alternative in {@link EqlBaseParser#operatorExpression}. + * @param ctx the parse tree + */ + void exitOperatorExpressionDefault(EqlBaseParser.OperatorExpressionDefaultContext ctx); /** * Enter a parse tree produced by the {@code arithmeticBinary} - * labeled alternative in {@link EqlBaseParser#valueExpression}. + * labeled alternative in {@link EqlBaseParser#operatorExpression}. * @param ctx the parse tree */ void enterArithmeticBinary(EqlBaseParser.ArithmeticBinaryContext ctx); /** * Exit a parse tree produced by the {@code arithmeticBinary} - * labeled alternative in {@link EqlBaseParser#valueExpression}. + * labeled alternative in {@link EqlBaseParser#operatorExpression}. * @param ctx the parse tree */ void exitArithmeticBinary(EqlBaseParser.ArithmeticBinaryContext ctx); /** * Enter a parse tree produced by the {@code arithmeticUnary} - * labeled alternative in {@link EqlBaseParser#valueExpression}. + * labeled alternative in {@link EqlBaseParser#operatorExpression}. * @param ctx the parse tree */ void enterArithmeticUnary(EqlBaseParser.ArithmeticUnaryContext ctx); /** * Exit a parse tree produced by the {@code arithmeticUnary} - * labeled alternative in {@link EqlBaseParser#valueExpression}. + * labeled alternative in {@link EqlBaseParser#operatorExpression}. * @param ctx the parse tree */ void exitArithmeticUnary(EqlBaseParser.ArithmeticUnaryContext ctx); diff --git a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseParser.java b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseParser.java index 13608aef13b1d..4648c04da2a76 100644 --- a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseParser.java +++ b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseParser.java @@ -28,16 +28,18 @@ class EqlBaseParser extends Parser { RULE_query = 3, RULE_sequenceParams = 4, RULE_sequence = 5, RULE_join = 6, RULE_pipe = 7, RULE_joinKeys = 8, RULE_joinTerm = 9, RULE_sequenceTerm = 10, RULE_subquery = 11, RULE_eventQuery = 12, RULE_eventFilter = 13, RULE_expression = 14, - RULE_booleanExpression = 15, RULE_valueExpression = 16, RULE_predicate = 17, - RULE_primaryExpression = 18, RULE_functionExpression = 19, RULE_constant = 20, - RULE_comparisonOperator = 21, RULE_booleanValue = 22, RULE_qualifiedName = 23, - RULE_identifier = 24, RULE_timeUnit = 25, RULE_number = 26, RULE_string = 27; + RULE_booleanExpression = 15, RULE_valueExpression = 16, RULE_operatorExpression = 17, + RULE_predicate = 18, RULE_primaryExpression = 19, RULE_functionExpression = 20, + RULE_constant = 21, RULE_comparisonOperator = 22, RULE_booleanValue = 23, + RULE_qualifiedName = 24, RULE_identifier = 25, RULE_timeUnit = 26, RULE_number = 27, + RULE_string = 28; public static final String[] ruleNames = { "singleStatement", "singleExpression", "statement", "query", "sequenceParams", "sequence", "join", "pipe", "joinKeys", "joinTerm", "sequenceTerm", "subquery", "eventQuery", "eventFilter", "expression", "booleanExpression", "valueExpression", - "predicate", "primaryExpression", "functionExpression", "constant", "comparisonOperator", - "booleanValue", "qualifiedName", "identifier", "timeUnit", "number", "string" + "operatorExpression", "predicate", "primaryExpression", "functionExpression", + "constant", "comparisonOperator", "booleanValue", "qualifiedName", "identifier", + "timeUnit", "number", "string" }; private static final String[] _LITERAL_NAMES = { @@ -134,9 +136,9 @@ public final SingleStatementContext singleStatement() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(56); + setState(58); statement(); - setState(57); + setState(59); match(EOF); } } @@ -181,9 +183,9 @@ public final SingleExpressionContext singleExpression() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(59); + setState(61); expression(); - setState(60); + setState(62); match(EOF); } } @@ -234,19 +236,19 @@ public final StatementContext statement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(62); + setState(64); query(); - setState(66); + setState(68); _errHandler.sync(this); _la = _input.LA(1); while (_la==PIPE) { { { - setState(63); + setState(65); pipe(); } } - setState(68); + setState(70); _errHandler.sync(this); _la = _input.LA(1); } @@ -296,19 +298,19 @@ public final QueryContext query() throws RecognitionException { QueryContext _localctx = new QueryContext(_ctx, getState()); enterRule(_localctx, 6, RULE_query); try { - setState(72); + setState(74); switch (_input.LA(1)) { case SEQUENCE: enterOuterAlt(_localctx, 1); { - setState(69); + setState(71); sequence(); } break; case JOIN: enterOuterAlt(_localctx, 2); { - setState(70); + setState(72); join(); } break; @@ -317,7 +319,7 @@ public final QueryContext query() throws RecognitionException { case IDENTIFIER: enterOuterAlt(_localctx, 3); { - setState(71); + setState(73); eventQuery(); } break; @@ -368,14 +370,14 @@ public final SequenceParamsContext sequenceParams() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(74); + setState(76); match(WITH); { - setState(75); + setState(77); match(MAXSPAN); - setState(76); + setState(78); match(EQ); - setState(77); + setState(79); timeUnit(); } } @@ -435,19 +437,19 @@ public final SequenceContext sequence() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(79); + setState(81); match(SEQUENCE); - setState(88); + setState(90); switch (_input.LA(1)) { case BY: { - setState(80); - ((SequenceContext)_localctx).by = joinKeys(); setState(82); + ((SequenceContext)_localctx).by = joinKeys(); + setState(84); _la = _input.LA(1); if (_la==WITH) { { - setState(81); + setState(83); sequenceParams(); } } @@ -456,13 +458,13 @@ public final SequenceContext sequence() throws RecognitionException { break; case WITH: { - setState(84); - sequenceParams(); setState(86); + sequenceParams(); + setState(88); _la = _input.LA(1); if (_la==BY) { { - setState(85); + setState(87); ((SequenceContext)_localctx).disallowed = joinKeys(); } } @@ -474,29 +476,29 @@ public final SequenceContext sequence() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(90); + setState(92); sequenceTerm(); - setState(92); + setState(94); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(91); + setState(93); sequenceTerm(); } } - setState(94); + setState(96); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==LB ); - setState(98); + setState(100); _la = _input.LA(1); if (_la==UNTIL) { { - setState(96); + setState(98); match(UNTIL); - setState(97); + setState(99); ((SequenceContext)_localctx).until = sequenceTerm(); } } @@ -554,40 +556,40 @@ public final JoinContext join() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(100); - match(JOIN); setState(102); + match(JOIN); + setState(104); _la = _input.LA(1); if (_la==BY) { { - setState(101); + setState(103); ((JoinContext)_localctx).by = joinKeys(); } } - setState(104); + setState(106); joinTerm(); - setState(106); + setState(108); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(105); + setState(107); joinTerm(); } } - setState(108); + setState(110); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==LB ); - setState(112); + setState(114); _la = _input.LA(1); if (_la==UNTIL) { { - setState(110); + setState(112); match(UNTIL); - setState(111); + setState(113); ((JoinContext)_localctx).until = joinTerm(); } } @@ -645,29 +647,29 @@ public final PipeContext pipe() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(114); + setState(116); match(PIPE); - setState(115); + setState(117); ((PipeContext)_localctx).kind = match(IDENTIFIER); - setState(124); + setState(126); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FALSE) | (1L << NOT) | (1L << NULL) | (1L << TRUE) | (1L << PLUS) | (1L << MINUS) | (1L << LP) | (1L << ESCAPED_IDENTIFIER) | (1L << STRING) | (1L << INTEGER_VALUE) | (1L << DECIMAL_VALUE) | (1L << IDENTIFIER))) != 0)) { { - setState(116); + setState(118); booleanExpression(0); - setState(121); + setState(123); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(117); + setState(119); match(COMMA); - setState(118); + setState(120); booleanExpression(0); } } - setState(123); + setState(125); _errHandler.sync(this); _la = _input.LA(1); } @@ -725,23 +727,23 @@ public final JoinKeysContext joinKeys() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(126); + setState(128); match(BY); - setState(127); + setState(129); expression(); - setState(132); + setState(134); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(128); + setState(130); match(COMMA); - setState(129); + setState(131); expression(); } } - setState(134); + setState(136); _errHandler.sync(this); _la = _input.LA(1); } @@ -792,13 +794,13 @@ public final JoinTermContext joinTerm() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(135); - subquery(); setState(137); + subquery(); + setState(139); _la = _input.LA(1); if (_la==BY) { { - setState(136); + setState(138); ((JoinTermContext)_localctx).by = joinKeys(); } } @@ -855,21 +857,21 @@ public final SequenceTermContext sequenceTerm() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(139); + setState(141); subquery(); - setState(145); + setState(147); _la = _input.LA(1); if (_la==FORK) { { - setState(140); + setState(142); match(FORK); - setState(143); + setState(145); _la = _input.LA(1); if (_la==EQ) { { - setState(141); + setState(143); match(EQ); - setState(142); + setState(144); booleanValue(); } } @@ -877,11 +879,11 @@ public final SequenceTermContext sequenceTerm() throws RecognitionException { } } - setState(148); + setState(150); _la = _input.LA(1); if (_la==BY) { { - setState(147); + setState(149); ((SequenceTermContext)_localctx).by = joinKeys(); } } @@ -930,11 +932,11 @@ public final SubqueryContext subquery() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(150); + setState(152); match(LB); - setState(151); + setState(153); eventFilter(); - setState(152); + setState(154); match(RB); } } @@ -978,7 +980,7 @@ public final EventQueryContext eventQuery() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(154); + setState(156); eventFilter(); } } @@ -1028,27 +1030,27 @@ public final EventFilterContext eventFilter() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(158); + setState(160); switch (_input.LA(1)) { case ANY: { - setState(156); + setState(158); match(ANY); } break; case ESCAPED_IDENTIFIER: case IDENTIFIER: { - setState(157); + setState(159); ((EventFilterContext)_localctx).event = identifier(); } break; default: throw new NoViableAltException(this); } - setState(160); + setState(162); match(WHERE); - setState(161); + setState(163); expression(); } } @@ -1092,7 +1094,7 @@ public final ExpressionContext expression() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(163); + setState(165); booleanExpression(0); } } @@ -1222,7 +1224,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc int _alt; enterOuterAlt(_localctx, 1); { - setState(172); + setState(174); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { case 1: @@ -1231,9 +1233,9 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _ctx = _localctx; _prevctx = _localctx; - setState(166); + setState(168); match(NOT); - setState(167); + setState(169); booleanExpression(5); } break; @@ -1242,11 +1244,11 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new ProcessCheckContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(168); + setState(170); ((ProcessCheckContext)_localctx).relationship = match(IDENTIFIER); - setState(169); + setState(171); match(OF); - setState(170); + setState(172); subquery(); } break; @@ -1255,13 +1257,13 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new BooleanDefaultContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(171); - valueExpression(0); + setState(173); + valueExpression(); } break; } _ctx.stop = _input.LT(-1); - setState(182); + setState(184); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,20,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1269,7 +1271,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(180); + setState(182); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { case 1: @@ -1277,11 +1279,11 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(174); + setState(176); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(175); + setState(177); ((LogicalBinaryContext)_localctx).operator = match(AND); - setState(176); + setState(178); ((LogicalBinaryContext)_localctx).right = booleanExpression(3); } break; @@ -1290,18 +1292,18 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(177); + setState(179); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(178); + setState(180); ((LogicalBinaryContext)_localctx).operator = match(OR); - setState(179); + setState(181); ((LogicalBinaryContext)_localctx).right = booleanExpression(2); } break; } } } - setState(184); + setState(186); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,20,_ctx); } @@ -1330,11 +1332,8 @@ public void copyFrom(ValueExpressionContext ctx) { } } public static class ValueExpressionDefaultContext extends ValueExpressionContext { - public PrimaryExpressionContext primaryExpression() { - return getRuleContext(PrimaryExpressionContext.class,0); - } - public PredicateContext predicate() { - return getRuleContext(PredicateContext.class,0); + public OperatorExpressionContext operatorExpression() { + return getRuleContext(OperatorExpressionContext.class,0); } public ValueExpressionDefaultContext(ValueExpressionContext ctx) { copyFrom(ctx); } @Override @@ -1352,16 +1351,16 @@ public T accept(ParseTreeVisitor visitor) { } } public static class ComparisonContext extends ValueExpressionContext { - public ValueExpressionContext left; - public ValueExpressionContext right; + public OperatorExpressionContext left; + public OperatorExpressionContext right; public ComparisonOperatorContext comparisonOperator() { return getRuleContext(ComparisonOperatorContext.class,0); } - public List valueExpression() { - return getRuleContexts(ValueExpressionContext.class); + public List operatorExpression() { + return getRuleContexts(OperatorExpressionContext.class); } - public ValueExpressionContext valueExpression(int i) { - return getRuleContext(ValueExpressionContext.class,i); + public OperatorExpressionContext operatorExpression(int i) { + return getRuleContext(OperatorExpressionContext.class,i); } public ComparisonContext(ValueExpressionContext ctx) { copyFrom(ctx); } @Override @@ -1378,22 +1377,96 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } - public static class ArithmeticBinaryContext extends ValueExpressionContext { - public ValueExpressionContext left; + + public final ValueExpressionContext valueExpression() throws RecognitionException { + ValueExpressionContext _localctx = new ValueExpressionContext(_ctx, getState()); + enterRule(_localctx, 32, RULE_valueExpression); + try { + setState(192); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { + case 1: + _localctx = new ValueExpressionDefaultContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(187); + operatorExpression(0); + } + break; + case 2: + _localctx = new ComparisonContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(188); + ((ComparisonContext)_localctx).left = operatorExpression(0); + setState(189); + comparisonOperator(); + setState(190); + ((ComparisonContext)_localctx).right = operatorExpression(0); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class OperatorExpressionContext extends ParserRuleContext { + public OperatorExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_operatorExpression; } + + public OperatorExpressionContext() { } + public void copyFrom(OperatorExpressionContext ctx) { + super.copyFrom(ctx); + } + } + public static class OperatorExpressionDefaultContext extends OperatorExpressionContext { + public PrimaryExpressionContext primaryExpression() { + return getRuleContext(PrimaryExpressionContext.class,0); + } + public PredicateContext predicate() { + return getRuleContext(PredicateContext.class,0); + } + public OperatorExpressionDefaultContext(OperatorExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof EqlBaseListener ) ((EqlBaseListener)listener).enterOperatorExpressionDefault(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof EqlBaseListener ) ((EqlBaseListener)listener).exitOperatorExpressionDefault(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof EqlBaseVisitor ) return ((EqlBaseVisitor)visitor).visitOperatorExpressionDefault(this); + else return visitor.visitChildren(this); + } + } + public static class ArithmeticBinaryContext extends OperatorExpressionContext { + public OperatorExpressionContext left; public Token operator; - public ValueExpressionContext right; - public List valueExpression() { - return getRuleContexts(ValueExpressionContext.class); + public OperatorExpressionContext right; + public List operatorExpression() { + return getRuleContexts(OperatorExpressionContext.class); } - public ValueExpressionContext valueExpression(int i) { - return getRuleContext(ValueExpressionContext.class,i); + public OperatorExpressionContext operatorExpression(int i) { + return getRuleContext(OperatorExpressionContext.class,i); } public TerminalNode ASTERISK() { return getToken(EqlBaseParser.ASTERISK, 0); } public TerminalNode SLASH() { return getToken(EqlBaseParser.SLASH, 0); } public TerminalNode PERCENT() { return getToken(EqlBaseParser.PERCENT, 0); } public TerminalNode PLUS() { return getToken(EqlBaseParser.PLUS, 0); } public TerminalNode MINUS() { return getToken(EqlBaseParser.MINUS, 0); } - public ArithmeticBinaryContext(ValueExpressionContext ctx) { copyFrom(ctx); } + public ArithmeticBinaryContext(OperatorExpressionContext ctx) { copyFrom(ctx); } @Override public void enterRule(ParseTreeListener listener) { if ( listener instanceof EqlBaseListener ) ((EqlBaseListener)listener).enterArithmeticBinary(this); @@ -1408,14 +1481,14 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } - public static class ArithmeticUnaryContext extends ValueExpressionContext { + public static class ArithmeticUnaryContext extends OperatorExpressionContext { public Token operator; - public ValueExpressionContext valueExpression() { - return getRuleContext(ValueExpressionContext.class,0); + public OperatorExpressionContext operatorExpression() { + return getRuleContext(OperatorExpressionContext.class,0); } public TerminalNode MINUS() { return getToken(EqlBaseParser.MINUS, 0); } public TerminalNode PLUS() { return getToken(EqlBaseParser.PLUS, 0); } - public ArithmeticUnaryContext(ValueExpressionContext ctx) { copyFrom(ctx); } + public ArithmeticUnaryContext(OperatorExpressionContext ctx) { copyFrom(ctx); } @Override public void enterRule(ParseTreeListener listener) { if ( listener instanceof EqlBaseListener ) ((EqlBaseListener)listener).enterArithmeticUnary(this); @@ -1431,23 +1504,23 @@ public T accept(ParseTreeVisitor visitor) { } } - public final ValueExpressionContext valueExpression() throws RecognitionException { - return valueExpression(0); + public final OperatorExpressionContext operatorExpression() throws RecognitionException { + return operatorExpression(0); } - private ValueExpressionContext valueExpression(int _p) throws RecognitionException { + private OperatorExpressionContext operatorExpression(int _p) throws RecognitionException { ParserRuleContext _parentctx = _ctx; int _parentState = getState(); - ValueExpressionContext _localctx = new ValueExpressionContext(_ctx, _parentState); - ValueExpressionContext _prevctx = _localctx; - int _startState = 32; - enterRecursionRule(_localctx, 32, RULE_valueExpression, _p); + OperatorExpressionContext _localctx = new OperatorExpressionContext(_ctx, _parentState); + OperatorExpressionContext _prevctx = _localctx; + int _startState = 34; + enterRecursionRule(_localctx, 34, RULE_operatorExpression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(192); + setState(201); switch (_input.LA(1)) { case FALSE: case NULL: @@ -1459,18 +1532,18 @@ private ValueExpressionContext valueExpression(int _p) throws RecognitionExcepti case DECIMAL_VALUE: case IDENTIFIER: { - _localctx = new ValueExpressionDefaultContext(_localctx); + _localctx = new OperatorExpressionDefaultContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(186); + setState(195); primaryExpression(); - setState(188); + setState(197); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { case 1: { - setState(187); + setState(196); predicate(); } break; @@ -1483,7 +1556,7 @@ private ValueExpressionContext valueExpression(int _p) throws RecognitionExcepti _localctx = new ArithmeticUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(190); + setState(199); ((ArithmeticUnaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -1491,33 +1564,33 @@ private ValueExpressionContext valueExpression(int _p) throws RecognitionExcepti } else { consume(); } - setState(191); - valueExpression(4); + setState(200); + operatorExpression(3); } break; default: throw new NoViableAltException(this); } _ctx.stop = _input.LT(-1); - setState(206); + setState(211); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,24,_ctx); + _alt = getInterpreter().adaptivePredict(_input,25,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(204); + setState(209); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { case 1: { - _localctx = new ArithmeticBinaryContext(new ValueExpressionContext(_parentctx, _parentState)); + _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; - pushNewRecursionContext(_localctx, _startState, RULE_valueExpression); - setState(194); - if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(195); + pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); + setState(203); + if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); + setState(204); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ASTERISK) | (1L << SLASH) | (1L << PERCENT))) != 0)) ) { @@ -1525,18 +1598,18 @@ private ValueExpressionContext valueExpression(int _p) throws RecognitionExcepti } else { consume(); } - setState(196); - ((ArithmeticBinaryContext)_localctx).right = valueExpression(4); + setState(205); + ((ArithmeticBinaryContext)_localctx).right = operatorExpression(3); } break; case 2: { - _localctx = new ArithmeticBinaryContext(new ValueExpressionContext(_parentctx, _parentState)); + _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; - pushNewRecursionContext(_localctx, _startState, RULE_valueExpression); - setState(197); - if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(198); + pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); + setState(206); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); + setState(207); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -1544,29 +1617,16 @@ private ValueExpressionContext valueExpression(int _p) throws RecognitionExcepti } else { consume(); } - setState(199); - ((ArithmeticBinaryContext)_localctx).right = valueExpression(3); - } - break; - case 3: - { - _localctx = new ComparisonContext(new ValueExpressionContext(_parentctx, _parentState)); - ((ComparisonContext)_localctx).left = _prevctx; - pushNewRecursionContext(_localctx, _startState, RULE_valueExpression); - setState(200); - if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(201); - comparisonOperator(); - setState(202); - ((ComparisonContext)_localctx).right = valueExpression(2); + setState(208); + ((ArithmeticBinaryContext)_localctx).right = operatorExpression(2); } break; } } } - setState(208); + setState(213); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,24,_ctx); + _alt = getInterpreter().adaptivePredict(_input,25,_ctx); } } } @@ -1618,43 +1678,43 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateContext predicate() throws RecognitionException { PredicateContext _localctx = new PredicateContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_predicate); + enterRule(_localctx, 36, RULE_predicate); int _la; try { enterOuterAlt(_localctx, 1); { - setState(210); + setState(215); _la = _input.LA(1); if (_la==NOT) { { - setState(209); + setState(214); match(NOT); } } - setState(212); + setState(217); ((PredicateContext)_localctx).kind = match(IN); - setState(213); + setState(218); match(LP); - setState(214); - expression(); setState(219); + expression(); + setState(224); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(215); + setState(220); match(COMMA); - setState(216); + setState(221); expression(); } } - setState(221); + setState(226); _errHandler.sync(this); _la = _input.LA(1); } - setState(222); + setState(227); match(RP); } } @@ -1761,16 +1821,16 @@ public T accept(ParseTreeVisitor visitor) { public final PrimaryExpressionContext primaryExpression() throws RecognitionException { PrimaryExpressionContext _localctx = new PrimaryExpressionContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_primaryExpression); + enterRule(_localctx, 38, RULE_primaryExpression); try { - setState(231); + setState(236); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { case 1: _localctx = new ConstantDefaultContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(224); + setState(229); constant(); } break; @@ -1778,7 +1838,7 @@ public final PrimaryExpressionContext primaryExpression() throws RecognitionExce _localctx = new FunctionContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(225); + setState(230); functionExpression(); } break; @@ -1786,7 +1846,7 @@ public final PrimaryExpressionContext primaryExpression() throws RecognitionExce _localctx = new DereferenceContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(226); + setState(231); qualifiedName(); } break; @@ -1794,11 +1854,11 @@ public final PrimaryExpressionContext primaryExpression() throws RecognitionExce _localctx = new ParenthesizedExpressionContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(227); + setState(232); match(LP); - setState(228); + setState(233); expression(); - setState(229); + setState(234); match(RP); } break; @@ -1851,41 +1911,41 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionExpressionContext functionExpression() throws RecognitionException { FunctionExpressionContext _localctx = new FunctionExpressionContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_functionExpression); + enterRule(_localctx, 40, RULE_functionExpression); int _la; try { enterOuterAlt(_localctx, 1); { - setState(233); + setState(238); ((FunctionExpressionContext)_localctx).name = match(IDENTIFIER); - setState(234); + setState(239); match(LP); - setState(243); + setState(248); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FALSE) | (1L << NOT) | (1L << NULL) | (1L << TRUE) | (1L << PLUS) | (1L << MINUS) | (1L << LP) | (1L << ESCAPED_IDENTIFIER) | (1L << STRING) | (1L << INTEGER_VALUE) | (1L << DECIMAL_VALUE) | (1L << IDENTIFIER))) != 0)) { { - setState(235); - expression(); setState(240); + expression(); + setState(245); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(236); + setState(241); match(COMMA); - setState(237); + setState(242); expression(); } } - setState(242); + setState(247); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(245); + setState(250); match(RP); } } @@ -1988,15 +2048,15 @@ public T accept(ParseTreeVisitor visitor) { public final ConstantContext constant() throws RecognitionException { ConstantContext _localctx = new ConstantContext(_ctx, getState()); - enterRule(_localctx, 40, RULE_constant); + enterRule(_localctx, 42, RULE_constant); try { - setState(251); + setState(256); switch (_input.LA(1)) { case NULL: _localctx = new NullLiteralContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(247); + setState(252); match(NULL); } break; @@ -2005,7 +2065,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new NumericLiteralContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(248); + setState(253); number(); } break; @@ -2014,7 +2074,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanLiteralContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(249); + setState(254); booleanValue(); } break; @@ -2022,7 +2082,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringLiteralContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(250); + setState(255); string(); } break; @@ -2069,12 +2129,12 @@ public T accept(ParseTreeVisitor visitor) { public final ComparisonOperatorContext comparisonOperator() throws RecognitionException { ComparisonOperatorContext _localctx = new ComparisonOperatorContext(_ctx, getState()); - enterRule(_localctx, 42, RULE_comparisonOperator); + enterRule(_localctx, 44, RULE_comparisonOperator); int _la; try { enterOuterAlt(_localctx, 1); { - setState(253); + setState(258); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << EQ) | (1L << NEQ) | (1L << LT) | (1L << LTE) | (1L << GT) | (1L << GTE))) != 0)) ) { _errHandler.recoverInline(this); @@ -2118,12 +2178,12 @@ public T accept(ParseTreeVisitor visitor) { public final BooleanValueContext booleanValue() throws RecognitionException { BooleanValueContext _localctx = new BooleanValueContext(_ctx, getState()); - enterRule(_localctx, 44, RULE_booleanValue); + enterRule(_localctx, 46, RULE_booleanValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(255); + setState(260); _la = _input.LA(1); if ( !(_la==FALSE || _la==TRUE) ) { _errHandler.recoverInline(this); @@ -2187,49 +2247,49 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedNameContext qualifiedName() throws RecognitionException { QualifiedNameContext _localctx = new QualifiedNameContext(_ctx, getState()); - enterRule(_localctx, 46, RULE_qualifiedName); + enterRule(_localctx, 48, RULE_qualifiedName); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(257); + setState(262); identifier(); - setState(269); + setState(274); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,33,_ctx); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { - setState(267); + setState(272); switch (_input.LA(1)) { case DOT: { - setState(258); + setState(263); match(DOT); - setState(259); + setState(264); identifier(); } break; case LB: { - setState(260); + setState(265); match(LB); - setState(262); + setState(267); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(261); + setState(266); match(INTEGER_VALUE); } } - setState(264); + setState(269); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==INTEGER_VALUE ); - setState(266); + setState(271); match(RB); } break; @@ -2238,9 +2298,9 @@ public final QualifiedNameContext qualifiedName() throws RecognitionException { } } } - setState(271); + setState(276); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,33,_ctx); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); } } } @@ -2279,12 +2339,12 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierContext identifier() throws RecognitionException { IdentifierContext _localctx = new IdentifierContext(_ctx, getState()); - enterRule(_localctx, 48, RULE_identifier); + enterRule(_localctx, 50, RULE_identifier); int _la; try { enterOuterAlt(_localctx, 1); { - setState(272); + setState(277); _la = _input.LA(1); if ( !(_la==ESCAPED_IDENTIFIER || _la==IDENTIFIER) ) { _errHandler.recoverInline(this); @@ -2331,18 +2391,18 @@ public T accept(ParseTreeVisitor visitor) { public final TimeUnitContext timeUnit() throws RecognitionException { TimeUnitContext _localctx = new TimeUnitContext(_ctx, getState()); - enterRule(_localctx, 50, RULE_timeUnit); + enterRule(_localctx, 52, RULE_timeUnit); int _la; try { enterOuterAlt(_localctx, 1); { - setState(274); + setState(279); number(); - setState(276); + setState(281); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(275); + setState(280); ((TimeUnitContext)_localctx).unit = match(IDENTIFIER); } } @@ -2408,15 +2468,15 @@ public T accept(ParseTreeVisitor visitor) { public final NumberContext number() throws RecognitionException { NumberContext _localctx = new NumberContext(_ctx, getState()); - enterRule(_localctx, 52, RULE_number); + enterRule(_localctx, 54, RULE_number); try { - setState(280); + setState(285); switch (_input.LA(1)) { case DECIMAL_VALUE: _localctx = new DecimalLiteralContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(278); + setState(283); match(DECIMAL_VALUE); } break; @@ -2424,7 +2484,7 @@ public final NumberContext number() throws RecognitionException { _localctx = new IntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(279); + setState(284); match(INTEGER_VALUE); } break; @@ -2466,11 +2526,11 @@ public T accept(ParseTreeVisitor visitor) { public final StringContext string() throws RecognitionException { StringContext _localctx = new StringContext(_ctx, getState()); - enterRule(_localctx, 54, RULE_string); + enterRule(_localctx, 56, RULE_string); try { enterOuterAlt(_localctx, 1); { - setState(282); + setState(287); match(STRING); } } @@ -2489,8 +2549,8 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { case 15: return booleanExpression_sempred((BooleanExpressionContext)_localctx, predIndex); - case 16: - return valueExpression_sempred((ValueExpressionContext)_localctx, predIndex); + case 17: + return operatorExpression_sempred((OperatorExpressionContext)_localctx, predIndex); } return true; } @@ -2503,117 +2563,117 @@ private boolean booleanExpression_sempred(BooleanExpressionContext _localctx, in } return true; } - private boolean valueExpression_sempred(ValueExpressionContext _localctx, int predIndex) { + private boolean operatorExpression_sempred(OperatorExpressionContext _localctx, int predIndex) { switch (predIndex) { case 2: - return precpred(_ctx, 3); - case 3: return precpred(_ctx, 2); - case 4: + case 3: return precpred(_ctx, 1); } return true; } public static final String _serializedATN = - "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3-\u011f\4\2\t\2\4"+ + "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3-\u0124\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"+ - "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\3\2\3\2\3\2\3\3\3\3\3\3\3\4\3"+ - "\4\7\4C\n\4\f\4\16\4F\13\4\3\5\3\5\3\5\5\5K\n\5\3\6\3\6\3\6\3\6\3\6\3"+ - "\7\3\7\3\7\5\7U\n\7\3\7\3\7\5\7Y\n\7\5\7[\n\7\3\7\3\7\6\7_\n\7\r\7\16"+ - "\7`\3\7\3\7\5\7e\n\7\3\b\3\b\5\bi\n\b\3\b\3\b\6\bm\n\b\r\b\16\bn\3\b\3"+ - "\b\5\bs\n\b\3\t\3\t\3\t\3\t\3\t\7\tz\n\t\f\t\16\t}\13\t\5\t\177\n\t\3"+ - "\n\3\n\3\n\3\n\7\n\u0085\n\n\f\n\16\n\u0088\13\n\3\13\3\13\5\13\u008c"+ - "\n\13\3\f\3\f\3\f\3\f\5\f\u0092\n\f\5\f\u0094\n\f\3\f\5\f\u0097\n\f\3"+ - "\r\3\r\3\r\3\r\3\16\3\16\3\17\3\17\5\17\u00a1\n\17\3\17\3\17\3\17\3\20"+ - "\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\5\21\u00af\n\21\3\21\3\21\3\21"+ - "\3\21\3\21\3\21\7\21\u00b7\n\21\f\21\16\21\u00ba\13\21\3\22\3\22\3\22"+ - "\5\22\u00bf\n\22\3\22\3\22\5\22\u00c3\n\22\3\22\3\22\3\22\3\22\3\22\3"+ - "\22\3\22\3\22\3\22\3\22\7\22\u00cf\n\22\f\22\16\22\u00d2\13\22\3\23\5"+ - "\23\u00d5\n\23\3\23\3\23\3\23\3\23\3\23\7\23\u00dc\n\23\f\23\16\23\u00df"+ - "\13\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\5\24\u00ea\n\24\3"+ - "\25\3\25\3\25\3\25\3\25\7\25\u00f1\n\25\f\25\16\25\u00f4\13\25\5\25\u00f6"+ - "\n\25\3\25\3\25\3\26\3\26\3\26\3\26\5\26\u00fe\n\26\3\27\3\27\3\30\3\30"+ - "\3\31\3\31\3\31\3\31\3\31\6\31\u0109\n\31\r\31\16\31\u010a\3\31\7\31\u010e"+ - "\n\31\f\31\16\31\u0111\13\31\3\32\3\32\3\33\3\33\5\33\u0117\n\33\3\34"+ - "\3\34\5\34\u011b\n\34\3\35\3\35\3\35\2\4 \"\36\2\4\6\b\n\f\16\20\22\24"+ - "\26\30\32\34\36 \"$&(*,.\60\62\64\668\2\7\3\2\32\33\3\2\34\36\3\2\24\31"+ - "\4\2\6\6\20\20\4\2&&**\u012e\2:\3\2\2\2\4=\3\2\2\2\6@\3\2\2\2\bJ\3\2\2"+ - "\2\nL\3\2\2\2\fQ\3\2\2\2\16f\3\2\2\2\20t\3\2\2\2\22\u0080\3\2\2\2\24\u0089"+ - "\3\2\2\2\26\u008d\3\2\2\2\30\u0098\3\2\2\2\32\u009c\3\2\2\2\34\u00a0\3"+ - "\2\2\2\36\u00a5\3\2\2\2 \u00ae\3\2\2\2\"\u00c2\3\2\2\2$\u00d4\3\2\2\2"+ - "&\u00e9\3\2\2\2(\u00eb\3\2\2\2*\u00fd\3\2\2\2,\u00ff\3\2\2\2.\u0101\3"+ - "\2\2\2\60\u0103\3\2\2\2\62\u0112\3\2\2\2\64\u0114\3\2\2\2\66\u011a\3\2"+ - "\2\28\u011c\3\2\2\2:;\5\6\4\2;<\7\2\2\3<\3\3\2\2\2=>\5\36\20\2>?\7\2\2"+ - "\3?\5\3\2\2\2@D\5\b\5\2AC\5\20\t\2BA\3\2\2\2CF\3\2\2\2DB\3\2\2\2DE\3\2"+ - "\2\2E\7\3\2\2\2FD\3\2\2\2GK\5\f\7\2HK\5\16\b\2IK\5\32\16\2JG\3\2\2\2J"+ - "H\3\2\2\2JI\3\2\2\2K\t\3\2\2\2LM\7\23\2\2MN\7\n\2\2NO\7\24\2\2OP\5\64"+ - "\33\2P\13\3\2\2\2QZ\7\17\2\2RT\5\22\n\2SU\5\n\6\2TS\3\2\2\2TU\3\2\2\2"+ - "U[\3\2\2\2VX\5\n\6\2WY\5\22\n\2XW\3\2\2\2XY\3\2\2\2Y[\3\2\2\2ZR\3\2\2"+ - "\2ZV\3\2\2\2Z[\3\2\2\2[\\\3\2\2\2\\^\5\26\f\2]_\5\26\f\2^]\3\2\2\2_`\3"+ - "\2\2\2`^\3\2\2\2`a\3\2\2\2ad\3\2\2\2bc\7\21\2\2ce\5\26\f\2db\3\2\2\2d"+ - "e\3\2\2\2e\r\3\2\2\2fh\7\t\2\2gi\5\22\n\2hg\3\2\2\2hi\3\2\2\2ij\3\2\2"+ - "\2jl\5\24\13\2km\5\24\13\2lk\3\2\2\2mn\3\2\2\2nl\3\2\2\2no\3\2\2\2or\3"+ - "\2\2\2pq\7\21\2\2qs\5\24\13\2rp\3\2\2\2rs\3\2\2\2s\17\3\2\2\2tu\7%\2\2"+ - "u~\7*\2\2v{\5 \21\2wx\7 \2\2xz\5 \21\2yw\3\2\2\2z}\3\2\2\2{y\3\2\2\2{"+ - "|\3\2\2\2|\177\3\2\2\2}{\3\2\2\2~v\3\2\2\2~\177\3\2\2\2\177\21\3\2\2\2"+ - "\u0080\u0081\7\5\2\2\u0081\u0086\5\36\20\2\u0082\u0083\7 \2\2\u0083\u0085"+ - "\5\36\20\2\u0084\u0082\3\2\2\2\u0085\u0088\3\2\2\2\u0086\u0084\3\2\2\2"+ - "\u0086\u0087\3\2\2\2\u0087\23\3\2\2\2\u0088\u0086\3\2\2\2\u0089\u008b"+ - "\5\30\r\2\u008a\u008c\5\22\n\2\u008b\u008a\3\2\2\2\u008b\u008c\3\2\2\2"+ - "\u008c\25\3\2\2\2\u008d\u0093\5\30\r\2\u008e\u0091\7\7\2\2\u008f\u0090"+ - "\7\24\2\2\u0090\u0092\5.\30\2\u0091\u008f\3\2\2\2\u0091\u0092\3\2\2\2"+ - "\u0092\u0094\3\2\2\2\u0093\u008e\3\2\2\2\u0093\u0094\3\2\2\2\u0094\u0096"+ - "\3\2\2\2\u0095\u0097\5\22\n\2\u0096\u0095\3\2\2\2\u0096\u0097\3\2\2\2"+ - "\u0097\27\3\2\2\2\u0098\u0099\7!\2\2\u0099\u009a\5\34\17\2\u009a\u009b"+ - "\7\"\2\2\u009b\31\3\2\2\2\u009c\u009d\5\34\17\2\u009d\33\3\2\2\2\u009e"+ - "\u00a1\7\4\2\2\u009f\u00a1\5\62\32\2\u00a0\u009e\3\2\2\2\u00a0\u009f\3"+ - "\2\2\2\u00a1\u00a2\3\2\2\2\u00a2\u00a3\7\22\2\2\u00a3\u00a4\5\36\20\2"+ - "\u00a4\35\3\2\2\2\u00a5\u00a6\5 \21\2\u00a6\37\3\2\2\2\u00a7\u00a8\b\21"+ - "\1\2\u00a8\u00a9\7\13\2\2\u00a9\u00af\5 \21\7\u00aa\u00ab\7*\2\2\u00ab"+ - "\u00ac\7\r\2\2\u00ac\u00af\5\30\r\2\u00ad\u00af\5\"\22\2\u00ae\u00a7\3"+ - "\2\2\2\u00ae\u00aa\3\2\2\2\u00ae\u00ad\3\2\2\2\u00af\u00b8\3\2\2\2\u00b0"+ - "\u00b1\f\4\2\2\u00b1\u00b2\7\3\2\2\u00b2\u00b7\5 \21\5\u00b3\u00b4\f\3"+ - "\2\2\u00b4\u00b5\7\16\2\2\u00b5\u00b7\5 \21\4\u00b6\u00b0\3\2\2\2\u00b6"+ - "\u00b3\3\2\2\2\u00b7\u00ba\3\2\2\2\u00b8\u00b6\3\2\2\2\u00b8\u00b9\3\2"+ - "\2\2\u00b9!\3\2\2\2\u00ba\u00b8\3\2\2\2\u00bb\u00bc\b\22\1\2\u00bc\u00be"+ - "\5&\24\2\u00bd\u00bf\5$\23\2\u00be\u00bd\3\2\2\2\u00be\u00bf\3\2\2\2\u00bf"+ - "\u00c3\3\2\2\2\u00c0\u00c1\t\2\2\2\u00c1\u00c3\5\"\22\6\u00c2\u00bb\3"+ - "\2\2\2\u00c2\u00c0\3\2\2\2\u00c3\u00d0\3\2\2\2\u00c4\u00c5\f\5\2\2\u00c5"+ - "\u00c6\t\3\2\2\u00c6\u00cf\5\"\22\6\u00c7\u00c8\f\4\2\2\u00c8\u00c9\t"+ - "\2\2\2\u00c9\u00cf\5\"\22\5\u00ca\u00cb\f\3\2\2\u00cb\u00cc\5,\27\2\u00cc"+ - "\u00cd\5\"\22\4\u00cd\u00cf\3\2\2\2\u00ce\u00c4\3\2\2\2\u00ce\u00c7\3"+ - "\2\2\2\u00ce\u00ca\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\13\2\2"+ - "\u00d4\u00d3\3\2\2\2\u00d4\u00d5\3\2\2\2\u00d5\u00d6\3\2\2\2\u00d6\u00d7"+ - "\7\b\2\2\u00d7\u00d8\7#\2\2\u00d8\u00dd\5\36\20\2\u00d9\u00da\7 \2\2\u00da"+ - "\u00dc\5\36\20\2\u00db\u00d9\3\2\2\2\u00dc\u00df\3\2\2\2\u00dd\u00db\3"+ - "\2\2\2\u00dd\u00de\3\2\2\2\u00de\u00e0\3\2\2\2\u00df\u00dd\3\2\2\2\u00e0"+ - "\u00e1\7$\2\2\u00e1%\3\2\2\2\u00e2\u00ea\5*\26\2\u00e3\u00ea\5(\25\2\u00e4"+ - "\u00ea\5\60\31\2\u00e5\u00e6\7#\2\2\u00e6\u00e7\5\36\20\2\u00e7\u00e8"+ - "\7$\2\2\u00e8\u00ea\3\2\2\2\u00e9\u00e2\3\2\2\2\u00e9\u00e3\3\2\2\2\u00e9"+ - "\u00e4\3\2\2\2\u00e9\u00e5\3\2\2\2\u00ea\'\3\2\2\2\u00eb\u00ec\7*\2\2"+ - "\u00ec\u00f5\7#\2\2\u00ed\u00f2\5\36\20\2\u00ee\u00ef\7 \2\2\u00ef\u00f1"+ - "\5\36\20\2\u00f0\u00ee\3\2\2\2\u00f1\u00f4\3\2\2\2\u00f2\u00f0\3\2\2\2"+ - "\u00f2\u00f3\3\2\2\2\u00f3\u00f6\3\2\2\2\u00f4\u00f2\3\2\2\2\u00f5\u00ed"+ - "\3\2\2\2\u00f5\u00f6\3\2\2\2\u00f6\u00f7\3\2\2\2\u00f7\u00f8\7$\2\2\u00f8"+ - ")\3\2\2\2\u00f9\u00fe\7\f\2\2\u00fa\u00fe\5\66\34\2\u00fb\u00fe\5.\30"+ - "\2\u00fc\u00fe\58\35\2\u00fd\u00f9\3\2\2\2\u00fd\u00fa\3\2\2\2\u00fd\u00fb"+ - "\3\2\2\2\u00fd\u00fc\3\2\2\2\u00fe+\3\2\2\2\u00ff\u0100\t\4\2\2\u0100"+ - "-\3\2\2\2\u0101\u0102\t\5\2\2\u0102/\3\2\2\2\u0103\u010f\5\62\32\2\u0104"+ - "\u0105\7\37\2\2\u0105\u010e\5\62\32\2\u0106\u0108\7!\2\2\u0107\u0109\7"+ - "(\2\2\u0108\u0107\3\2\2\2\u0109\u010a\3\2\2\2\u010a\u0108\3\2\2\2\u010a"+ - "\u010b\3\2\2\2\u010b\u010c\3\2\2\2\u010c\u010e\7\"\2\2\u010d\u0104\3\2"+ - "\2\2\u010d\u0106\3\2\2\2\u010e\u0111\3\2\2\2\u010f\u010d\3\2\2\2\u010f"+ - "\u0110\3\2\2\2\u0110\61\3\2\2\2\u0111\u010f\3\2\2\2\u0112\u0113\t\6\2"+ - "\2\u0113\63\3\2\2\2\u0114\u0116\5\66\34\2\u0115\u0117\7*\2\2\u0116\u0115"+ - "\3\2\2\2\u0116\u0117\3\2\2\2\u0117\65\3\2\2\2\u0118\u011b\7)\2\2\u0119"+ - "\u011b\7(\2\2\u011a\u0118\3\2\2\2\u011a\u0119\3\2\2\2\u011b\67\3\2\2\2"+ - "\u011c\u011d\7\'\2\2\u011d9\3\2\2\2&DJTXZ`dhnr{~\u0086\u008b\u0091\u0093"+ - "\u0096\u00a0\u00ae\u00b6\u00b8\u00be\u00c2\u00ce\u00d0\u00d4\u00dd\u00e9"+ - "\u00f2\u00f5\u00fd\u010a\u010d\u010f\u0116\u011a"; + "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\3\2\3\2\3\2\3\3\3\3"+ + "\3\3\3\4\3\4\7\4E\n\4\f\4\16\4H\13\4\3\5\3\5\3\5\5\5M\n\5\3\6\3\6\3\6"+ + "\3\6\3\6\3\7\3\7\3\7\5\7W\n\7\3\7\3\7\5\7[\n\7\5\7]\n\7\3\7\3\7\6\7a\n"+ + "\7\r\7\16\7b\3\7\3\7\5\7g\n\7\3\b\3\b\5\bk\n\b\3\b\3\b\6\bo\n\b\r\b\16"+ + "\bp\3\b\3\b\5\bu\n\b\3\t\3\t\3\t\3\t\3\t\7\t|\n\t\f\t\16\t\177\13\t\5"+ + "\t\u0081\n\t\3\n\3\n\3\n\3\n\7\n\u0087\n\n\f\n\16\n\u008a\13\n\3\13\3"+ + "\13\5\13\u008e\n\13\3\f\3\f\3\f\3\f\5\f\u0094\n\f\5\f\u0096\n\f\3\f\5"+ + "\f\u0099\n\f\3\r\3\r\3\r\3\r\3\16\3\16\3\17\3\17\5\17\u00a3\n\17\3\17"+ + "\3\17\3\17\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\5\21\u00b1\n\21"+ + "\3\21\3\21\3\21\3\21\3\21\3\21\7\21\u00b9\n\21\f\21\16\21\u00bc\13\21"+ + "\3\22\3\22\3\22\3\22\3\22\5\22\u00c3\n\22\3\23\3\23\3\23\5\23\u00c8\n"+ + "\23\3\23\3\23\5\23\u00cc\n\23\3\23\3\23\3\23\3\23\3\23\3\23\7\23\u00d4"+ + "\n\23\f\23\16\23\u00d7\13\23\3\24\5\24\u00da\n\24\3\24\3\24\3\24\3\24"+ + "\3\24\7\24\u00e1\n\24\f\24\16\24\u00e4\13\24\3\24\3\24\3\25\3\25\3\25"+ + "\3\25\3\25\3\25\3\25\5\25\u00ef\n\25\3\26\3\26\3\26\3\26\3\26\7\26\u00f6"+ + "\n\26\f\26\16\26\u00f9\13\26\5\26\u00fb\n\26\3\26\3\26\3\27\3\27\3\27"+ + "\3\27\5\27\u0103\n\27\3\30\3\30\3\31\3\31\3\32\3\32\3\32\3\32\3\32\6\32"+ + "\u010e\n\32\r\32\16\32\u010f\3\32\7\32\u0113\n\32\f\32\16\32\u0116\13"+ + "\32\3\33\3\33\3\34\3\34\5\34\u011c\n\34\3\35\3\35\5\35\u0120\n\35\3\36"+ + "\3\36\3\36\2\4 $\37\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60"+ + "\62\64\668:\2\7\3\2\32\33\3\2\34\36\3\2\24\31\4\2\6\6\20\20\4\2&&**\u0132"+ + "\2<\3\2\2\2\4?\3\2\2\2\6B\3\2\2\2\bL\3\2\2\2\nN\3\2\2\2\fS\3\2\2\2\16"+ + "h\3\2\2\2\20v\3\2\2\2\22\u0082\3\2\2\2\24\u008b\3\2\2\2\26\u008f\3\2\2"+ + "\2\30\u009a\3\2\2\2\32\u009e\3\2\2\2\34\u00a2\3\2\2\2\36\u00a7\3\2\2\2"+ + " \u00b0\3\2\2\2\"\u00c2\3\2\2\2$\u00cb\3\2\2\2&\u00d9\3\2\2\2(\u00ee\3"+ + "\2\2\2*\u00f0\3\2\2\2,\u0102\3\2\2\2.\u0104\3\2\2\2\60\u0106\3\2\2\2\62"+ + "\u0108\3\2\2\2\64\u0117\3\2\2\2\66\u0119\3\2\2\28\u011f\3\2\2\2:\u0121"+ + "\3\2\2\2<=\5\6\4\2=>\7\2\2\3>\3\3\2\2\2?@\5\36\20\2@A\7\2\2\3A\5\3\2\2"+ + "\2BF\5\b\5\2CE\5\20\t\2DC\3\2\2\2EH\3\2\2\2FD\3\2\2\2FG\3\2\2\2G\7\3\2"+ + "\2\2HF\3\2\2\2IM\5\f\7\2JM\5\16\b\2KM\5\32\16\2LI\3\2\2\2LJ\3\2\2\2LK"+ + "\3\2\2\2M\t\3\2\2\2NO\7\23\2\2OP\7\n\2\2PQ\7\24\2\2QR\5\66\34\2R\13\3"+ + "\2\2\2S\\\7\17\2\2TV\5\22\n\2UW\5\n\6\2VU\3\2\2\2VW\3\2\2\2W]\3\2\2\2"+ + "XZ\5\n\6\2Y[\5\22\n\2ZY\3\2\2\2Z[\3\2\2\2[]\3\2\2\2\\T\3\2\2\2\\X\3\2"+ + "\2\2\\]\3\2\2\2]^\3\2\2\2^`\5\26\f\2_a\5\26\f\2`_\3\2\2\2ab\3\2\2\2b`"+ + "\3\2\2\2bc\3\2\2\2cf\3\2\2\2de\7\21\2\2eg\5\26\f\2fd\3\2\2\2fg\3\2\2\2"+ + "g\r\3\2\2\2hj\7\t\2\2ik\5\22\n\2ji\3\2\2\2jk\3\2\2\2kl\3\2\2\2ln\5\24"+ + "\13\2mo\5\24\13\2nm\3\2\2\2op\3\2\2\2pn\3\2\2\2pq\3\2\2\2qt\3\2\2\2rs"+ + "\7\21\2\2su\5\24\13\2tr\3\2\2\2tu\3\2\2\2u\17\3\2\2\2vw\7%\2\2w\u0080"+ + "\7*\2\2x}\5 \21\2yz\7 \2\2z|\5 \21\2{y\3\2\2\2|\177\3\2\2\2}{\3\2\2\2"+ + "}~\3\2\2\2~\u0081\3\2\2\2\177}\3\2\2\2\u0080x\3\2\2\2\u0080\u0081\3\2"+ + "\2\2\u0081\21\3\2\2\2\u0082\u0083\7\5\2\2\u0083\u0088\5\36\20\2\u0084"+ + "\u0085\7 \2\2\u0085\u0087\5\36\20\2\u0086\u0084\3\2\2\2\u0087\u008a\3"+ + "\2\2\2\u0088\u0086\3\2\2\2\u0088\u0089\3\2\2\2\u0089\23\3\2\2\2\u008a"+ + "\u0088\3\2\2\2\u008b\u008d\5\30\r\2\u008c\u008e\5\22\n\2\u008d\u008c\3"+ + "\2\2\2\u008d\u008e\3\2\2\2\u008e\25\3\2\2\2\u008f\u0095\5\30\r\2\u0090"+ + "\u0093\7\7\2\2\u0091\u0092\7\24\2\2\u0092\u0094\5\60\31\2\u0093\u0091"+ + "\3\2\2\2\u0093\u0094\3\2\2\2\u0094\u0096\3\2\2\2\u0095\u0090\3\2\2\2\u0095"+ + "\u0096\3\2\2\2\u0096\u0098\3\2\2\2\u0097\u0099\5\22\n\2\u0098\u0097\3"+ + "\2\2\2\u0098\u0099\3\2\2\2\u0099\27\3\2\2\2\u009a\u009b\7!\2\2\u009b\u009c"+ + "\5\34\17\2\u009c\u009d\7\"\2\2\u009d\31\3\2\2\2\u009e\u009f\5\34\17\2"+ + "\u009f\33\3\2\2\2\u00a0\u00a3\7\4\2\2\u00a1\u00a3\5\64\33\2\u00a2\u00a0"+ + "\3\2\2\2\u00a2\u00a1\3\2\2\2\u00a3\u00a4\3\2\2\2\u00a4\u00a5\7\22\2\2"+ + "\u00a5\u00a6\5\36\20\2\u00a6\35\3\2\2\2\u00a7\u00a8\5 \21\2\u00a8\37\3"+ + "\2\2\2\u00a9\u00aa\b\21\1\2\u00aa\u00ab\7\13\2\2\u00ab\u00b1\5 \21\7\u00ac"+ + "\u00ad\7*\2\2\u00ad\u00ae\7\r\2\2\u00ae\u00b1\5\30\r\2\u00af\u00b1\5\""+ + "\22\2\u00b0\u00a9\3\2\2\2\u00b0\u00ac\3\2\2\2\u00b0\u00af\3\2\2\2\u00b1"+ + "\u00ba\3\2\2\2\u00b2\u00b3\f\4\2\2\u00b3\u00b4\7\3\2\2\u00b4\u00b9\5 "+ + "\21\5\u00b5\u00b6\f\3\2\2\u00b6\u00b7\7\16\2\2\u00b7\u00b9\5 \21\4\u00b8"+ + "\u00b2\3\2\2\2\u00b8\u00b5\3\2\2\2\u00b9\u00bc\3\2\2\2\u00ba\u00b8\3\2"+ + "\2\2\u00ba\u00bb\3\2\2\2\u00bb!\3\2\2\2\u00bc\u00ba\3\2\2\2\u00bd\u00c3"+ + "\5$\23\2\u00be\u00bf\5$\23\2\u00bf\u00c0\5.\30\2\u00c0\u00c1\5$\23\2\u00c1"+ + "\u00c3\3\2\2\2\u00c2\u00bd\3\2\2\2\u00c2\u00be\3\2\2\2\u00c3#\3\2\2\2"+ + "\u00c4\u00c5\b\23\1\2\u00c5\u00c7\5(\25\2\u00c6\u00c8\5&\24\2\u00c7\u00c6"+ + "\3\2\2\2\u00c7\u00c8\3\2\2\2\u00c8\u00cc\3\2\2\2\u00c9\u00ca\t\2\2\2\u00ca"+ + "\u00cc\5$\23\5\u00cb\u00c4\3\2\2\2\u00cb\u00c9\3\2\2\2\u00cc\u00d5\3\2"+ + "\2\2\u00cd\u00ce\f\4\2\2\u00ce\u00cf\t\3\2\2\u00cf\u00d4\5$\23\5\u00d0"+ + "\u00d1\f\3\2\2\u00d1\u00d2\t\2\2\2\u00d2\u00d4\5$\23\4\u00d3\u00cd\3\2"+ + "\2\2\u00d3\u00d0\3\2\2\2\u00d4\u00d7\3\2\2\2\u00d5\u00d3\3\2\2\2\u00d5"+ + "\u00d6\3\2\2\2\u00d6%\3\2\2\2\u00d7\u00d5\3\2\2\2\u00d8\u00da\7\13\2\2"+ + "\u00d9\u00d8\3\2\2\2\u00d9\u00da\3\2\2\2\u00da\u00db\3\2\2\2\u00db\u00dc"+ + "\7\b\2\2\u00dc\u00dd\7#\2\2\u00dd\u00e2\5\36\20\2\u00de\u00df\7 \2\2\u00df"+ + "\u00e1\5\36\20\2\u00e0\u00de\3\2\2\2\u00e1\u00e4\3\2\2\2\u00e2\u00e0\3"+ + "\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e5\3\2\2\2\u00e4\u00e2\3\2\2\2\u00e5"+ + "\u00e6\7$\2\2\u00e6\'\3\2\2\2\u00e7\u00ef\5,\27\2\u00e8\u00ef\5*\26\2"+ + "\u00e9\u00ef\5\62\32\2\u00ea\u00eb\7#\2\2\u00eb\u00ec\5\36\20\2\u00ec"+ + "\u00ed\7$\2\2\u00ed\u00ef\3\2\2\2\u00ee\u00e7\3\2\2\2\u00ee\u00e8\3\2"+ + "\2\2\u00ee\u00e9\3\2\2\2\u00ee\u00ea\3\2\2\2\u00ef)\3\2\2\2\u00f0\u00f1"+ + "\7*\2\2\u00f1\u00fa\7#\2\2\u00f2\u00f7\5\36\20\2\u00f3\u00f4\7 \2\2\u00f4"+ + "\u00f6\5\36\20\2\u00f5\u00f3\3\2\2\2\u00f6\u00f9\3\2\2\2\u00f7\u00f5\3"+ + "\2\2\2\u00f7\u00f8\3\2\2\2\u00f8\u00fb\3\2\2\2\u00f9\u00f7\3\2\2\2\u00fa"+ + "\u00f2\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u00fc\3\2\2\2\u00fc\u00fd\7$"+ + "\2\2\u00fd+\3\2\2\2\u00fe\u0103\7\f\2\2\u00ff\u0103\58\35\2\u0100\u0103"+ + "\5\60\31\2\u0101\u0103\5:\36\2\u0102\u00fe\3\2\2\2\u0102\u00ff\3\2\2\2"+ + "\u0102\u0100\3\2\2\2\u0102\u0101\3\2\2\2\u0103-\3\2\2\2\u0104\u0105\t"+ + "\4\2\2\u0105/\3\2\2\2\u0106\u0107\t\5\2\2\u0107\61\3\2\2\2\u0108\u0114"+ + "\5\64\33\2\u0109\u010a\7\37\2\2\u010a\u0113\5\64\33\2\u010b\u010d\7!\2"+ + "\2\u010c\u010e\7(\2\2\u010d\u010c\3\2\2\2\u010e\u010f\3\2\2\2\u010f\u010d"+ + "\3\2\2\2\u010f\u0110\3\2\2\2\u0110\u0111\3\2\2\2\u0111\u0113\7\"\2\2\u0112"+ + "\u0109\3\2\2\2\u0112\u010b\3\2\2\2\u0113\u0116\3\2\2\2\u0114\u0112\3\2"+ + "\2\2\u0114\u0115\3\2\2\2\u0115\63\3\2\2\2\u0116\u0114\3\2\2\2\u0117\u0118"+ + "\t\6\2\2\u0118\65\3\2\2\2\u0119\u011b\58\35\2\u011a\u011c\7*\2\2\u011b"+ + "\u011a\3\2\2\2\u011b\u011c\3\2\2\2\u011c\67\3\2\2\2\u011d\u0120\7)\2\2"+ + "\u011e\u0120\7(\2\2\u011f\u011d\3\2\2\2\u011f\u011e\3\2\2\2\u01209\3\2"+ + "\2\2\u0121\u0122\7\'\2\2\u0122;\3\2\2\2\'FLVZ\\bfjpt}\u0080\u0088\u008d"+ + "\u0093\u0095\u0098\u00a2\u00b0\u00b8\u00ba\u00c2\u00c7\u00cb\u00d3\u00d5"+ + "\u00d9\u00e2\u00ee\u00f7\u00fa\u0102\u010f\u0112\u0114\u011b\u011f"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseVisitor.java b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseVisitor.java index 4858355984355..020c8c2768df5 100644 --- a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseVisitor.java +++ b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/EqlBaseVisitor.java @@ -142,16 +142,23 @@ interface EqlBaseVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitComparison(EqlBaseParser.ComparisonContext ctx); + /** + * Visit a parse tree produced by the {@code operatorExpressionDefault} + * labeled alternative in {@link EqlBaseParser#operatorExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitOperatorExpressionDefault(EqlBaseParser.OperatorExpressionDefaultContext ctx); /** * Visit a parse tree produced by the {@code arithmeticBinary} - * labeled alternative in {@link EqlBaseParser#valueExpression}. + * labeled alternative in {@link EqlBaseParser#operatorExpression}. * @param ctx the parse tree * @return the visitor result */ T visitArithmeticBinary(EqlBaseParser.ArithmeticBinaryContext ctx); /** * Visit a parse tree produced by the {@code arithmeticUnary} - * labeled alternative in {@link EqlBaseParser#valueExpression}. + * labeled alternative in {@link EqlBaseParser#operatorExpression}. * @param ctx the parse tree * @return the visitor result */ diff --git a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/ExpressionBuilder.java b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/ExpressionBuilder.java index 8e7edf62bcdd4..4d82f4b771138 100644 --- a/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/ExpressionBuilder.java +++ b/x-pack/plugin/eql/src/main/java/org/elasticsearch/xpack/eql/parser/ExpressionBuilder.java @@ -17,7 +17,6 @@ import org.elasticsearch.xpack.eql.parser.EqlBaseParser.LogicalBinaryContext; import org.elasticsearch.xpack.eql.parser.EqlBaseParser.LogicalNotContext; import org.elasticsearch.xpack.eql.parser.EqlBaseParser.PredicateContext; -import org.elasticsearch.xpack.eql.parser.EqlBaseParser.ValueExpressionDefaultContext; import org.elasticsearch.xpack.ql.QlIllegalArgumentException; import org.elasticsearch.xpack.ql.expression.Attribute; import org.elasticsearch.xpack.ql.expression.Expression; @@ -85,7 +84,7 @@ public List visitJoinKeys(JoinKeysContext ctx) { @Override public Expression visitArithmeticUnary(ArithmeticUnaryContext ctx) { - Expression expr = expression(ctx.valueExpression()); + Expression expr = expression(ctx.operatorExpression()); Source source = source(ctx); int type = ctx.operator.getType(); @@ -149,7 +148,7 @@ public Expression visitComparison(ComparisonContext ctx) { } @Override - public Expression visitValueExpressionDefault(ValueExpressionDefaultContext ctx) { + public Object visitOperatorExpressionDefault(EqlBaseParser.OperatorExpressionDefaultContext ctx) { Expression expr = expression(ctx.primaryExpression()); Source source = source(ctx); diff --git a/x-pack/plugin/eql/src/test/java/org/elasticsearch/xpack/eql/parser/ExpressionTests.java b/x-pack/plugin/eql/src/test/java/org/elasticsearch/xpack/eql/parser/ExpressionTests.java index b69f12563be69..b6cc95ea4e2cc 100644 --- a/x-pack/plugin/eql/src/test/java/org/elasticsearch/xpack/eql/parser/ExpressionTests.java +++ b/x-pack/plugin/eql/src/test/java/org/elasticsearch/xpack/eql/parser/ExpressionTests.java @@ -15,6 +15,7 @@ import org.elasticsearch.xpack.ql.expression.predicate.logical.And; import org.elasticsearch.xpack.ql.expression.predicate.logical.Not; import org.elasticsearch.xpack.ql.expression.predicate.logical.Or; +import org.elasticsearch.xpack.ql.expression.predicate.operator.arithmetic.Mul; import org.elasticsearch.xpack.ql.expression.predicate.operator.arithmetic.Neg; import org.elasticsearch.xpack.ql.expression.predicate.operator.comparison.Equals; import org.elasticsearch.xpack.ql.expression.predicate.operator.comparison.GreaterThan; @@ -96,7 +97,7 @@ public void testDoubleQuotedString() { assertEquals(expected, parsed); } - public void testSingleQuotedUnescapedStringForbidden() { + public void testSingleQuotedUnescapedStringDisallowed() { ParsingException e = expectThrows(ParsingException.class, () -> expr("?'hello world'")); assertEquals("line 1:2: Use double quotes [\"] to define string literals, not single quotes [']", e.getMessage()); @@ -221,4 +222,43 @@ public void testInEmptySet() { expectThrows(ParsingException.class, "Expected syntax error", () -> expr("name in ()")); } + + public void testComplexComparison() { + String comparison; + if (randomBoolean()) { + comparison = "1 * -2 <= -3 * 4"; + } else { + comparison = "(1 * -2) <= (-3 * 4)"; + } + + Mul left = new Mul(null, + new Literal(null, 1, DataTypes.INTEGER), + new Neg(null, new Literal(null, 2, DataTypes.INTEGER))); + Mul right = new Mul(null, + new Neg(null, new Literal(null, 3, DataTypes.INTEGER)), + new Literal(null, 4, DataTypes.INTEGER)); + + assertEquals(new LessThanOrEqual(null, left, right, UTC), expr(comparison)); + } + + public void testChainedComparisonsDisallowed() { + int noComparisions = randomIntBetween(2, 20); + String firstComparator = ""; + String secondComparator = ""; + StringBuilder sb = new StringBuilder("a "); + for (int i = 0 ; i < noComparisions; i++) { + String comparator = randomFrom("=", "==", "!=", "<", "<=", ">", ">="); + sb.append(comparator).append(" a "); + + if (i == 0) { + firstComparator = comparator; + } else if (i == 1) { + secondComparator = comparator; + } + } + ParsingException e = expectThrows(ParsingException.class, () -> expr(sb.toString())); + assertEquals("line 1:" + (6 + firstComparator.length()) + ": mismatched input '" + secondComparator + + "' expecting {, 'and', 'in', 'not', 'or', '+', '-', '*', '/', '%', '.', '['}", + e.getMessage()); + } }