parseExpression(final String expression) {
}
private Node getNode(final String expression, final String defaultField) {
- if (useCache) {
- return cache.get(expression, ex -> parse(ex, defaultField));
- }
return parse(expression, defaultField);
}
- private Node parse(final String expression, final String defaultField) {
+ protected Node parse(final String expression, final String defaultField) {
final BooleanExpressionLexer filterLexer = new BooleanExpressionLexer(CharStreams.fromString(expression));
final CommonTokenStream commonTokenStream = new CommonTokenStream(filterLexer);
final BooleanExpressionParser filterParser = new BooleanExpressionParser(commonTokenStream);
diff --git a/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionBaseListener.java b/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionBaseListener.java
index 4fafed6..6336796 100644
--- a/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionBaseListener.java
+++ b/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionBaseListener.java
@@ -1,4 +1,5 @@
-package com.github.sidhant92.boolparser.parser.antlr;// Generated from /Users/sid/Desktop/filter1/BooleanExpression.g4 by ANTLR 4.13.1
+// Generated from /Users/sidhantaggarwal/bool-parser-java/src/main/java/resources/BooleanExpression.g4 by ANTLR 4.13.2
+package com.github.sidhant92.boolparser.parser.antlr;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.ErrorNode;
@@ -23,6 +24,18 @@ public class BooleanExpressionBaseListener implements BooleanExpressionListener
* The default implementation does nothing.
*/
@Override public void exitParse(BooleanExpressionParser.ParseContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterUnaryArithmeticExpression(BooleanExpressionParser.UnaryArithmeticExpressionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitUnaryArithmeticExpression(BooleanExpressionParser.UnaryArithmeticExpressionContext ctx) { }
/**
* {@inheritDoc}
*
@@ -83,6 +96,18 @@ public class BooleanExpressionBaseListener implements BooleanExpressionListener
* The default implementation does nothing.
*/
@Override public void exitToExpression(BooleanExpressionParser.ToExpressionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterArithmeticFunctionExpression(BooleanExpressionParser.ArithmeticFunctionExpressionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitArithmeticFunctionExpression(BooleanExpressionParser.ArithmeticFunctionExpressionContext ctx) { }
/**
* {@inheritDoc}
*
@@ -95,6 +120,18 @@ public class BooleanExpressionBaseListener implements BooleanExpressionListener
* The default implementation does nothing.
*/
@Override public void exitNotExpression(BooleanExpressionParser.NotExpressionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterArithmeticExpression(BooleanExpressionParser.ArithmeticExpressionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitArithmeticExpression(BooleanExpressionParser.ArithmeticExpressionContext ctx) { }
/**
* {@inheritDoc}
*
@@ -131,6 +168,30 @@ public class BooleanExpressionBaseListener implements BooleanExpressionListener
* The default implementation does nothing.
*/
@Override public void exitComparator(BooleanExpressionParser.ComparatorContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterArithmeticOperator(BooleanExpressionParser.ArithmeticOperatorContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitArithmeticOperator(BooleanExpressionParser.ArithmeticOperatorContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterArithmeticFunction(BooleanExpressionParser.ArithmeticFunctionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitArithmeticFunction(BooleanExpressionParser.ArithmeticFunctionContext ctx) { }
/**
* {@inheritDoc}
*
diff --git a/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionLexer.java b/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionLexer.java
index 559e5c4..6b10f3f 100644
--- a/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionLexer.java
+++ b/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionLexer.java
@@ -1,4 +1,5 @@
-package com.github.sidhant92.boolparser.parser.antlr;// Generated from /Users/sid/Desktop/filter1/BooleanExpression.g4 by ANTLR 4.13.1
+// Generated from /Users/sidhantaggarwal/bool-parser-java/src/main/java/resources/BooleanExpression.g4 by ANTLR 4.13.2
+package com.github.sidhant92.boolparser.parser.antlr;
import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.Token;
@@ -10,16 +11,19 @@
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"})
public class BooleanExpressionLexer extends Lexer {
- static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); }
+ static { RuntimeMetaData.checkVersion("4.13.2", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache =
new PredictionContextCache();
public static final int
T__0=1, IN=2, TO=3, AND=4, OR=5, NOT=6, TRUE=7, FALSE=8, CONTAINS_ALL=9,
- CONTAINS_ANY=10, NE=11, GT=12, GE=13, LT=14, LE=15, EQ=16, LPAREN=17,
- RPAREN=18, DECIMAL=19, APP_VERSION=20, INTEGER=21, WS=22, WORD=23, ALPHANUMERIC=24,
- SQ=25, DQ=26;
+ CONTAINS_ANY=10, MIN=11, MAX=12, AVG=13, SUM=14, MEAN=15, MODE=16, MEDIAN=17,
+ LEN=18, INT=19, DAYS_ELAPSED=20, ADD=21, SUBTRACT=22, MULTIPLY=23, DIVIDE=24,
+ MODULUS=25, EXPONENT=26, NE=27, GT=28, GE=29, LT=30, LE=31, EQ=32, LPAREN=33,
+ RPAREN=34, DECIMAL=35, APP_VERSION=36, INTEGER=37, DATE=38, DATETIME=39,
+ WS=40, WORD=41, SQSTR=42, DQSTR=43, FIELD=44, ALPHANUMERIC=45, SQ=46,
+ DQ=47;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@@ -31,26 +35,33 @@ public class BooleanExpressionLexer extends Lexer {
private static String[] makeRuleNames() {
return new String[] {
"T__0", "IN", "TO", "AND", "OR", "NOT", "TRUE", "FALSE", "CONTAINS_ALL",
- "CONTAINS_ANY", "NE", "GT", "GE", "LT", "LE", "EQ", "LPAREN", "RPAREN",
- "DECIMAL", "APP_VERSION", "INTEGER", "WS", "WORD", "ALPHANUMERIC", "SQ",
- "DQ"
+ "CONTAINS_ANY", "MIN", "MAX", "AVG", "SUM", "MEAN", "MODE", "MEDIAN",
+ "LEN", "INT", "DAYS_ELAPSED", "ADD", "SUBTRACT", "MULTIPLY", "DIVIDE",
+ "MODULUS", "EXPONENT", "NE", "GT", "GE", "LT", "LE", "EQ", "LPAREN",
+ "RPAREN", "DECIMAL", "APP_VERSION", "INTEGER", "DATE", "DATETIME", "WS",
+ "WORD", "SQSTR", "DQSTR", "FIELD", "ALPHANUMERIC", "SQ", "DQ", "DATE_PATTERN",
+ "DATETIME_PATTERN"
};
}
public static final String[] ruleNames = makeRuleNames();
private static String[] makeLiteralNames() {
return new String[] {
- null, "','", null, null, null, null, null, null, null, null, null, "'!='",
- "'>'", "'>='", "'<'", "'<='", "'='", "'('", "')'"
+ null, "','", null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, "'+'", "'-'", "'*'",
+ "'/'", "'%'", "'^'", "'!='", "'>'", "'>='", "'<'", "'<='", "'='", "'('",
+ "')'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
private static String[] makeSymbolicNames() {
return new String[] {
null, null, "IN", "TO", "AND", "OR", "NOT", "TRUE", "FALSE", "CONTAINS_ALL",
- "CONTAINS_ANY", "NE", "GT", "GE", "LT", "LE", "EQ", "LPAREN", "RPAREN",
- "DECIMAL", "APP_VERSION", "INTEGER", "WS", "WORD", "ALPHANUMERIC", "SQ",
- "DQ"
+ "CONTAINS_ANY", "MIN", "MAX", "AVG", "SUM", "MEAN", "MODE", "MEDIAN",
+ "LEN", "INT", "DAYS_ELAPSED", "ADD", "SUBTRACT", "MULTIPLY", "DIVIDE",
+ "MODULUS", "EXPONENT", "NE", "GT", "GE", "LT", "LE", "EQ", "LPAREN",
+ "RPAREN", "DECIMAL", "APP_VERSION", "INTEGER", "DATE", "DATETIME", "WS",
+ "WORD", "SQSTR", "DQSTR", "FIELD", "ALPHANUMERIC", "SQ", "DQ"
};
}
private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -112,161 +123,298 @@ public BooleanExpressionLexer(CharStream input) {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
- "\u0004\u0000\u001a\u00f4\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002"+
- "\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002"+
- "\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002"+
- "\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002"+
- "\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e"+
- "\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011"+
- "\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014"+
- "\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017"+
- "\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0001\u0000\u0001\u0000"+
- "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001<\b\u0001"+
- "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002B\b\u0002"+
- "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+
- "\u0001\u0003\u0001\u0003\u0003\u0003L\b\u0003\u0001\u0004\u0001\u0004"+
- "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004T\b\u0004"+
- "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+
- "\u0003\u0005\\\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+
- "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003\u0006f\b\u0006"+
+ "\u0004\u0000/\u01d1\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001"+
+ "\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004"+
+ "\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007"+
+ "\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b"+
+ "\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002"+
+ "\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002"+
+ "\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002"+
+ "\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002"+
+ "\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002"+
+ "\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002"+
+ "\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007"+
+ "!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007"+
+ "&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007"+
+ "+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u0007"+
+ "0\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
+ "\u0003\u0001j\b\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+
+ "\u0003\u0002p\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+
+ "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0003\u0003z\b\u0003"+
+ "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+
+ "\u0003\u0004\u0082\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+
+ "\u0001\u0005\u0001\u0005\u0003\u0005\u008a\b\u0005\u0001\u0006\u0001\u0006"+
+ "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+
+ "\u0003\u0006\u0094\b\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+
"\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+
- "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0003\u0007r\b\u0007"+
- "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+
+ "\u0003\u0007\u00a0\b\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+
"\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+
- "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003\b\u008c\b\b\u0001"+
- "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+
+ "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+
+ "\b\u0003\b\u00ba\b\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+
"\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+
- "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0003\t\u00a6\b\t\u0001\n\u0001"+
- "\n\u0001\n\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\r\u0001"+
- "\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u0010"+
- "\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0012\u0004\u0012\u00bc\b\u0012"+
- "\u000b\u0012\f\u0012\u00bd\u0001\u0012\u0001\u0012\u0004\u0012\u00c2\b"+
- "\u0012\u000b\u0012\f\u0012\u00c3\u0001\u0013\u0001\u0013\u0001\u0013\u0004"+
- "\u0013\u00c9\b\u0013\u000b\u0013\f\u0013\u00ca\u0001\u0014\u0004\u0014"+
- "\u00ce\b\u0014\u000b\u0014\f\u0014\u00cf\u0001\u0015\u0004\u0015\u00d3"+
- "\b\u0015\u000b\u0015\f\u0015\u00d4\u0001\u0015\u0001\u0015\u0001\u0016"+
- "\u0001\u0016\u0001\u0016\u0001\u0016\u0004\u0016\u00dd\b\u0016\u000b\u0016"+
- "\f\u0016\u00de\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0005\u0018"+
- "\u00e5\b\u0018\n\u0018\f\u0018\u00e8\t\u0018\u0001\u0018\u0001\u0018\u0001"+
- "\u0019\u0001\u0019\u0005\u0019\u00ee\b\u0019\n\u0019\f\u0019\u00f1\t\u0019"+
- "\u0001\u0019\u0001\u0019\u0002\u00e6\u00ef\u0000\u001a\u0001\u0001\u0003"+
- "\u0002\u0005\u0003\u0007\u0004\t\u0005\u000b\u0006\r\u0007\u000f\b\u0011"+
- "\t\u0013\n\u0015\u000b\u0017\f\u0019\r\u001b\u000e\u001d\u000f\u001f\u0010"+
- "!\u0011#\u0012%\u0013\'\u0014)\u0015+\u0016-\u0017/\u00181\u00193\u001a"+
- "\u0001\u0000\u0004\u0001\u000009\u0003\u0000\t\n\f\r \u0002\u0000-._"+
- "_\u0003\u000009AZaz\u0109\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0003"+
- "\u0001\u0000\u0000\u0000\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007"+
- "\u0001\u0000\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001"+
- "\u0000\u0000\u0000\u0000\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000"+
- "\u0000\u0000\u0000\u0011\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000"+
- "\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000"+
- "\u0000\u0000\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000"+
- "\u0000\u0000\u0000\u001d\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000"+
- "\u0000\u0000\u0000!\u0001\u0000\u0000\u0000\u0000#\u0001\u0000\u0000\u0000"+
- "\u0000%\u0001\u0000\u0000\u0000\u0000\'\u0001\u0000\u0000\u0000\u0000"+
- ")\u0001\u0000\u0000\u0000\u0000+\u0001\u0000\u0000\u0000\u0000-\u0001"+
- "\u0000\u0000\u0000\u0000/\u0001\u0000\u0000\u0000\u00001\u0001\u0000\u0000"+
- "\u0000\u00003\u0001\u0000\u0000\u0000\u00015\u0001\u0000\u0000\u0000\u0003"+
- ";\u0001\u0000\u0000\u0000\u0005A\u0001\u0000\u0000\u0000\u0007K\u0001"+
- "\u0000\u0000\u0000\tS\u0001\u0000\u0000\u0000\u000b[\u0001\u0000\u0000"+
- "\u0000\re\u0001\u0000\u0000\u0000\u000fq\u0001\u0000\u0000\u0000\u0011"+
- "\u008b\u0001\u0000\u0000\u0000\u0013\u00a5\u0001\u0000\u0000\u0000\u0015"+
- "\u00a7\u0001\u0000\u0000\u0000\u0017\u00aa\u0001\u0000\u0000\u0000\u0019"+
- "\u00ac\u0001\u0000\u0000\u0000\u001b\u00af\u0001\u0000\u0000\u0000\u001d"+
- "\u00b1\u0001\u0000\u0000\u0000\u001f\u00b4\u0001\u0000\u0000\u0000!\u00b6"+
- "\u0001\u0000\u0000\u0000#\u00b8\u0001\u0000\u0000\u0000%\u00bb\u0001\u0000"+
- "\u0000\u0000\'\u00c5\u0001\u0000\u0000\u0000)\u00cd\u0001\u0000\u0000"+
- "\u0000+\u00d2\u0001\u0000\u0000\u0000-\u00dc\u0001\u0000\u0000\u0000/"+
- "\u00e0\u0001\u0000\u0000\u00001\u00e2\u0001\u0000\u0000\u00003\u00eb\u0001"+
- "\u0000\u0000\u000056\u0005,\u0000\u00006\u0002\u0001\u0000\u0000\u0000"+
- "78\u0005I\u0000\u00008<\u0005N\u0000\u00009:\u0005i\u0000\u0000:<\u0005"+
- "n\u0000\u0000;7\u0001\u0000\u0000\u0000;9\u0001\u0000\u0000\u0000<\u0004"+
- "\u0001\u0000\u0000\u0000=>\u0005T\u0000\u0000>B\u0005O\u0000\u0000?@\u0005"+
- "t\u0000\u0000@B\u0005o\u0000\u0000A=\u0001\u0000\u0000\u0000A?\u0001\u0000"+
- "\u0000\u0000B\u0006\u0001\u0000\u0000\u0000CD\u0005A\u0000\u0000DE\u0005"+
- "N\u0000\u0000EL\u0005D\u0000\u0000FG\u0005a\u0000\u0000GH\u0005n\u0000"+
- "\u0000HL\u0005d\u0000\u0000IJ\u0005&\u0000\u0000JL\u0005&\u0000\u0000"+
- "KC\u0001\u0000\u0000\u0000KF\u0001\u0000\u0000\u0000KI\u0001\u0000\u0000"+
- "\u0000L\b\u0001\u0000\u0000\u0000MN\u0005O\u0000\u0000NT\u0005R\u0000"+
- "\u0000OP\u0005o\u0000\u0000PT\u0005r\u0000\u0000QR\u0005|\u0000\u0000"+
- "RT\u0005|\u0000\u0000SM\u0001\u0000\u0000\u0000SO\u0001\u0000\u0000\u0000"+
- "SQ\u0001\u0000\u0000\u0000T\n\u0001\u0000\u0000\u0000UV\u0005N\u0000\u0000"+
- "VW\u0005O\u0000\u0000W\\\u0005T\u0000\u0000XY\u0005n\u0000\u0000YZ\u0005"+
- "o\u0000\u0000Z\\\u0005t\u0000\u0000[U\u0001\u0000\u0000\u0000[X\u0001"+
- "\u0000\u0000\u0000\\\f\u0001\u0000\u0000\u0000]^\u0005T\u0000\u0000^_"+
- "\u0005R\u0000\u0000_`\u0005U\u0000\u0000`f\u0005E\u0000\u0000ab\u0005"+
- "t\u0000\u0000bc\u0005r\u0000\u0000cd\u0005u\u0000\u0000df\u0005e\u0000"+
- "\u0000e]\u0001\u0000\u0000\u0000ea\u0001\u0000\u0000\u0000f\u000e\u0001"+
- "\u0000\u0000\u0000gh\u0005F\u0000\u0000hi\u0005A\u0000\u0000ij\u0005L"+
- "\u0000\u0000jk\u0005S\u0000\u0000kr\u0005E\u0000\u0000lm\u0005f\u0000"+
- "\u0000mn\u0005a\u0000\u0000no\u0005l\u0000\u0000op\u0005s\u0000\u0000"+
- "pr\u0005e\u0000\u0000qg\u0001\u0000\u0000\u0000ql\u0001\u0000\u0000\u0000"+
- "r\u0010\u0001\u0000\u0000\u0000st\u0005C\u0000\u0000tu\u0005O\u0000\u0000"+
- "uv\u0005N\u0000\u0000vw\u0005T\u0000\u0000wx\u0005A\u0000\u0000xy\u0005"+
- "I\u0000\u0000yz\u0005N\u0000\u0000z{\u0005S\u0000\u0000{|\u0005_\u0000"+
- "\u0000|}\u0005A\u0000\u0000}~\u0005L\u0000\u0000~\u008c\u0005L\u0000\u0000"+
- "\u007f\u0080\u0005c\u0000\u0000\u0080\u0081\u0005o\u0000\u0000\u0081\u0082"+
- "\u0005n\u0000\u0000\u0082\u0083\u0005t\u0000\u0000\u0083\u0084\u0005a"+
- "\u0000\u0000\u0084\u0085\u0005i\u0000\u0000\u0085\u0086\u0005n\u0000\u0000"+
- "\u0086\u0087\u0005s\u0000\u0000\u0087\u0088\u0005_\u0000\u0000\u0088\u0089"+
- "\u0005a\u0000\u0000\u0089\u008a\u0005l\u0000\u0000\u008a\u008c\u0005l"+
- "\u0000\u0000\u008bs\u0001\u0000\u0000\u0000\u008b\u007f\u0001\u0000\u0000"+
- "\u0000\u008c\u0012\u0001\u0000\u0000\u0000\u008d\u008e\u0005C\u0000\u0000"+
- "\u008e\u008f\u0005O\u0000\u0000\u008f\u0090\u0005N\u0000\u0000\u0090\u0091"+
- "\u0005T\u0000\u0000\u0091\u0092\u0005A\u0000\u0000\u0092\u0093\u0005I"+
- "\u0000\u0000\u0093\u0094\u0005N\u0000\u0000\u0094\u0095\u0005S\u0000\u0000"+
- "\u0095\u0096\u0005_\u0000\u0000\u0096\u0097\u0005A\u0000\u0000\u0097\u0098"+
- "\u0005N\u0000\u0000\u0098\u00a6\u0005Y\u0000\u0000\u0099\u009a\u0005c"+
- "\u0000\u0000\u009a\u009b\u0005o\u0000\u0000\u009b\u009c\u0005n\u0000\u0000"+
- "\u009c\u009d\u0005t\u0000\u0000\u009d\u009e\u0005a\u0000\u0000\u009e\u009f"+
- "\u0005i\u0000\u0000\u009f\u00a0\u0005n\u0000\u0000\u00a0\u00a1\u0005s"+
- "\u0000\u0000\u00a1\u00a2\u0005_\u0000\u0000\u00a2\u00a3\u0005a\u0000\u0000"+
- "\u00a3\u00a4\u0005n\u0000\u0000\u00a4\u00a6\u0005y\u0000\u0000\u00a5\u008d"+
- "\u0001\u0000\u0000\u0000\u00a5\u0099\u0001\u0000\u0000\u0000\u00a6\u0014"+
- "\u0001\u0000\u0000\u0000\u00a7\u00a8\u0005!\u0000\u0000\u00a8\u00a9\u0005"+
- "=\u0000\u0000\u00a9\u0016\u0001\u0000\u0000\u0000\u00aa\u00ab\u0005>\u0000"+
- "\u0000\u00ab\u0018\u0001\u0000\u0000\u0000\u00ac\u00ad\u0005>\u0000\u0000"+
- "\u00ad\u00ae\u0005=\u0000\u0000\u00ae\u001a\u0001\u0000\u0000\u0000\u00af"+
- "\u00b0\u0005<\u0000\u0000\u00b0\u001c\u0001\u0000\u0000\u0000\u00b1\u00b2"+
- "\u0005<\u0000\u0000\u00b2\u00b3\u0005=\u0000\u0000\u00b3\u001e\u0001\u0000"+
- "\u0000\u0000\u00b4\u00b5\u0005=\u0000\u0000\u00b5 \u0001\u0000\u0000\u0000"+
- "\u00b6\u00b7\u0005(\u0000\u0000\u00b7\"\u0001\u0000\u0000\u0000\u00b8"+
- "\u00b9\u0005)\u0000\u0000\u00b9$\u0001\u0000\u0000\u0000\u00ba\u00bc\u0007"+
- "\u0000\u0000\u0000\u00bb\u00ba\u0001\u0000\u0000\u0000\u00bc\u00bd\u0001"+
- "\u0000\u0000\u0000\u00bd\u00bb\u0001\u0000\u0000\u0000\u00bd\u00be\u0001"+
- "\u0000\u0000\u0000\u00be\u00bf\u0001\u0000\u0000\u0000\u00bf\u00c1\u0005"+
- ".\u0000\u0000\u00c0\u00c2\u0007\u0000\u0000\u0000\u00c1\u00c0\u0001\u0000"+
- "\u0000\u0000\u00c2\u00c3\u0001\u0000\u0000\u0000\u00c3\u00c1\u0001\u0000"+
- "\u0000\u0000\u00c3\u00c4\u0001\u0000\u0000\u0000\u00c4&\u0001\u0000\u0000"+
- "\u0000\u00c5\u00c8\u0007\u0000\u0000\u0000\u00c6\u00c7\u0005.\u0000\u0000"+
- "\u00c7\u00c9\u0003)\u0014\u0000\u00c8\u00c6\u0001\u0000\u0000\u0000\u00c9"+
- "\u00ca\u0001\u0000\u0000\u0000\u00ca\u00c8\u0001\u0000\u0000\u0000\u00ca"+
- "\u00cb\u0001\u0000\u0000\u0000\u00cb(\u0001\u0000\u0000\u0000\u00cc\u00ce"+
- "\u0007\u0000\u0000\u0000\u00cd\u00cc\u0001\u0000\u0000\u0000\u00ce\u00cf"+
- "\u0001\u0000\u0000\u0000\u00cf\u00cd\u0001\u0000\u0000\u0000\u00cf\u00d0"+
- "\u0001\u0000\u0000\u0000\u00d0*\u0001\u0000\u0000\u0000\u00d1\u00d3\u0007"+
- "\u0001\u0000\u0000\u00d2\u00d1\u0001\u0000\u0000\u0000\u00d3\u00d4\u0001"+
- "\u0000\u0000\u0000\u00d4\u00d2\u0001\u0000\u0000\u0000\u00d4\u00d5\u0001"+
- "\u0000\u0000\u0000\u00d5\u00d6\u0001\u0000\u0000\u0000\u00d6\u00d7\u0006"+
- "\u0015\u0000\u0000\u00d7,\u0001\u0000\u0000\u0000\u00d8\u00dd\u0003/\u0017"+
- "\u0000\u00d9\u00dd\u0007\u0002\u0000\u0000\u00da\u00dd\u00031\u0018\u0000"+
- "\u00db\u00dd\u00033\u0019\u0000\u00dc\u00d8\u0001\u0000\u0000\u0000\u00dc"+
- "\u00d9\u0001\u0000\u0000\u0000\u00dc\u00da\u0001\u0000\u0000\u0000\u00dc"+
- "\u00db\u0001\u0000\u0000\u0000\u00dd\u00de\u0001\u0000\u0000\u0000\u00de"+
- "\u00dc\u0001\u0000\u0000\u0000\u00de\u00df\u0001\u0000\u0000\u0000\u00df"+
- ".\u0001\u0000\u0000\u0000\u00e0\u00e1\u0007\u0003\u0000\u0000\u00e10\u0001"+
- "\u0000\u0000\u0000\u00e2\u00e6\u0005\'\u0000\u0000\u00e3\u00e5\t\u0000"+
- "\u0000\u0000\u00e4\u00e3\u0001\u0000\u0000\u0000\u00e5\u00e8\u0001\u0000"+
- "\u0000\u0000\u00e6\u00e7\u0001\u0000\u0000\u0000\u00e6\u00e4\u0001\u0000"+
- "\u0000\u0000\u00e7\u00e9\u0001\u0000\u0000\u0000\u00e8\u00e6\u0001\u0000"+
- "\u0000\u0000\u00e9\u00ea\u0005\'\u0000\u0000\u00ea2\u0001\u0000\u0000"+
- "\u0000\u00eb\u00ef\u0005\"\u0000\u0000\u00ec\u00ee\t\u0000\u0000\u0000"+
- "\u00ed\u00ec\u0001\u0000\u0000\u0000\u00ee\u00f1\u0001\u0000\u0000\u0000"+
- "\u00ef\u00f0\u0001\u0000\u0000\u0000\u00ef\u00ed\u0001\u0000\u0000\u0000"+
- "\u00f0\u00f2\u0001\u0000\u0000\u0000\u00f1\u00ef\u0001\u0000\u0000\u0000"+
- "\u00f2\u00f3\u0005\"\u0000\u0000\u00f34\u0001\u0000\u0000\u0000\u0013"+
- "\u0000;AKS[eq\u008b\u00a5\u00bd\u00c3\u00ca\u00cf\u00d4\u00dc\u00de\u00e6"+
- "\u00ef\u0001\u0006\u0000\u0000";
+ "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0003"+
+ "\t\u00d4\b\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0003\n\u00dc"+
+ "\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+
+ "\u000b\u0003\u000b\u00e4\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+
+ "\f\u0001\f\u0003\f\u00ec\b\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+
+ "\r\u0003\r\u00f4\b\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+
+ "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0003\u000e\u00fe\b\u000e\u0001"+
+ "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+
+ "\u000f\u0001\u000f\u0003\u000f\u0108\b\u000f\u0001\u0010\u0001\u0010\u0001"+
+ "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+
+ "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u0116\b\u0010\u0001"+
+ "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0003"+
+ "\u0011\u011e\b\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+
+ "\u0012\u0001\u0012\u0003\u0012\u0126\b\u0012\u0001\u0013\u0001\u0013\u0001"+
+ "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+
+ "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+
+ "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+
+ "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0003\u0013\u0140\b\u0013\u0001"+
+ "\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001"+
+ "\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001"+
+ "\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001c\u0001"+
+ "\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001"+
+ "\u001e\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001!\u0001!\u0001\"\u0004"+
+ "\"\u0162\b\"\u000b\"\f\"\u0163\u0001\"\u0001\"\u0004\"\u0168\b\"\u000b"+
+ "\"\f\"\u0169\u0001#\u0001#\u0001#\u0004#\u016f\b#\u000b#\f#\u0170\u0001"+
+ "$\u0004$\u0174\b$\u000b$\f$\u0175\u0001%\u0001%\u0001&\u0001&\u0001\'"+
+ "\u0004\'\u017d\b\'\u000b\'\f\'\u017e\u0001\'\u0001\'\u0001(\u0001(\u0003"+
+ "(\u0185\b(\u0001)\u0001)\u0005)\u0189\b)\n)\f)\u018c\t)\u0001)\u0001)"+
+ "\u0001*\u0001*\u0005*\u0192\b*\n*\f*\u0195\t*\u0001*\u0001*\u0001+\u0001"+
+ "+\u0004+\u019b\b+\u000b+\f+\u019c\u0001,\u0001,\u0001-\u0001-\u0005-\u01a3"+
+ "\b-\n-\f-\u01a6\t-\u0001-\u0001-\u0001.\u0001.\u0005.\u01ac\b.\n.\f.\u01af"+
+ "\t.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+
+ "/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+
+ "0\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+
+ "0\u00010\u00010\u00010\u0004\u018a\u0193\u01a4\u01ad\u00001\u0001\u0001"+
+ "\u0003\u0002\u0005\u0003\u0007\u0004\t\u0005\u000b\u0006\r\u0007\u000f"+
+ "\b\u0011\t\u0013\n\u0015\u000b\u0017\f\u0019\r\u001b\u000e\u001d\u000f"+
+ "\u001f\u0010!\u0011#\u0012%\u0013\'\u0014)\u0015+\u0016-\u0017/\u0018"+
+ "1\u00193\u001a5\u001b7\u001c9\u001d;\u001e=\u001f? A!C\"E#G$I%K&M\'O("+
+ "Q)S*U+W,Y-[.]/_\u0000a\u0000\u0001\u0000\u0004\u0001\u000009\u0003\u0000"+
+ "\t\n\f\r \u0002\u0000..__\u0003\u000009AZaz\u01ef\u0000\u0001\u0001\u0000"+
+ "\u0000\u0000\u0000\u0003\u0001\u0000\u0000\u0000\u0000\u0005\u0001\u0000"+
+ "\u0000\u0000\u0000\u0007\u0001\u0000\u0000\u0000\u0000\t\u0001\u0000\u0000"+
+ "\u0000\u0000\u000b\u0001\u0000\u0000\u0000\u0000\r\u0001\u0000\u0000\u0000"+
+ "\u0000\u000f\u0001\u0000\u0000\u0000\u0000\u0011\u0001\u0000\u0000\u0000"+
+ "\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000"+
+ "\u0000\u0017\u0001\u0000\u0000\u0000\u0000\u0019\u0001\u0000\u0000\u0000"+
+ "\u0000\u001b\u0001\u0000\u0000\u0000\u0000\u001d\u0001\u0000\u0000\u0000"+
+ "\u0000\u001f\u0001\u0000\u0000\u0000\u0000!\u0001\u0000\u0000\u0000\u0000"+
+ "#\u0001\u0000\u0000\u0000\u0000%\u0001\u0000\u0000\u0000\u0000\'\u0001"+
+ "\u0000\u0000\u0000\u0000)\u0001\u0000\u0000\u0000\u0000+\u0001\u0000\u0000"+
+ "\u0000\u0000-\u0001\u0000\u0000\u0000\u0000/\u0001\u0000\u0000\u0000\u0000"+
+ "1\u0001\u0000\u0000\u0000\u00003\u0001\u0000\u0000\u0000\u00005\u0001"+
+ "\u0000\u0000\u0000\u00007\u0001\u0000\u0000\u0000\u00009\u0001\u0000\u0000"+
+ "\u0000\u0000;\u0001\u0000\u0000\u0000\u0000=\u0001\u0000\u0000\u0000\u0000"+
+ "?\u0001\u0000\u0000\u0000\u0000A\u0001\u0000\u0000\u0000\u0000C\u0001"+
+ "\u0000\u0000\u0000\u0000E\u0001\u0000\u0000\u0000\u0000G\u0001\u0000\u0000"+
+ "\u0000\u0000I\u0001\u0000\u0000\u0000\u0000K\u0001\u0000\u0000\u0000\u0000"+
+ "M\u0001\u0000\u0000\u0000\u0000O\u0001\u0000\u0000\u0000\u0000Q\u0001"+
+ "\u0000\u0000\u0000\u0000S\u0001\u0000\u0000\u0000\u0000U\u0001\u0000\u0000"+
+ "\u0000\u0000W\u0001\u0000\u0000\u0000\u0000Y\u0001\u0000\u0000\u0000\u0000"+
+ "[\u0001\u0000\u0000\u0000\u0000]\u0001\u0000\u0000\u0000\u0001c\u0001"+
+ "\u0000\u0000\u0000\u0003i\u0001\u0000\u0000\u0000\u0005o\u0001\u0000\u0000"+
+ "\u0000\u0007y\u0001\u0000\u0000\u0000\t\u0081\u0001\u0000\u0000\u0000"+
+ "\u000b\u0089\u0001\u0000\u0000\u0000\r\u0093\u0001\u0000\u0000\u0000\u000f"+
+ "\u009f\u0001\u0000\u0000\u0000\u0011\u00b9\u0001\u0000\u0000\u0000\u0013"+
+ "\u00d3\u0001\u0000\u0000\u0000\u0015\u00db\u0001\u0000\u0000\u0000\u0017"+
+ "\u00e3\u0001\u0000\u0000\u0000\u0019\u00eb\u0001\u0000\u0000\u0000\u001b"+
+ "\u00f3\u0001\u0000\u0000\u0000\u001d\u00fd\u0001\u0000\u0000\u0000\u001f"+
+ "\u0107\u0001\u0000\u0000\u0000!\u0115\u0001\u0000\u0000\u0000#\u011d\u0001"+
+ "\u0000\u0000\u0000%\u0125\u0001\u0000\u0000\u0000\'\u013f\u0001\u0000"+
+ "\u0000\u0000)\u0141\u0001\u0000\u0000\u0000+\u0143\u0001\u0000\u0000\u0000"+
+ "-\u0145\u0001\u0000\u0000\u0000/\u0147\u0001\u0000\u0000\u00001\u0149"+
+ "\u0001\u0000\u0000\u00003\u014b\u0001\u0000\u0000\u00005\u014d\u0001\u0000"+
+ "\u0000\u00007\u0150\u0001\u0000\u0000\u00009\u0152\u0001\u0000\u0000\u0000"+
+ ";\u0155\u0001\u0000\u0000\u0000=\u0157\u0001\u0000\u0000\u0000?\u015a"+
+ "\u0001\u0000\u0000\u0000A\u015c\u0001\u0000\u0000\u0000C\u015e\u0001\u0000"+
+ "\u0000\u0000E\u0161\u0001\u0000\u0000\u0000G\u016b\u0001\u0000\u0000\u0000"+
+ "I\u0173\u0001\u0000\u0000\u0000K\u0177\u0001\u0000\u0000\u0000M\u0179"+
+ "\u0001\u0000\u0000\u0000O\u017c\u0001\u0000\u0000\u0000Q\u0184\u0001\u0000"+
+ "\u0000\u0000S\u0186\u0001\u0000\u0000\u0000U\u018f\u0001\u0000\u0000\u0000"+
+ "W\u019a\u0001\u0000\u0000\u0000Y\u019e\u0001\u0000\u0000\u0000[\u01a0"+
+ "\u0001\u0000\u0000\u0000]\u01a9\u0001\u0000\u0000\u0000_\u01b2\u0001\u0000"+
+ "\u0000\u0000a\u01bd\u0001\u0000\u0000\u0000cd\u0005,\u0000\u0000d\u0002"+
+ "\u0001\u0000\u0000\u0000ef\u0005I\u0000\u0000fj\u0005N\u0000\u0000gh\u0005"+
+ "i\u0000\u0000hj\u0005n\u0000\u0000ie\u0001\u0000\u0000\u0000ig\u0001\u0000"+
+ "\u0000\u0000j\u0004\u0001\u0000\u0000\u0000kl\u0005T\u0000\u0000lp\u0005"+
+ "O\u0000\u0000mn\u0005t\u0000\u0000np\u0005o\u0000\u0000ok\u0001\u0000"+
+ "\u0000\u0000om\u0001\u0000\u0000\u0000p\u0006\u0001\u0000\u0000\u0000"+
+ "qr\u0005A\u0000\u0000rs\u0005N\u0000\u0000sz\u0005D\u0000\u0000tu\u0005"+
+ "a\u0000\u0000uv\u0005n\u0000\u0000vz\u0005d\u0000\u0000wx\u0005&\u0000"+
+ "\u0000xz\u0005&\u0000\u0000yq\u0001\u0000\u0000\u0000yt\u0001\u0000\u0000"+
+ "\u0000yw\u0001\u0000\u0000\u0000z\b\u0001\u0000\u0000\u0000{|\u0005O\u0000"+
+ "\u0000|\u0082\u0005R\u0000\u0000}~\u0005o\u0000\u0000~\u0082\u0005r\u0000"+
+ "\u0000\u007f\u0080\u0005|\u0000\u0000\u0080\u0082\u0005|\u0000\u0000\u0081"+
+ "{\u0001\u0000\u0000\u0000\u0081}\u0001\u0000\u0000\u0000\u0081\u007f\u0001"+
+ "\u0000\u0000\u0000\u0082\n\u0001\u0000\u0000\u0000\u0083\u0084\u0005N"+
+ "\u0000\u0000\u0084\u0085\u0005O\u0000\u0000\u0085\u008a\u0005T\u0000\u0000"+
+ "\u0086\u0087\u0005n\u0000\u0000\u0087\u0088\u0005o\u0000\u0000\u0088\u008a"+
+ "\u0005t\u0000\u0000\u0089\u0083\u0001\u0000\u0000\u0000\u0089\u0086\u0001"+
+ "\u0000\u0000\u0000\u008a\f\u0001\u0000\u0000\u0000\u008b\u008c\u0005T"+
+ "\u0000\u0000\u008c\u008d\u0005R\u0000\u0000\u008d\u008e\u0005U\u0000\u0000"+
+ "\u008e\u0094\u0005E\u0000\u0000\u008f\u0090\u0005t\u0000\u0000\u0090\u0091"+
+ "\u0005r\u0000\u0000\u0091\u0092\u0005u\u0000\u0000\u0092\u0094\u0005e"+
+ "\u0000\u0000\u0093\u008b\u0001\u0000\u0000\u0000\u0093\u008f\u0001\u0000"+
+ "\u0000\u0000\u0094\u000e\u0001\u0000\u0000\u0000\u0095\u0096\u0005F\u0000"+
+ "\u0000\u0096\u0097\u0005A\u0000\u0000\u0097\u0098\u0005L\u0000\u0000\u0098"+
+ "\u0099\u0005S\u0000\u0000\u0099\u00a0\u0005E\u0000\u0000\u009a\u009b\u0005"+
+ "f\u0000\u0000\u009b\u009c\u0005a\u0000\u0000\u009c\u009d\u0005l\u0000"+
+ "\u0000\u009d\u009e\u0005s\u0000\u0000\u009e\u00a0\u0005e\u0000\u0000\u009f"+
+ "\u0095\u0001\u0000\u0000\u0000\u009f\u009a\u0001\u0000\u0000\u0000\u00a0"+
+ "\u0010\u0001\u0000\u0000\u0000\u00a1\u00a2\u0005C\u0000\u0000\u00a2\u00a3"+
+ "\u0005O\u0000\u0000\u00a3\u00a4\u0005N\u0000\u0000\u00a4\u00a5\u0005T"+
+ "\u0000\u0000\u00a5\u00a6\u0005A\u0000\u0000\u00a6\u00a7\u0005I\u0000\u0000"+
+ "\u00a7\u00a8\u0005N\u0000\u0000\u00a8\u00a9\u0005S\u0000\u0000\u00a9\u00aa"+
+ "\u0005_\u0000\u0000\u00aa\u00ab\u0005A\u0000\u0000\u00ab\u00ac\u0005L"+
+ "\u0000\u0000\u00ac\u00ba\u0005L\u0000\u0000\u00ad\u00ae\u0005c\u0000\u0000"+
+ "\u00ae\u00af\u0005o\u0000\u0000\u00af\u00b0\u0005n\u0000\u0000\u00b0\u00b1"+
+ "\u0005t\u0000\u0000\u00b1\u00b2\u0005a\u0000\u0000\u00b2\u00b3\u0005i"+
+ "\u0000\u0000\u00b3\u00b4\u0005n\u0000\u0000\u00b4\u00b5\u0005s\u0000\u0000"+
+ "\u00b5\u00b6\u0005_\u0000\u0000\u00b6\u00b7\u0005a\u0000\u0000\u00b7\u00b8"+
+ "\u0005l\u0000\u0000\u00b8\u00ba\u0005l\u0000\u0000\u00b9\u00a1\u0001\u0000"+
+ "\u0000\u0000\u00b9\u00ad\u0001\u0000\u0000\u0000\u00ba\u0012\u0001\u0000"+
+ "\u0000\u0000\u00bb\u00bc\u0005C\u0000\u0000\u00bc\u00bd\u0005O\u0000\u0000"+
+ "\u00bd\u00be\u0005N\u0000\u0000\u00be\u00bf\u0005T\u0000\u0000\u00bf\u00c0"+
+ "\u0005A\u0000\u0000\u00c0\u00c1\u0005I\u0000\u0000\u00c1\u00c2\u0005N"+
+ "\u0000\u0000\u00c2\u00c3\u0005S\u0000\u0000\u00c3\u00c4\u0005_\u0000\u0000"+
+ "\u00c4\u00c5\u0005A\u0000\u0000\u00c5\u00c6\u0005N\u0000\u0000\u00c6\u00d4"+
+ "\u0005Y\u0000\u0000\u00c7\u00c8\u0005c\u0000\u0000\u00c8\u00c9\u0005o"+
+ "\u0000\u0000\u00c9\u00ca\u0005n\u0000\u0000\u00ca\u00cb\u0005t\u0000\u0000"+
+ "\u00cb\u00cc\u0005a\u0000\u0000\u00cc\u00cd\u0005i\u0000\u0000\u00cd\u00ce"+
+ "\u0005n\u0000\u0000\u00ce\u00cf\u0005s\u0000\u0000\u00cf\u00d0\u0005_"+
+ "\u0000\u0000\u00d0\u00d1\u0005a\u0000\u0000\u00d1\u00d2\u0005n\u0000\u0000"+
+ "\u00d2\u00d4\u0005y\u0000\u0000\u00d3\u00bb\u0001\u0000\u0000\u0000\u00d3"+
+ "\u00c7\u0001\u0000\u0000\u0000\u00d4\u0014\u0001\u0000\u0000\u0000\u00d5"+
+ "\u00d6\u0005M\u0000\u0000\u00d6\u00d7\u0005I\u0000\u0000\u00d7\u00dc\u0005"+
+ "N\u0000\u0000\u00d8\u00d9\u0005m\u0000\u0000\u00d9\u00da\u0005i\u0000"+
+ "\u0000\u00da\u00dc\u0005n\u0000\u0000\u00db\u00d5\u0001\u0000\u0000\u0000"+
+ "\u00db\u00d8\u0001\u0000\u0000\u0000\u00dc\u0016\u0001\u0000\u0000\u0000"+
+ "\u00dd\u00de\u0005M\u0000\u0000\u00de\u00df\u0005A\u0000\u0000\u00df\u00e4"+
+ "\u0005X\u0000\u0000\u00e0\u00e1\u0005m\u0000\u0000\u00e1\u00e2\u0005a"+
+ "\u0000\u0000\u00e2\u00e4\u0005x\u0000\u0000\u00e3\u00dd\u0001\u0000\u0000"+
+ "\u0000\u00e3\u00e0\u0001\u0000\u0000\u0000\u00e4\u0018\u0001\u0000\u0000"+
+ "\u0000\u00e5\u00e6\u0005A\u0000\u0000\u00e6\u00e7\u0005V\u0000\u0000\u00e7"+
+ "\u00ec\u0005G\u0000\u0000\u00e8\u00e9\u0005a\u0000\u0000\u00e9\u00ea\u0005"+
+ "v\u0000\u0000\u00ea\u00ec\u0005g\u0000\u0000\u00eb\u00e5\u0001\u0000\u0000"+
+ "\u0000\u00eb\u00e8\u0001\u0000\u0000\u0000\u00ec\u001a\u0001\u0000\u0000"+
+ "\u0000\u00ed\u00ee\u0005S\u0000\u0000\u00ee\u00ef\u0005U\u0000\u0000\u00ef"+
+ "\u00f4\u0005M\u0000\u0000\u00f0\u00f1\u0005s\u0000\u0000\u00f1\u00f2\u0005"+
+ "u\u0000\u0000\u00f2\u00f4\u0005m\u0000\u0000\u00f3\u00ed\u0001\u0000\u0000"+
+ "\u0000\u00f3\u00f0\u0001\u0000\u0000\u0000\u00f4\u001c\u0001\u0000\u0000"+
+ "\u0000\u00f5\u00f6\u0005M\u0000\u0000\u00f6\u00f7\u0005E\u0000\u0000\u00f7"+
+ "\u00f8\u0005A\u0000\u0000\u00f8\u00fe\u0005N\u0000\u0000\u00f9\u00fa\u0005"+
+ "m\u0000\u0000\u00fa\u00fb\u0005e\u0000\u0000\u00fb\u00fc\u0005a\u0000"+
+ "\u0000\u00fc\u00fe\u0005n\u0000\u0000\u00fd\u00f5\u0001\u0000\u0000\u0000"+
+ "\u00fd\u00f9\u0001\u0000\u0000\u0000\u00fe\u001e\u0001\u0000\u0000\u0000"+
+ "\u00ff\u0100\u0005M\u0000\u0000\u0100\u0101\u0005O\u0000\u0000\u0101\u0102"+
+ "\u0005D\u0000\u0000\u0102\u0108\u0005E\u0000\u0000\u0103\u0104\u0005m"+
+ "\u0000\u0000\u0104\u0105\u0005o\u0000\u0000\u0105\u0106\u0005d\u0000\u0000"+
+ "\u0106\u0108\u0005e\u0000\u0000\u0107\u00ff\u0001\u0000\u0000\u0000\u0107"+
+ "\u0103\u0001\u0000\u0000\u0000\u0108 \u0001\u0000\u0000\u0000\u0109\u010a"+
+ "\u0005M\u0000\u0000\u010a\u010b\u0005E\u0000\u0000\u010b\u010c\u0005D"+
+ "\u0000\u0000\u010c\u010d\u0005I\u0000\u0000\u010d\u010e\u0005A\u0000\u0000"+
+ "\u010e\u0116\u0005N\u0000\u0000\u010f\u0110\u0005m\u0000\u0000\u0110\u0111"+
+ "\u0005e\u0000\u0000\u0111\u0112\u0005d\u0000\u0000\u0112\u0113\u0005i"+
+ "\u0000\u0000\u0113\u0114\u0005a\u0000\u0000\u0114\u0116\u0005n\u0000\u0000"+
+ "\u0115\u0109\u0001\u0000\u0000\u0000\u0115\u010f\u0001\u0000\u0000\u0000"+
+ "\u0116\"\u0001\u0000\u0000\u0000\u0117\u0118\u0005L\u0000\u0000\u0118"+
+ "\u0119\u0005E\u0000\u0000\u0119\u011e\u0005N\u0000\u0000\u011a\u011b\u0005"+
+ "l\u0000\u0000\u011b\u011c\u0005e\u0000\u0000\u011c\u011e\u0005n\u0000"+
+ "\u0000\u011d\u0117\u0001\u0000\u0000\u0000\u011d\u011a\u0001\u0000\u0000"+
+ "\u0000\u011e$\u0001\u0000\u0000\u0000\u011f\u0120\u0005I\u0000\u0000\u0120"+
+ "\u0121\u0005N\u0000\u0000\u0121\u0126\u0005T\u0000\u0000\u0122\u0123\u0005"+
+ "i\u0000\u0000\u0123\u0124\u0005n\u0000\u0000\u0124\u0126\u0005t\u0000"+
+ "\u0000\u0125\u011f\u0001\u0000\u0000\u0000\u0125\u0122\u0001\u0000\u0000"+
+ "\u0000\u0126&\u0001\u0000\u0000\u0000\u0127\u0128\u0005D\u0000\u0000\u0128"+
+ "\u0129\u0005A\u0000\u0000\u0129\u012a\u0005Y\u0000\u0000\u012a\u012b\u0005"+
+ "S\u0000\u0000\u012b\u012c\u0005_\u0000\u0000\u012c\u012d\u0005E\u0000"+
+ "\u0000\u012d\u012e\u0005L\u0000\u0000\u012e\u012f\u0005A\u0000\u0000\u012f"+
+ "\u0130\u0005P\u0000\u0000\u0130\u0131\u0005S\u0000\u0000\u0131\u0132\u0005"+
+ "E\u0000\u0000\u0132\u0140\u0005D\u0000\u0000\u0133\u0134\u0005d\u0000"+
+ "\u0000\u0134\u0135\u0005a\u0000\u0000\u0135\u0136\u0005y\u0000\u0000\u0136"+
+ "\u0137\u0005s\u0000\u0000\u0137\u0138\u0005_\u0000\u0000\u0138\u0139\u0005"+
+ "e\u0000\u0000\u0139\u013a\u0005l\u0000\u0000\u013a\u013b\u0005a\u0000"+
+ "\u0000\u013b\u013c\u0005p\u0000\u0000\u013c\u013d\u0005s\u0000\u0000\u013d"+
+ "\u013e\u0005e\u0000\u0000\u013e\u0140\u0005d\u0000\u0000\u013f\u0127\u0001"+
+ "\u0000\u0000\u0000\u013f\u0133\u0001\u0000\u0000\u0000\u0140(\u0001\u0000"+
+ "\u0000\u0000\u0141\u0142\u0005+\u0000\u0000\u0142*\u0001\u0000\u0000\u0000"+
+ "\u0143\u0144\u0005-\u0000\u0000\u0144,\u0001\u0000\u0000\u0000\u0145\u0146"+
+ "\u0005*\u0000\u0000\u0146.\u0001\u0000\u0000\u0000\u0147\u0148\u0005/"+
+ "\u0000\u0000\u01480\u0001\u0000\u0000\u0000\u0149\u014a\u0005%\u0000\u0000"+
+ "\u014a2\u0001\u0000\u0000\u0000\u014b\u014c\u0005^\u0000\u0000\u014c4"+
+ "\u0001\u0000\u0000\u0000\u014d\u014e\u0005!\u0000\u0000\u014e\u014f\u0005"+
+ "=\u0000\u0000\u014f6\u0001\u0000\u0000\u0000\u0150\u0151\u0005>\u0000"+
+ "\u0000\u01518\u0001\u0000\u0000\u0000\u0152\u0153\u0005>\u0000\u0000\u0153"+
+ "\u0154\u0005=\u0000\u0000\u0154:\u0001\u0000\u0000\u0000\u0155\u0156\u0005"+
+ "<\u0000\u0000\u0156<\u0001\u0000\u0000\u0000\u0157\u0158\u0005<\u0000"+
+ "\u0000\u0158\u0159\u0005=\u0000\u0000\u0159>\u0001\u0000\u0000\u0000\u015a"+
+ "\u015b\u0005=\u0000\u0000\u015b@\u0001\u0000\u0000\u0000\u015c\u015d\u0005"+
+ "(\u0000\u0000\u015dB\u0001\u0000\u0000\u0000\u015e\u015f\u0005)\u0000"+
+ "\u0000\u015fD\u0001\u0000\u0000\u0000\u0160\u0162\u0007\u0000\u0000\u0000"+
+ "\u0161\u0160\u0001\u0000\u0000\u0000\u0162\u0163\u0001\u0000\u0000\u0000"+
+ "\u0163\u0161\u0001\u0000\u0000\u0000\u0163\u0164\u0001\u0000\u0000\u0000"+
+ "\u0164\u0165\u0001\u0000\u0000\u0000\u0165\u0167\u0005.\u0000\u0000\u0166"+
+ "\u0168\u0007\u0000\u0000\u0000\u0167\u0166\u0001\u0000\u0000\u0000\u0168"+
+ "\u0169\u0001\u0000\u0000\u0000\u0169\u0167\u0001\u0000\u0000\u0000\u0169"+
+ "\u016a\u0001\u0000\u0000\u0000\u016aF\u0001\u0000\u0000\u0000\u016b\u016e"+
+ "\u0007\u0000\u0000\u0000\u016c\u016d\u0005.\u0000\u0000\u016d\u016f\u0003"+
+ "I$\u0000\u016e\u016c\u0001\u0000\u0000\u0000\u016f\u0170\u0001\u0000\u0000"+
+ "\u0000\u0170\u016e\u0001\u0000\u0000\u0000\u0170\u0171\u0001\u0000\u0000"+
+ "\u0000\u0171H\u0001\u0000\u0000\u0000\u0172\u0174\u0007\u0000\u0000\u0000"+
+ "\u0173\u0172\u0001\u0000\u0000\u0000\u0174\u0175\u0001\u0000\u0000\u0000"+
+ "\u0175\u0173\u0001\u0000\u0000\u0000\u0175\u0176\u0001\u0000\u0000\u0000"+
+ "\u0176J\u0001\u0000\u0000\u0000\u0177\u0178\u0003_/\u0000\u0178L\u0001"+
+ "\u0000\u0000\u0000\u0179\u017a\u0003a0\u0000\u017aN\u0001\u0000\u0000"+
+ "\u0000\u017b\u017d\u0007\u0001\u0000\u0000\u017c\u017b\u0001\u0000\u0000"+
+ "\u0000\u017d\u017e\u0001\u0000\u0000\u0000\u017e\u017c\u0001\u0000\u0000"+
+ "\u0000\u017e\u017f\u0001\u0000\u0000\u0000\u017f\u0180\u0001\u0000\u0000"+
+ "\u0000\u0180\u0181\u0006\'\u0000\u0000\u0181P\u0001\u0000\u0000\u0000"+
+ "\u0182\u0185\u0003S)\u0000\u0183\u0185\u0003U*\u0000\u0184\u0182\u0001"+
+ "\u0000\u0000\u0000\u0184\u0183\u0001\u0000\u0000\u0000\u0185R\u0001\u0000"+
+ "\u0000\u0000\u0186\u018a\u0005\'\u0000\u0000\u0187\u0189\t\u0000\u0000"+
+ "\u0000\u0188\u0187\u0001\u0000\u0000\u0000\u0189\u018c\u0001\u0000\u0000"+
+ "\u0000\u018a\u018b\u0001\u0000\u0000\u0000\u018a\u0188\u0001\u0000\u0000"+
+ "\u0000\u018b\u018d\u0001\u0000\u0000\u0000\u018c\u018a\u0001\u0000\u0000"+
+ "\u0000\u018d\u018e\u0005\'\u0000\u0000\u018eT\u0001\u0000\u0000\u0000"+
+ "\u018f\u0193\u0005\"\u0000\u0000\u0190\u0192\t\u0000\u0000\u0000\u0191"+
+ "\u0190\u0001\u0000\u0000\u0000\u0192\u0195\u0001\u0000\u0000\u0000\u0193"+
+ "\u0194\u0001\u0000\u0000\u0000\u0193\u0191\u0001\u0000\u0000\u0000\u0194"+
+ "\u0196\u0001\u0000\u0000\u0000\u0195\u0193\u0001\u0000\u0000\u0000\u0196"+
+ "\u0197\u0005\"\u0000\u0000\u0197V\u0001\u0000\u0000\u0000\u0198\u019b"+
+ "\u0003Y,\u0000\u0199\u019b\u0007\u0002\u0000\u0000\u019a\u0198\u0001\u0000"+
+ "\u0000\u0000\u019a\u0199\u0001\u0000\u0000\u0000\u019b\u019c\u0001\u0000"+
+ "\u0000\u0000\u019c\u019a\u0001\u0000\u0000\u0000\u019c\u019d\u0001\u0000"+
+ "\u0000\u0000\u019dX\u0001\u0000\u0000\u0000\u019e\u019f\u0007\u0003\u0000"+
+ "\u0000\u019fZ\u0001\u0000\u0000\u0000\u01a0\u01a4\u0005\'\u0000\u0000"+
+ "\u01a1\u01a3\t\u0000\u0000\u0000\u01a2\u01a1\u0001\u0000\u0000\u0000\u01a3"+
+ "\u01a6\u0001\u0000\u0000\u0000\u01a4\u01a5\u0001\u0000\u0000\u0000\u01a4"+
+ "\u01a2\u0001\u0000\u0000\u0000\u01a5\u01a7\u0001\u0000\u0000\u0000\u01a6"+
+ "\u01a4\u0001\u0000\u0000\u0000\u01a7\u01a8\u0005\'\u0000\u0000\u01a8\\"+
+ "\u0001\u0000\u0000\u0000\u01a9\u01ad\u0005\"\u0000\u0000\u01aa\u01ac\t"+
+ "\u0000\u0000\u0000\u01ab\u01aa\u0001\u0000\u0000\u0000\u01ac\u01af\u0001"+
+ "\u0000\u0000\u0000\u01ad\u01ae\u0001\u0000\u0000\u0000\u01ad\u01ab\u0001"+
+ "\u0000\u0000\u0000\u01ae\u01b0\u0001\u0000\u0000\u0000\u01af\u01ad\u0001"+
+ "\u0000\u0000\u0000\u01b0\u01b1\u0005\"\u0000\u0000\u01b1^\u0001\u0000"+
+ "\u0000\u0000\u01b2\u01b3\u0007\u0000\u0000\u0000\u01b3\u01b4\u0007\u0000"+
+ "\u0000\u0000\u01b4\u01b5\u0007\u0000\u0000\u0000\u01b5\u01b6\u0007\u0000"+
+ "\u0000\u0000\u01b6\u01b7\u0005-\u0000\u0000\u01b7\u01b8\u0007\u0000\u0000"+
+ "\u0000\u01b8\u01b9\u0007\u0000\u0000\u0000\u01b9\u01ba\u0005-\u0000\u0000"+
+ "\u01ba\u01bb\u0007\u0000\u0000\u0000\u01bb\u01bc\u0007\u0000\u0000\u0000"+
+ "\u01bc`\u0001\u0000\u0000\u0000\u01bd\u01be\u0007\u0000\u0000\u0000\u01be"+
+ "\u01bf\u0007\u0000\u0000\u0000\u01bf\u01c0\u0007\u0000\u0000\u0000\u01c0"+
+ "\u01c1\u0007\u0000\u0000\u0000\u01c1\u01c2\u0005-\u0000\u0000\u01c2\u01c3"+
+ "\u0007\u0000\u0000\u0000\u01c3\u01c4\u0007\u0000\u0000\u0000\u01c4\u01c5"+
+ "\u0005-\u0000\u0000\u01c5\u01c6\u0007\u0000\u0000\u0000\u01c6\u01c7\u0007"+
+ "\u0000\u0000\u0000\u01c7\u01c8\u0005 \u0000\u0000\u01c8\u01c9\u0007\u0000"+
+ "\u0000\u0000\u01c9\u01ca\u0007\u0000\u0000\u0000\u01ca\u01cb\u0005:\u0000"+
+ "\u0000\u01cb\u01cc\u0007\u0000\u0000\u0000\u01cc\u01cd\u0007\u0000\u0000"+
+ "\u0000\u01cd\u01ce\u0005:\u0000\u0000\u01ce\u01cf\u0007\u0000\u0000\u0000"+
+ "\u01cf\u01d0\u0007\u0000\u0000\u0000\u01d0b\u0001\u0000\u0000\u0000 \u0000"+
+ "ioy\u0081\u0089\u0093\u009f\u00b9\u00d3\u00db\u00e3\u00eb\u00f3\u00fd"+
+ "\u0107\u0115\u011d\u0125\u013f\u0163\u0169\u0170\u0175\u017e\u0184\u018a"+
+ "\u0193\u019a\u019c\u01a4\u01ad\u0001\u0006\u0000\u0000";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionListener.java b/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionListener.java
index c66abe2..9015db0 100644
--- a/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionListener.java
+++ b/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionListener.java
@@ -1,4 +1,5 @@
-package com.github.sidhant92.boolparser.parser.antlr;// Generated from /Users/sid/Desktop/filter1/BooleanExpression.g4 by ANTLR 4.13.1
+// Generated from /Users/sidhantaggarwal/bool-parser-java/src/main/java/resources/BooleanExpression.g4 by ANTLR 4.13.2
+package com.github.sidhant92.boolparser.parser.antlr;
import org.antlr.v4.runtime.tree.ParseTreeListener;
/**
@@ -16,6 +17,18 @@ public interface BooleanExpressionListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitParse(BooleanExpressionParser.ParseContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code unaryArithmeticExpression}
+ * labeled alternative in {@link BooleanExpressionParser#expression}.
+ * @param ctx the parse tree
+ */
+ void enterUnaryArithmeticExpression(BooleanExpressionParser.UnaryArithmeticExpressionContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code unaryArithmeticExpression}
+ * labeled alternative in {@link BooleanExpressionParser#expression}.
+ * @param ctx the parse tree
+ */
+ void exitUnaryArithmeticExpression(BooleanExpressionParser.UnaryArithmeticExpressionContext ctx);
/**
* Enter a parse tree produced by the {@code binaryExpression}
* labeled alternative in {@link BooleanExpressionParser#expression}.
@@ -76,6 +89,18 @@ public interface BooleanExpressionListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitToExpression(BooleanExpressionParser.ToExpressionContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code arithmeticFunctionExpression}
+ * labeled alternative in {@link BooleanExpressionParser#expression}.
+ * @param ctx the parse tree
+ */
+ void enterArithmeticFunctionExpression(BooleanExpressionParser.ArithmeticFunctionExpressionContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code arithmeticFunctionExpression}
+ * labeled alternative in {@link BooleanExpressionParser#expression}.
+ * @param ctx the parse tree
+ */
+ void exitArithmeticFunctionExpression(BooleanExpressionParser.ArithmeticFunctionExpressionContext ctx);
/**
* Enter a parse tree produced by the {@code notExpression}
* labeled alternative in {@link BooleanExpressionParser#expression}.
@@ -88,6 +113,18 @@ public interface BooleanExpressionListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitNotExpression(BooleanExpressionParser.NotExpressionContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code arithmeticExpression}
+ * labeled alternative in {@link BooleanExpressionParser#expression}.
+ * @param ctx the parse tree
+ */
+ void enterArithmeticExpression(BooleanExpressionParser.ArithmeticExpressionContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code arithmeticExpression}
+ * labeled alternative in {@link BooleanExpressionParser#expression}.
+ * @param ctx the parse tree
+ */
+ void exitArithmeticExpression(BooleanExpressionParser.ArithmeticExpressionContext ctx);
/**
* Enter a parse tree produced by the {@code comparatorExpression}
* labeled alternative in {@link BooleanExpressionParser#expression}.
@@ -122,6 +159,26 @@ public interface BooleanExpressionListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitComparator(BooleanExpressionParser.ComparatorContext ctx);
+ /**
+ * Enter a parse tree produced by {@link BooleanExpressionParser#arithmeticOperator}.
+ * @param ctx the parse tree
+ */
+ void enterArithmeticOperator(BooleanExpressionParser.ArithmeticOperatorContext ctx);
+ /**
+ * Exit a parse tree produced by {@link BooleanExpressionParser#arithmeticOperator}.
+ * @param ctx the parse tree
+ */
+ void exitArithmeticOperator(BooleanExpressionParser.ArithmeticOperatorContext ctx);
+ /**
+ * Enter a parse tree produced by {@link BooleanExpressionParser#arithmeticFunction}.
+ * @param ctx the parse tree
+ */
+ void enterArithmeticFunction(BooleanExpressionParser.ArithmeticFunctionContext ctx);
+ /**
+ * Exit a parse tree produced by {@link BooleanExpressionParser#arithmeticFunction}.
+ * @param ctx the parse tree
+ */
+ void exitArithmeticFunction(BooleanExpressionParser.ArithmeticFunctionContext ctx);
/**
* Enter a parse tree produced by {@link BooleanExpressionParser#wordlist}.
* @param ctx the parse tree
diff --git a/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionParser.java b/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionParser.java
index 21438de..9ce4e3c 100644
--- a/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionParser.java
+++ b/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanExpressionParser.java
@@ -1,4 +1,5 @@
-package com.github.sidhant92.boolparser.parser.antlr;// Generated from /Users/sid/Desktop/filter1/BooleanExpression.g4 by ANTLR 4.13.1
+// Generated from /Users/sidhantaggarwal/bool-parser-java/src/main/java/resources/BooleanExpression.g4 by ANTLR 4.13.2
+package com.github.sidhant92.boolparser.parser.antlr;
import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
import org.antlr.v4.runtime.*;
@@ -8,43 +9,50 @@
import java.util.Iterator;
import java.util.ArrayList;
-@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"})
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"})
public class BooleanExpressionParser extends Parser {
- static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); }
+ static { RuntimeMetaData.checkVersion("4.13.2", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache =
new PredictionContextCache();
public static final int
T__0=1, IN=2, TO=3, AND=4, OR=5, NOT=6, TRUE=7, FALSE=8, CONTAINS_ALL=9,
- CONTAINS_ANY=10, NE=11, GT=12, GE=13, LT=14, LE=15, EQ=16, LPAREN=17,
- RPAREN=18, DECIMAL=19, APP_VERSION=20, INTEGER=21, WS=22, WORD=23, ALPHANUMERIC=24,
- SQ=25, DQ=26;
+ CONTAINS_ANY=10, MIN=11, MAX=12, AVG=13, SUM=14, MEAN=15, MODE=16, MEDIAN=17,
+ LEN=18, INT=19, DAYS_ELAPSED=20, ADD=21, SUBTRACT=22, MULTIPLY=23, DIVIDE=24,
+ MODULUS=25, EXPONENT=26, NE=27, GT=28, GE=29, LT=30, LE=31, EQ=32, LPAREN=33,
+ RPAREN=34, DECIMAL=35, APP_VERSION=36, INTEGER=37, DATE=38, DATETIME=39,
+ WS=40, WORD=41, SQSTR=42, DQSTR=43, FIELD=44, ALPHANUMERIC=45, SQ=46,
+ DQ=47;
public static final int
- RULE_parse = 0, RULE_expression = 1, RULE_comparator = 2, RULE_wordlist = 3,
- RULE_arrayOperators = 4, RULE_numericTypes = 5, RULE_types = 6, RULE_binary = 7,
- RULE_bool = 8;
+ RULE_parse = 0, RULE_expression = 1, RULE_comparator = 2, RULE_arithmeticOperator = 3,
+ RULE_arithmeticFunction = 4, RULE_wordlist = 5, RULE_arrayOperators = 6,
+ RULE_numericTypes = 7, RULE_types = 8, RULE_binary = 9, RULE_bool = 10;
private static String[] makeRuleNames() {
return new String[] {
- "parse", "expression", "comparator", "wordlist", "arrayOperators", "numericTypes",
- "types", "binary", "bool"
+ "parse", "expression", "comparator", "arithmeticOperator", "arithmeticFunction",
+ "wordlist", "arrayOperators", "numericTypes", "types", "binary", "bool"
};
}
public static final String[] ruleNames = makeRuleNames();
private static String[] makeLiteralNames() {
return new String[] {
- null, "','", null, null, null, null, null, null, null, null, null, "'!='",
- "'>'", "'>='", "'<'", "'<='", "'='", "'('", "')'"
+ null, "','", null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, "'+'", "'-'", "'*'",
+ "'/'", "'%'", "'^'", "'!='", "'>'", "'>='", "'<'", "'<='", "'='", "'('",
+ "')'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
private static String[] makeSymbolicNames() {
return new String[] {
null, null, "IN", "TO", "AND", "OR", "NOT", "TRUE", "FALSE", "CONTAINS_ALL",
- "CONTAINS_ANY", "NE", "GT", "GE", "LT", "LE", "EQ", "LPAREN", "RPAREN",
- "DECIMAL", "APP_VERSION", "INTEGER", "WS", "WORD", "ALPHANUMERIC", "SQ",
- "DQ"
+ "CONTAINS_ANY", "MIN", "MAX", "AVG", "SUM", "MEAN", "MODE", "MEDIAN",
+ "LEN", "INT", "DAYS_ELAPSED", "ADD", "SUBTRACT", "MULTIPLY", "DIVIDE",
+ "MODULUS", "EXPONENT", "NE", "GT", "GE", "LT", "LE", "EQ", "LPAREN",
+ "RPAREN", "DECIMAL", "APP_VERSION", "INTEGER", "DATE", "DATETIME", "WS",
+ "WORD", "SQSTR", "DQSTR", "FIELD", "ALPHANUMERIC", "SQ", "DQ"
};
}
private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -124,9 +132,9 @@ public final ParseContext parse() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(18);
+ setState(22);
expression(0);
- setState(19);
+ setState(23);
match(EOF);
}
}
@@ -154,6 +162,24 @@ public void copyFrom(ExpressionContext ctx) {
}
}
@SuppressWarnings("CheckReturnValue")
+ public static class UnaryArithmeticExpressionContext extends ExpressionContext {
+ public Token op;
+ public ExpressionContext exp;
+ public TerminalNode SUBTRACT() { return getToken(BooleanExpressionParser.SUBTRACT, 0); }
+ public ExpressionContext expression() {
+ return getRuleContext(ExpressionContext.class,0);
+ }
+ public UnaryArithmeticExpressionContext(ExpressionContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof BooleanExpressionListener ) ((BooleanExpressionListener)listener).enterUnaryArithmeticExpression(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof BooleanExpressionListener ) ((BooleanExpressionListener)listener).exitUnaryArithmeticExpression(this);
+ }
+ }
+ @SuppressWarnings("CheckReturnValue")
public static class BinaryExpressionContext extends ExpressionContext {
public ExpressionContext left;
public BinaryContext op;
@@ -201,7 +227,7 @@ public static class InExpressionContext extends ExpressionContext {
public WordlistContext wordlist() {
return getRuleContext(WordlistContext.class,0);
}
- public TerminalNode WORD() { return getToken(BooleanExpressionParser.WORD, 0); }
+ public TerminalNode FIELD() { return getToken(BooleanExpressionParser.FIELD, 0); }
public TerminalNode NOT() { return getToken(BooleanExpressionParser.NOT, 0); }
public InExpressionContext(ExpressionContext ctx) { copyFrom(ctx); }
@Override
@@ -224,7 +250,7 @@ public ArrayOperatorsContext arrayOperators() {
public WordlistContext wordlist() {
return getRuleContext(WordlistContext.class,0);
}
- public TerminalNode WORD() { return getToken(BooleanExpressionParser.WORD, 0); }
+ public TerminalNode FIELD() { return getToken(BooleanExpressionParser.FIELD, 0); }
public ArrayExpressionContext(ExpressionContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
@@ -247,7 +273,7 @@ public List numericTypes() {
public NumericTypesContext numericTypes(int i) {
return getRuleContext(NumericTypesContext.class,i);
}
- public TerminalNode WORD() { return getToken(BooleanExpressionParser.WORD, 0); }
+ public TerminalNode FIELD() { return getToken(BooleanExpressionParser.FIELD, 0); }
public ToExpressionContext(ExpressionContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
@@ -259,6 +285,26 @@ public void exitRule(ParseTreeListener listener) {
}
}
@SuppressWarnings("CheckReturnValue")
+ public static class ArithmeticFunctionExpressionContext extends ExpressionContext {
+ public ArithmeticFunctionContext left;
+ public WordlistContext data;
+ public ArithmeticFunctionContext arithmeticFunction() {
+ return getRuleContext(ArithmeticFunctionContext.class,0);
+ }
+ public WordlistContext wordlist() {
+ return getRuleContext(WordlistContext.class,0);
+ }
+ public ArithmeticFunctionExpressionContext(ExpressionContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof BooleanExpressionListener ) ((BooleanExpressionListener)listener).enterArithmeticFunctionExpression(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof BooleanExpressionListener ) ((BooleanExpressionListener)listener).exitArithmeticFunctionExpression(this);
+ }
+ }
+ @SuppressWarnings("CheckReturnValue")
public static class NotExpressionContext extends ExpressionContext {
public TerminalNode NOT() { return getToken(BooleanExpressionParser.NOT, 0); }
public ExpressionContext expression() {
@@ -275,6 +321,33 @@ public void exitRule(ParseTreeListener listener) {
}
}
@SuppressWarnings("CheckReturnValue")
+ public static class ArithmeticExpressionContext extends ExpressionContext {
+ public ExpressionContext left;
+ public Token op;
+ public ExpressionContext right;
+ public List expression() {
+ return getRuleContexts(ExpressionContext.class);
+ }
+ public ExpressionContext expression(int i) {
+ return getRuleContext(ExpressionContext.class,i);
+ }
+ public TerminalNode EXPONENT() { return getToken(BooleanExpressionParser.EXPONENT, 0); }
+ public TerminalNode DIVIDE() { return getToken(BooleanExpressionParser.DIVIDE, 0); }
+ public TerminalNode MULTIPLY() { return getToken(BooleanExpressionParser.MULTIPLY, 0); }
+ public TerminalNode MODULUS() { return getToken(BooleanExpressionParser.MODULUS, 0); }
+ public TerminalNode ADD() { return getToken(BooleanExpressionParser.ADD, 0); }
+ public TerminalNode SUBTRACT() { return getToken(BooleanExpressionParser.SUBTRACT, 0); }
+ public ArithmeticExpressionContext(ExpressionContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof BooleanExpressionListener ) ((BooleanExpressionListener)listener).enterArithmeticExpression(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof BooleanExpressionListener ) ((BooleanExpressionListener)listener).exitArithmeticExpression(this);
+ }
+ }
+ @SuppressWarnings("CheckReturnValue")
public static class ComparatorExpressionContext extends ExpressionContext {
public ExpressionContext left;
public ComparatorContext op;
@@ -332,20 +405,20 @@ private ExpressionContext expression(int _p) throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(50);
+ setState(53);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) {
case 1:
{
_localctx = new ParentExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(22);
+ setState(26);
match(LPAREN);
- setState(23);
+ setState(27);
expression(0);
- setState(24);
+ setState(28);
match(RPAREN);
}
break;
@@ -354,141 +427,223 @@ private ExpressionContext expression(int _p) throws RecognitionException {
_localctx = new NotExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(26);
+ setState(30);
match(NOT);
- setState(27);
- expression(7);
+ setState(31);
+ expression(15);
}
break;
case 3:
+ {
+ _localctx = new UnaryArithmeticExpressionContext(_localctx);
+ _ctx = _localctx;
+ _prevctx = _localctx;
+ setState(32);
+ ((UnaryArithmeticExpressionContext)_localctx).op = match(SUBTRACT);
+ setState(33);
+ ((UnaryArithmeticExpressionContext)_localctx).exp = expression(13);
+ }
+ break;
+ case 4:
+ {
+ _localctx = new ArithmeticFunctionExpressionContext(_localctx);
+ _ctx = _localctx;
+ _prevctx = _localctx;
+ setState(34);
+ ((ArithmeticFunctionExpressionContext)_localctx).left = arithmeticFunction();
+ setState(35);
+ ((ArithmeticFunctionExpressionContext)_localctx).data = wordlist();
+ }
+ break;
+ case 5:
{
_localctx = new TypesExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(28);
+ setState(37);
types();
}
break;
- case 4:
+ case 6:
{
_localctx = new ToExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(30);
- _errHandler.sync(this);
- _la = _input.LA(1);
- if (_la==WORD) {
- {
- setState(29);
- ((ToExpressionContext)_localctx).field = match(WORD);
- }
+ {
+ setState(38);
+ ((ToExpressionContext)_localctx).field = match(FIELD);
}
-
- setState(32);
+ setState(39);
((ToExpressionContext)_localctx).lower = numericTypes();
- setState(33);
+ setState(40);
match(TO);
- setState(34);
+ setState(41);
((ToExpressionContext)_localctx).upper = numericTypes();
}
break;
- case 5:
+ case 7:
{
_localctx = new InExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(37);
- _errHandler.sync(this);
- _la = _input.LA(1);
- if (_la==WORD) {
- {
- setState(36);
- ((InExpressionContext)_localctx).field = match(WORD);
- }
+ {
+ setState(43);
+ ((InExpressionContext)_localctx).field = match(FIELD);
}
-
- setState(40);
+ setState(45);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==NOT) {
{
- setState(39);
+ setState(44);
((InExpressionContext)_localctx).not = match(NOT);
}
}
- setState(42);
+ setState(47);
match(IN);
- setState(43);
+ setState(48);
((InExpressionContext)_localctx).data = wordlist();
}
break;
- case 6:
+ case 8:
{
_localctx = new ArrayExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(45);
- _errHandler.sync(this);
- _la = _input.LA(1);
- if (_la==WORD) {
- {
- setState(44);
- ((ArrayExpressionContext)_localctx).field = match(WORD);
- }
+ {
+ setState(49);
+ ((ArrayExpressionContext)_localctx).field = match(FIELD);
}
-
- setState(47);
+ setState(50);
((ArrayExpressionContext)_localctx).op = arrayOperators();
- setState(48);
+ setState(51);
((ArrayExpressionContext)_localctx).data = wordlist();
}
break;
}
_ctx.stop = _input.LT(-1);
- setState(62);
+ setState(83);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,6,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,3,_ctx);
while ( _alt!=2 && _alt!= ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
- setState(60);
+ setState(81);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) {
case 1:
{
_localctx = new ComparatorExpressionContext(new ExpressionContext(_parentctx, _parentState));
((ComparatorExpressionContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(52);
- if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
- setState(53);
+ setState(55);
+ if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)");
+ setState(56);
((ComparatorExpressionContext)_localctx).op = comparator();
- setState(54);
- ((ComparatorExpressionContext)_localctx).right = expression(7);
+ setState(57);
+ ((ComparatorExpressionContext)_localctx).right = expression(15);
}
break;
case 2:
+ {
+ _localctx = new ArithmeticExpressionContext(new ExpressionContext(_parentctx, _parentState));
+ ((ArithmeticExpressionContext)_localctx).left = _prevctx;
+ pushNewRecursionContext(_localctx, _startState, RULE_expression);
+ setState(59);
+ if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)");
+ setState(60);
+ ((ArithmeticExpressionContext)_localctx).op = match(EXPONENT);
+ setState(61);
+ ((ArithmeticExpressionContext)_localctx).right = expression(13);
+ }
+ break;
+ case 3:
+ {
+ _localctx = new ArithmeticExpressionContext(new ExpressionContext(_parentctx, _parentState));
+ ((ArithmeticExpressionContext)_localctx).left = _prevctx;
+ pushNewRecursionContext(_localctx, _startState, RULE_expression);
+ setState(62);
+ if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)");
+ setState(63);
+ ((ArithmeticExpressionContext)_localctx).op = match(DIVIDE);
+ setState(64);
+ ((ArithmeticExpressionContext)_localctx).right = expression(12);
+ }
+ break;
+ case 4:
+ {
+ _localctx = new ArithmeticExpressionContext(new ExpressionContext(_parentctx, _parentState));
+ ((ArithmeticExpressionContext)_localctx).left = _prevctx;
+ pushNewRecursionContext(_localctx, _startState, RULE_expression);
+ setState(65);
+ if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
+ setState(66);
+ ((ArithmeticExpressionContext)_localctx).op = match(MULTIPLY);
+ setState(67);
+ ((ArithmeticExpressionContext)_localctx).right = expression(11);
+ }
+ break;
+ case 5:
+ {
+ _localctx = new ArithmeticExpressionContext(new ExpressionContext(_parentctx, _parentState));
+ ((ArithmeticExpressionContext)_localctx).left = _prevctx;
+ pushNewRecursionContext(_localctx, _startState, RULE_expression);
+ setState(68);
+ if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
+ setState(69);
+ ((ArithmeticExpressionContext)_localctx).op = match(MODULUS);
+ setState(70);
+ ((ArithmeticExpressionContext)_localctx).right = expression(10);
+ }
+ break;
+ case 6:
+ {
+ _localctx = new ArithmeticExpressionContext(new ExpressionContext(_parentctx, _parentState));
+ ((ArithmeticExpressionContext)_localctx).left = _prevctx;
+ pushNewRecursionContext(_localctx, _startState, RULE_expression);
+ setState(71);
+ if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
+ setState(72);
+ ((ArithmeticExpressionContext)_localctx).op = match(ADD);
+ setState(73);
+ ((ArithmeticExpressionContext)_localctx).right = expression(9);
+ }
+ break;
+ case 7:
+ {
+ _localctx = new ArithmeticExpressionContext(new ExpressionContext(_parentctx, _parentState));
+ ((ArithmeticExpressionContext)_localctx).left = _prevctx;
+ pushNewRecursionContext(_localctx, _startState, RULE_expression);
+ setState(74);
+ if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
+ setState(75);
+ ((ArithmeticExpressionContext)_localctx).op = match(SUBTRACT);
+ setState(76);
+ ((ArithmeticExpressionContext)_localctx).right = expression(8);
+ }
+ break;
+ case 8:
{
_localctx = new BinaryExpressionContext(new ExpressionContext(_parentctx, _parentState));
((BinaryExpressionContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
- setState(56);
+ setState(77);
if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
- setState(57);
+ setState(78);
((BinaryExpressionContext)_localctx).op = binary();
- setState(58);
+ setState(79);
((BinaryExpressionContext)_localctx).right = expression(6);
}
break;
}
}
}
- setState(64);
+ setState(85);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,6,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,3,_ctx);
}
}
}
@@ -532,9 +687,117 @@ public final ComparatorContext comparator() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(65);
+ setState(86);
+ _la = _input.LA(1);
+ if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 8455716864L) != 0)) ) {
+ _errHandler.recoverInline(this);
+ }
+ else {
+ if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+ _errHandler.reportMatch(this);
+ consume();
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ @SuppressWarnings("CheckReturnValue")
+ public static class ArithmeticOperatorContext extends ParserRuleContext {
+ public TerminalNode MULTIPLY() { return getToken(BooleanExpressionParser.MULTIPLY, 0); }
+ public TerminalNode DIVIDE() { return getToken(BooleanExpressionParser.DIVIDE, 0); }
+ public TerminalNode ADD() { return getToken(BooleanExpressionParser.ADD, 0); }
+ public TerminalNode SUBTRACT() { return getToken(BooleanExpressionParser.SUBTRACT, 0); }
+ public TerminalNode MODULUS() { return getToken(BooleanExpressionParser.MODULUS, 0); }
+ public TerminalNode EXPONENT() { return getToken(BooleanExpressionParser.EXPONENT, 0); }
+ public ArithmeticOperatorContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_arithmeticOperator; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof BooleanExpressionListener ) ((BooleanExpressionListener)listener).enterArithmeticOperator(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof BooleanExpressionListener ) ((BooleanExpressionListener)listener).exitArithmeticOperator(this);
+ }
+ }
+
+ public final ArithmeticOperatorContext arithmeticOperator() throws RecognitionException {
+ ArithmeticOperatorContext _localctx = new ArithmeticOperatorContext(_ctx, getState());
+ enterRule(_localctx, 6, RULE_arithmeticOperator);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(88);
_la = _input.LA(1);
- if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 129024L) != 0)) ) {
+ if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 132120576L) != 0)) ) {
+ _errHandler.recoverInline(this);
+ }
+ else {
+ if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+ _errHandler.reportMatch(this);
+ consume();
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ @SuppressWarnings("CheckReturnValue")
+ public static class ArithmeticFunctionContext extends ParserRuleContext {
+ public TerminalNode MIN() { return getToken(BooleanExpressionParser.MIN, 0); }
+ public TerminalNode MAX() { return getToken(BooleanExpressionParser.MAX, 0); }
+ public TerminalNode SUM() { return getToken(BooleanExpressionParser.SUM, 0); }
+ public TerminalNode AVG() { return getToken(BooleanExpressionParser.AVG, 0); }
+ public TerminalNode MEAN() { return getToken(BooleanExpressionParser.MEAN, 0); }
+ public TerminalNode MODE() { return getToken(BooleanExpressionParser.MODE, 0); }
+ public TerminalNode LEN() { return getToken(BooleanExpressionParser.LEN, 0); }
+ public TerminalNode MEDIAN() { return getToken(BooleanExpressionParser.MEDIAN, 0); }
+ public TerminalNode INT() { return getToken(BooleanExpressionParser.INT, 0); }
+ public TerminalNode DAYS_ELAPSED() { return getToken(BooleanExpressionParser.DAYS_ELAPSED, 0); }
+ public ArithmeticFunctionContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_arithmeticFunction; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof BooleanExpressionListener ) ((BooleanExpressionListener)listener).enterArithmeticFunction(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof BooleanExpressionListener ) ((BooleanExpressionListener)listener).exitArithmeticFunction(this);
+ }
+ }
+
+ public final ArithmeticFunctionContext arithmeticFunction() throws RecognitionException {
+ ArithmeticFunctionContext _localctx = new ArithmeticFunctionContext(_ctx, getState());
+ enterRule(_localctx, 8, RULE_arithmeticFunction);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(90);
+ _la = _input.LA(1);
+ if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 2095104L) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@@ -557,15 +820,15 @@ public final ComparatorContext comparator() throws RecognitionException {
@SuppressWarnings("CheckReturnValue")
public static class WordlistContext extends ParserRuleContext {
- public TypesContext first;
- public TypesContext rest;
+ public ExpressionContext first;
+ public ExpressionContext rest;
public TerminalNode LPAREN() { return getToken(BooleanExpressionParser.LPAREN, 0); }
public TerminalNode RPAREN() { return getToken(BooleanExpressionParser.RPAREN, 0); }
- public List types() {
- return getRuleContexts(TypesContext.class);
+ public List expression() {
+ return getRuleContexts(ExpressionContext.class);
}
- public TypesContext types(int i) {
- return getRuleContext(TypesContext.class,i);
+ public ExpressionContext expression(int i) {
+ return getRuleContext(ExpressionContext.class,i);
}
public List WS() { return getTokens(BooleanExpressionParser.WS); }
public TerminalNode WS(int i) {
@@ -587,93 +850,93 @@ public void exitRule(ParseTreeListener listener) {
public final WordlistContext wordlist() throws RecognitionException {
WordlistContext _localctx = new WordlistContext(_ctx, getState());
- enterRule(_localctx, 6, RULE_wordlist);
+ enterRule(_localctx, 10, RULE_wordlist);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(67);
+ setState(92);
match(LPAREN);
- setState(71);
+ setState(96);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,7,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,4,_ctx);
while ( _alt!=2 && _alt!= ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(68);
+ setState(93);
match(WS);
}
}
}
- setState(73);
+ setState(98);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,7,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,4,_ctx);
}
- setState(74);
- ((WordlistContext)_localctx).first = types();
- setState(78);
+ setState(99);
+ ((WordlistContext)_localctx).first = expression(0);
+ setState(103);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==WS) {
{
{
- setState(75);
+ setState(100);
match(WS);
}
}
- setState(80);
+ setState(105);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(97);
+ setState(122);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__0) {
{
{
- setState(81);
+ setState(106);
match(T__0);
- setState(85);
+ setState(110);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,9,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,6,_ctx);
while ( _alt!=2 && _alt!= ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(82);
+ setState(107);
match(WS);
}
}
}
- setState(87);
+ setState(112);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,9,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,6,_ctx);
}
- setState(88);
- ((WordlistContext)_localctx).rest = types();
- setState(92);
+ setState(113);
+ ((WordlistContext)_localctx).rest = expression(0);
+ setState(117);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==WS) {
{
{
- setState(89);
+ setState(114);
match(WS);
}
}
- setState(94);
+ setState(119);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
- setState(99);
+ setState(124);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(100);
+ setState(125);
match(RPAREN);
}
}
@@ -708,12 +971,12 @@ public void exitRule(ParseTreeListener listener) {
public final ArrayOperatorsContext arrayOperators() throws RecognitionException {
ArrayOperatorsContext _localctx = new ArrayOperatorsContext(_ctx, getState());
- enterRule(_localctx, 8, RULE_arrayOperators);
+ enterRule(_localctx, 12, RULE_arrayOperators);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(102);
+ setState(127);
_la = _input.LA(1);
if ( !(_la==CONTAINS_ALL || _la==CONTAINS_ANY) ) {
_errHandler.recoverInline(this);
@@ -756,12 +1019,12 @@ public void exitRule(ParseTreeListener listener) {
public final NumericTypesContext numericTypes() throws RecognitionException {
NumericTypesContext _localctx = new NumericTypesContext(_ctx, getState());
- enterRule(_localctx, 10, RULE_numericTypes);
+ enterRule(_localctx, 14, RULE_numericTypes);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(104);
+ setState(129);
_la = _input.LA(1);
if ( !(_la==DECIMAL || _la==INTEGER) ) {
_errHandler.recoverInline(this);
@@ -793,6 +1056,9 @@ public BoolContext bool() {
return getRuleContext(BoolContext.class,0);
}
public TerminalNode WORD() { return getToken(BooleanExpressionParser.WORD, 0); }
+ public TerminalNode FIELD() { return getToken(BooleanExpressionParser.FIELD, 0); }
+ public TerminalNode DATE() { return getToken(BooleanExpressionParser.DATE, 0); }
+ public TerminalNode DATETIME() { return getToken(BooleanExpressionParser.DATETIME, 0); }
public TypesContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@@ -809,49 +1075,70 @@ public void exitRule(ParseTreeListener listener) {
public final TypesContext types() throws RecognitionException {
TypesContext _localctx = new TypesContext(_ctx, getState());
- enterRule(_localctx, 12, RULE_types);
+ enterRule(_localctx, 16, RULE_types);
try {
- setState(112);
+ setState(140);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(106);
+ setState(131);
match(INTEGER);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(107);
+ setState(132);
match(DECIMAL);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(108);
+ setState(133);
match(APP_VERSION);
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(109);
+ setState(134);
bool();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(110);
+ setState(135);
match(WORD);
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
+ setState(136);
+ match(FIELD);
+ }
+ break;
+ case 7:
+ enterOuterAlt(_localctx, 7);
+ {
+ setState(137);
+ match(DATE);
+ }
+ break;
+ case 8:
+ enterOuterAlt(_localctx, 8);
+ {
+ setState(138);
+ match(DATETIME);
+ }
+ break;
+ case 9:
+ enterOuterAlt(_localctx, 9);
+ {
}
break;
}
@@ -887,12 +1174,12 @@ public void exitRule(ParseTreeListener listener) {
public final BinaryContext binary() throws RecognitionException {
BinaryContext _localctx = new BinaryContext(_ctx, getState());
- enterRule(_localctx, 14, RULE_binary);
+ enterRule(_localctx, 18, RULE_binary);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(114);
+ setState(142);
_la = _input.LA(1);
if ( !(_la==AND || _la==OR) ) {
_errHandler.recoverInline(this);
@@ -935,12 +1222,12 @@ public void exitRule(ParseTreeListener listener) {
public final BoolContext bool() throws RecognitionException {
BoolContext _localctx = new BoolContext(_ctx, getState());
- enterRule(_localctx, 16, RULE_bool);
+ enterRule(_localctx, 20, RULE_bool);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(116);
+ setState(144);
_la = _input.LA(1);
if ( !(_la==TRUE || _la==FALSE) ) {
_errHandler.recoverInline(this);
@@ -973,86 +1260,116 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
private boolean expression_sempred(ExpressionContext _localctx, int predIndex) {
switch (predIndex) {
case 0:
- return precpred(_ctx, 6);
+ return precpred(_ctx, 14);
case 1:
+ return precpred(_ctx, 12);
+ case 2:
+ return precpred(_ctx, 11);
+ case 3:
+ return precpred(_ctx, 10);
+ case 4:
+ return precpred(_ctx, 9);
+ case 5:
+ return precpred(_ctx, 8);
+ case 6:
+ return precpred(_ctx, 7);
+ case 7:
return precpred(_ctx, 5);
}
return true;
}
public static final String _serializedATN =
- "\u0004\u0001\u001aw\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+
+ "\u0004\u0001/\u0093\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+
"\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+
"\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+
- "\b\u0007\b\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001"+
+ "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0001\u0000\u0001\u0000\u0001"+
+ "\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
+ "\u0001\u0001\u0001\u0001\u0001\u0003\u0001.\b\u0001\u0001\u0001\u0001"+
+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u00016\b"+
+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
- "\u0001\u0001\u0003\u0001\u001f\b\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
- "\u0001\u0001\u0001\u0001\u0003\u0001&\b\u0001\u0001\u0001\u0003\u0001"+
- ")\b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001.\b\u0001\u0001"+
- "\u0001\u0001\u0001\u0001\u0001\u0003\u00013\b\u0001\u0001\u0001\u0001"+
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
- "\u0001\u0005\u0001=\b\u0001\n\u0001\f\u0001@\t\u0001\u0001\u0002\u0001"+
- "\u0002\u0001\u0003\u0001\u0003\u0005\u0003F\b\u0003\n\u0003\f\u0003I\t"+
- "\u0003\u0001\u0003\u0001\u0003\u0005\u0003M\b\u0003\n\u0003\f\u0003P\t"+
- "\u0003\u0001\u0003\u0001\u0003\u0005\u0003T\b\u0003\n\u0003\f\u0003W\t"+
- "\u0003\u0001\u0003\u0001\u0003\u0005\u0003[\b\u0003\n\u0003\f\u0003^\t"+
- "\u0003\u0005\u0003`\b\u0003\n\u0003\f\u0003c\t\u0003\u0001\u0003\u0001"+
- "\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0006\u0001"+
- "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003\u0006q\b"+
- "\u0006\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0000\u0001\u0002"+
- "\t\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0000\u0005\u0001\u0000\u000b"+
- "\u0010\u0001\u0000\t\n\u0002\u0000\u0013\u0013\u0015\u0015\u0001\u0000"+
- "\u0004\u0005\u0001\u0000\u0007\b\u0082\u0000\u0012\u0001\u0000\u0000\u0000"+
- "\u00022\u0001\u0000\u0000\u0000\u0004A\u0001\u0000\u0000\u0000\u0006C"+
- "\u0001\u0000\u0000\u0000\bf\u0001\u0000\u0000\u0000\nh\u0001\u0000\u0000"+
- "\u0000\fp\u0001\u0000\u0000\u0000\u000er\u0001\u0000\u0000\u0000\u0010"+
- "t\u0001\u0000\u0000\u0000\u0012\u0013\u0003\u0002\u0001\u0000\u0013\u0014"+
- "\u0005\u0000\u0000\u0001\u0014\u0001\u0001\u0000\u0000\u0000\u0015\u0016"+
- "\u0006\u0001\uffff\uffff\u0000\u0016\u0017\u0005\u0011\u0000\u0000\u0017"+
- "\u0018\u0003\u0002\u0001\u0000\u0018\u0019\u0005\u0012\u0000\u0000\u0019"+
- "3\u0001\u0000\u0000\u0000\u001a\u001b\u0005\u0006\u0000\u0000\u001b3\u0003"+
- "\u0002\u0001\u0007\u001c3\u0003\f\u0006\u0000\u001d\u001f\u0005\u0017"+
- "\u0000\u0000\u001e\u001d\u0001\u0000\u0000\u0000\u001e\u001f\u0001\u0000"+
- "\u0000\u0000\u001f \u0001\u0000\u0000\u0000 !\u0003\n\u0005\u0000!\"\u0005"+
- "\u0003\u0000\u0000\"#\u0003\n\u0005\u0000#3\u0001\u0000\u0000\u0000$&"+
- "\u0005\u0017\u0000\u0000%$\u0001\u0000\u0000\u0000%&\u0001\u0000\u0000"+
- "\u0000&(\u0001\u0000\u0000\u0000\')\u0005\u0006\u0000\u0000(\'\u0001\u0000"+
- "\u0000\u0000()\u0001\u0000\u0000\u0000)*\u0001\u0000\u0000\u0000*+\u0005"+
- "\u0002\u0000\u0000+3\u0003\u0006\u0003\u0000,.\u0005\u0017\u0000\u0000"+
- "-,\u0001\u0000\u0000\u0000-.\u0001\u0000\u0000\u0000./\u0001\u0000\u0000"+
- "\u0000/0\u0003\b\u0004\u000001\u0003\u0006\u0003\u000013\u0001\u0000\u0000"+
- "\u00002\u0015\u0001\u0000\u0000\u00002\u001a\u0001\u0000\u0000\u00002"+
- "\u001c\u0001\u0000\u0000\u00002\u001e\u0001\u0000\u0000\u00002%\u0001"+
- "\u0000\u0000\u00002-\u0001\u0000\u0000\u00003>\u0001\u0000\u0000\u0000"+
- "45\n\u0006\u0000\u000056\u0003\u0004\u0002\u000067\u0003\u0002\u0001\u0007"+
- "7=\u0001\u0000\u0000\u000089\n\u0005\u0000\u00009:\u0003\u000e\u0007\u0000"+
- ":;\u0003\u0002\u0001\u0006;=\u0001\u0000\u0000\u0000<4\u0001\u0000\u0000"+
- "\u0000<8\u0001\u0000\u0000\u0000=@\u0001\u0000\u0000\u0000><\u0001\u0000"+
- "\u0000\u0000>?\u0001\u0000\u0000\u0000?\u0003\u0001\u0000\u0000\u0000"+
- "@>\u0001\u0000\u0000\u0000AB\u0007\u0000\u0000\u0000B\u0005\u0001\u0000"+
- "\u0000\u0000CG\u0005\u0011\u0000\u0000DF\u0005\u0016\u0000\u0000ED\u0001"+
- "\u0000\u0000\u0000FI\u0001\u0000\u0000\u0000GE\u0001\u0000\u0000\u0000"+
- "GH\u0001\u0000\u0000\u0000HJ\u0001\u0000\u0000\u0000IG\u0001\u0000\u0000"+
- "\u0000JN\u0003\f\u0006\u0000KM\u0005\u0016\u0000\u0000LK\u0001\u0000\u0000"+
- "\u0000MP\u0001\u0000\u0000\u0000NL\u0001\u0000\u0000\u0000NO\u0001\u0000"+
- "\u0000\u0000Oa\u0001\u0000\u0000\u0000PN\u0001\u0000\u0000\u0000QU\u0005"+
- "\u0001\u0000\u0000RT\u0005\u0016\u0000\u0000SR\u0001\u0000\u0000\u0000"+
- "TW\u0001\u0000\u0000\u0000US\u0001\u0000\u0000\u0000UV\u0001\u0000\u0000"+
- "\u0000VX\u0001\u0000\u0000\u0000WU\u0001\u0000\u0000\u0000X\\\u0003\f"+
- "\u0006\u0000Y[\u0005\u0016\u0000\u0000ZY\u0001\u0000\u0000\u0000[^\u0001"+
- "\u0000\u0000\u0000\\Z\u0001\u0000\u0000\u0000\\]\u0001\u0000\u0000\u0000"+
- "]`\u0001\u0000\u0000\u0000^\\\u0001\u0000\u0000\u0000_Q\u0001\u0000\u0000"+
- "\u0000`c\u0001\u0000\u0000\u0000a_\u0001\u0000\u0000\u0000ab\u0001\u0000"+
- "\u0000\u0000bd\u0001\u0000\u0000\u0000ca\u0001\u0000\u0000\u0000de\u0005"+
- "\u0012\u0000\u0000e\u0007\u0001\u0000\u0000\u0000fg\u0007\u0001\u0000"+
- "\u0000g\t\u0001\u0000\u0000\u0000hi\u0007\u0002\u0000\u0000i\u000b\u0001"+
- "\u0000\u0000\u0000jq\u0005\u0015\u0000\u0000kq\u0005\u0013\u0000\u0000"+
- "lq\u0005\u0014\u0000\u0000mq\u0003\u0010\b\u0000nq\u0005\u0017\u0000\u0000"+
- "oq\u0001\u0000\u0000\u0000pj\u0001\u0000\u0000\u0000pk\u0001\u0000\u0000"+
- "\u0000pl\u0001\u0000\u0000\u0000pm\u0001\u0000\u0000\u0000pn\u0001\u0000"+
- "\u0000\u0000po\u0001\u0000\u0000\u0000q\r\u0001\u0000\u0000\u0000rs\u0007"+
- "\u0003\u0000\u0000s\u000f\u0001\u0000\u0000\u0000tu\u0007\u0004\u0000"+
- "\u0000u\u0011\u0001\u0000\u0000\u0000\r\u001e%(-2<>GNU\\ap";
+ "\u0001\u0001\u0001\u0001\u0001\u0005\u0001R\b\u0001\n\u0001\f\u0001U\t"+
+ "\u0001\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0004\u0001"+
+ "\u0004\u0001\u0005\u0001\u0005\u0005\u0005_\b\u0005\n\u0005\f\u0005b\t"+
+ "\u0005\u0001\u0005\u0001\u0005\u0005\u0005f\b\u0005\n\u0005\f\u0005i\t"+
+ "\u0005\u0001\u0005\u0001\u0005\u0005\u0005m\b\u0005\n\u0005\f\u0005p\t"+
+ "\u0005\u0001\u0005\u0001\u0005\u0005\u0005t\b\u0005\n\u0005\f\u0005w\t"+
+ "\u0005\u0005\u0005y\b\u0005\n\u0005\f\u0005|\t\u0005\u0001\u0005\u0001"+
+ "\u0005\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\b\u0001\b"+
+ "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003\b\u008d"+
+ "\b\b\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0000\u0001\u0002\u000b\u0000"+
+ "\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0000\u0007\u0001\u0000"+
+ "\u001b \u0001\u0000\u0015\u001a\u0001\u0000\u000b\u0014\u0001\u0000\t"+
+ "\n\u0002\u0000##%%\u0001\u0000\u0004\u0005\u0001\u0000\u0007\b\u00a4\u0000"+
+ "\u0016\u0001\u0000\u0000\u0000\u00025\u0001\u0000\u0000\u0000\u0004V\u0001"+
+ "\u0000\u0000\u0000\u0006X\u0001\u0000\u0000\u0000\bZ\u0001\u0000\u0000"+
+ "\u0000\n\\\u0001\u0000\u0000\u0000\f\u007f\u0001\u0000\u0000\u0000\u000e"+
+ "\u0081\u0001\u0000\u0000\u0000\u0010\u008c\u0001\u0000\u0000\u0000\u0012"+
+ "\u008e\u0001\u0000\u0000\u0000\u0014\u0090\u0001\u0000\u0000\u0000\u0016"+
+ "\u0017\u0003\u0002\u0001\u0000\u0017\u0018\u0005\u0000\u0000\u0001\u0018"+
+ "\u0001\u0001\u0000\u0000\u0000\u0019\u001a\u0006\u0001\uffff\uffff\u0000"+
+ "\u001a\u001b\u0005!\u0000\u0000\u001b\u001c\u0003\u0002\u0001\u0000\u001c"+
+ "\u001d\u0005\"\u0000\u0000\u001d6\u0001\u0000\u0000\u0000\u001e\u001f"+
+ "\u0005\u0006\u0000\u0000\u001f6\u0003\u0002\u0001\u000f !\u0005\u0016"+
+ "\u0000\u0000!6\u0003\u0002\u0001\r\"#\u0003\b\u0004\u0000#$\u0003\n\u0005"+
+ "\u0000$6\u0001\u0000\u0000\u0000%6\u0003\u0010\b\u0000&\'\u0005,\u0000"+
+ "\u0000\'(\u0003\u000e\u0007\u0000()\u0005\u0003\u0000\u0000)*\u0003\u000e"+
+ "\u0007\u0000*6\u0001\u0000\u0000\u0000+-\u0005,\u0000\u0000,.\u0005\u0006"+
+ "\u0000\u0000-,\u0001\u0000\u0000\u0000-.\u0001\u0000\u0000\u0000./\u0001"+
+ "\u0000\u0000\u0000/0\u0005\u0002\u0000\u000006\u0003\n\u0005\u000012\u0005"+
+ ",\u0000\u000023\u0003\f\u0006\u000034\u0003\n\u0005\u000046\u0001\u0000"+
+ "\u0000\u00005\u0019\u0001\u0000\u0000\u00005\u001e\u0001\u0000\u0000\u0000"+
+ "5 \u0001\u0000\u0000\u00005\"\u0001\u0000\u0000\u00005%\u0001\u0000\u0000"+
+ "\u00005&\u0001\u0000\u0000\u00005+\u0001\u0000\u0000\u000051\u0001\u0000"+
+ "\u0000\u00006S\u0001\u0000\u0000\u000078\n\u000e\u0000\u000089\u0003\u0004"+
+ "\u0002\u00009:\u0003\u0002\u0001\u000f:R\u0001\u0000\u0000\u0000;<\n\f"+
+ "\u0000\u0000<=\u0005\u001a\u0000\u0000=R\u0003\u0002\u0001\r>?\n\u000b"+
+ "\u0000\u0000?@\u0005\u0018\u0000\u0000@R\u0003\u0002\u0001\fAB\n\n\u0000"+
+ "\u0000BC\u0005\u0017\u0000\u0000CR\u0003\u0002\u0001\u000bDE\n\t\u0000"+
+ "\u0000EF\u0005\u0019\u0000\u0000FR\u0003\u0002\u0001\nGH\n\b\u0000\u0000"+
+ "HI\u0005\u0015\u0000\u0000IR\u0003\u0002\u0001\tJK\n\u0007\u0000\u0000"+
+ "KL\u0005\u0016\u0000\u0000LR\u0003\u0002\u0001\bMN\n\u0005\u0000\u0000"+
+ "NO\u0003\u0012\t\u0000OP\u0003\u0002\u0001\u0006PR\u0001\u0000\u0000\u0000"+
+ "Q7\u0001\u0000\u0000\u0000Q;\u0001\u0000\u0000\u0000Q>\u0001\u0000\u0000"+
+ "\u0000QA\u0001\u0000\u0000\u0000QD\u0001\u0000\u0000\u0000QG\u0001\u0000"+
+ "\u0000\u0000QJ\u0001\u0000\u0000\u0000QM\u0001\u0000\u0000\u0000RU\u0001"+
+ "\u0000\u0000\u0000SQ\u0001\u0000\u0000\u0000ST\u0001\u0000\u0000\u0000"+
+ "T\u0003\u0001\u0000\u0000\u0000US\u0001\u0000\u0000\u0000VW\u0007\u0000"+
+ "\u0000\u0000W\u0005\u0001\u0000\u0000\u0000XY\u0007\u0001\u0000\u0000"+
+ "Y\u0007\u0001\u0000\u0000\u0000Z[\u0007\u0002\u0000\u0000[\t\u0001\u0000"+
+ "\u0000\u0000\\`\u0005!\u0000\u0000]_\u0005(\u0000\u0000^]\u0001\u0000"+
+ "\u0000\u0000_b\u0001\u0000\u0000\u0000`^\u0001\u0000\u0000\u0000`a\u0001"+
+ "\u0000\u0000\u0000ac\u0001\u0000\u0000\u0000b`\u0001\u0000\u0000\u0000"+
+ "cg\u0003\u0002\u0001\u0000df\u0005(\u0000\u0000ed\u0001\u0000\u0000\u0000"+
+ "fi\u0001\u0000\u0000\u0000ge\u0001\u0000\u0000\u0000gh\u0001\u0000\u0000"+
+ "\u0000hz\u0001\u0000\u0000\u0000ig\u0001\u0000\u0000\u0000jn\u0005\u0001"+
+ "\u0000\u0000km\u0005(\u0000\u0000lk\u0001\u0000\u0000\u0000mp\u0001\u0000"+
+ "\u0000\u0000nl\u0001\u0000\u0000\u0000no\u0001\u0000\u0000\u0000oq\u0001"+
+ "\u0000\u0000\u0000pn\u0001\u0000\u0000\u0000qu\u0003\u0002\u0001\u0000"+
+ "rt\u0005(\u0000\u0000sr\u0001\u0000\u0000\u0000tw\u0001\u0000\u0000\u0000"+
+ "us\u0001\u0000\u0000\u0000uv\u0001\u0000\u0000\u0000vy\u0001\u0000\u0000"+
+ "\u0000wu\u0001\u0000\u0000\u0000xj\u0001\u0000\u0000\u0000y|\u0001\u0000"+
+ "\u0000\u0000zx\u0001\u0000\u0000\u0000z{\u0001\u0000\u0000\u0000{}\u0001"+
+ "\u0000\u0000\u0000|z\u0001\u0000\u0000\u0000}~\u0005\"\u0000\u0000~\u000b"+
+ "\u0001\u0000\u0000\u0000\u007f\u0080\u0007\u0003\u0000\u0000\u0080\r\u0001"+
+ "\u0000\u0000\u0000\u0081\u0082\u0007\u0004\u0000\u0000\u0082\u000f\u0001"+
+ "\u0000\u0000\u0000\u0083\u008d\u0005%\u0000\u0000\u0084\u008d\u0005#\u0000"+
+ "\u0000\u0085\u008d\u0005$\u0000\u0000\u0086\u008d\u0003\u0014\n\u0000"+
+ "\u0087\u008d\u0005)\u0000\u0000\u0088\u008d\u0005,\u0000\u0000\u0089\u008d"+
+ "\u0005&\u0000\u0000\u008a\u008d\u0005\'\u0000\u0000\u008b\u008d\u0001"+
+ "\u0000\u0000\u0000\u008c\u0083\u0001\u0000\u0000\u0000\u008c\u0084\u0001"+
+ "\u0000\u0000\u0000\u008c\u0085\u0001\u0000\u0000\u0000\u008c\u0086\u0001"+
+ "\u0000\u0000\u0000\u008c\u0087\u0001\u0000\u0000\u0000\u008c\u0088\u0001"+
+ "\u0000\u0000\u0000\u008c\u0089\u0001\u0000\u0000\u0000\u008c\u008a\u0001"+
+ "\u0000\u0000\u0000\u008c\u008b\u0001\u0000\u0000\u0000\u008d\u0011\u0001"+
+ "\u0000\u0000\u0000\u008e\u008f\u0007\u0005\u0000\u0000\u008f\u0013\u0001"+
+ "\u0000\u0000\u0000\u0090\u0091\u0007\u0006\u0000\u0000\u0091\u0015\u0001"+
+ "\u0000\u0000\u0000\n-5QS`gnuz\u008c";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanFilterListener.java b/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanFilterListener.java
index 4e7f7d0..92c3423 100644
--- a/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanFilterListener.java
+++ b/src/main/java/com/github/sidhant92/boolparser/parser/antlr/BooleanFilterListener.java
@@ -4,25 +4,28 @@
import java.util.Objects;
import java.util.Stack;
import java.util.stream.Collectors;
+import org.antlr.v4.runtime.CommonToken;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.ParseTree;
+import org.antlr.v4.runtime.tree.TerminalNodeImpl;
import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.Pair;
+import com.github.sidhant92.boolparser.constant.FunctionType;
import com.github.sidhant92.boolparser.constant.DataType;
import com.github.sidhant92.boolparser.constant.LogicalOperationType;
import com.github.sidhant92.boolparser.constant.Operator;
-import com.github.sidhant92.boolparser.domain.ArrayNode;
-import com.github.sidhant92.boolparser.domain.BooleanNode;
-import com.github.sidhant92.boolparser.domain.InNode;
-import com.github.sidhant92.boolparser.domain.Node;
-import com.github.sidhant92.boolparser.domain.NumericRangeNode;
-import com.github.sidhant92.boolparser.domain.ComparisonNode;
-import com.github.sidhant92.boolparser.domain.UnaryNode;
+import com.github.sidhant92.boolparser.domain.FieldNode;
+import com.github.sidhant92.boolparser.domain.arithmetic.ArithmeticFunctionNode;
+import com.github.sidhant92.boolparser.domain.arithmetic.ArithmeticNode;
+import com.github.sidhant92.boolparser.domain.logical.ArrayNode;
+import com.github.sidhant92.boolparser.domain.logical.BooleanNode;
+import com.github.sidhant92.boolparser.domain.logical.InNode;
+import com.github.sidhant92.boolparser.domain.logical.Node;
+import com.github.sidhant92.boolparser.domain.logical.NumericRangeNode;
+import com.github.sidhant92.boolparser.domain.logical.ComparisonNode;
+import com.github.sidhant92.boolparser.domain.arithmetic.UnaryNode;
import com.github.sidhant92.boolparser.exception.InvalidExpressionException;
import com.github.sidhant92.boolparser.util.ValueUtils;
-import lombok.extern.slf4j.Slf4j;
-@Slf4j
public class BooleanFilterListener extends BooleanExpressionBaseListener {
private Node node;
@@ -30,7 +33,9 @@ public class BooleanFilterListener extends BooleanExpressionBaseListener {
private org.antlr.v4.runtime.Token lastToken;
- private String defaultField;
+ private int tokenCount;
+
+ private final String defaultField;
public BooleanFilterListener(final String defaultField) {
this.defaultField = defaultField;
@@ -45,22 +50,27 @@ public Node getNode() {
@Override
public void exitComparatorExpression(BooleanExpressionParser.ComparatorExpressionContext ctx) {
- final String variableName = getField(ctx.left.getText());
- final DataType dataType = getDataType(ctx.right.getStart());
- final Operator operator = Operator.getOperatorFromSymbol(ctx.op.getText()).orElse(Operator.EQUALS);
- currentNodes.add(new ComparisonNode(variableName, ValueUtils.convertValue(ctx.right.getText(), dataType), operator, dataType));
+ currentNodes.add(mapComparatorExpressionContext(ctx));
super.enterComparatorExpression(ctx);
}
+ @Override
+ public void exitArithmeticExpression(BooleanExpressionParser.ArithmeticExpressionContext ctx) {
+ currentNodes.add(mapArithmeticExpressionContext(ctx));
+ super.exitArithmeticExpression(ctx);
+ }
+
+ @Override
+ public void exitUnaryArithmeticExpression(BooleanExpressionParser.UnaryArithmeticExpressionContext ctx) {
+ final Node leafNode = !currentNodes.isEmpty() && currentNodes.peek() instanceof ArithmeticNode ? currentNodes.pop() : mapTypesExpressionContext(
+ (BooleanExpressionParser.TypesExpressionContext) ctx.exp);
+ currentNodes.add(ArithmeticNode.builder().left(leafNode).operator(Operator.UNARY).build());
+ super.enterUnaryArithmeticExpression(ctx);
+ }
+
@Override
public void exitToExpression(BooleanExpressionParser.ToExpressionContext ctx) {
- validateField(ctx.field, ctx.getText());
- final String field = getField(ctx.field.getText());
- final DataType lowerDataType = getDataType(ctx.lower.start);
- final Object lowerValue = ValueUtils.convertValue(ctx.lower.start.getText(), lowerDataType);
- final DataType upperDataType = getDataType(ctx.upper.start);
- final Object upperValue = ValueUtils.convertValue(ctx.upper.getText(), upperDataType);
- currentNodes.add(new NumericRangeNode(field, lowerValue, upperValue, lowerDataType, upperDataType));
+ currentNodes.add(mapToExpressionContext(ctx));
super.exitToExpression(ctx);
}
@@ -68,43 +78,150 @@ public void exitToExpression(BooleanExpressionParser.ToExpressionContext ctx) {
public void exitArrayExpression(BooleanExpressionParser.ArrayExpressionContext ctx) {
validateField(ctx.field, ctx.getText());
final String field = getField(ctx.field.getText());
- final List> items = getArrayElements(ctx.data.children);
+ final List items = getArrayElements(ctx.data.children);
final Operator operator = Operator.getOperatorFromSymbol(ctx.op.getText()).orElse(Operator.EQUALS);
currentNodes.add(new ArrayNode(field, operator, items));
super.exitArrayExpression(ctx);
}
+ @Override
+ public void exitArithmeticFunctionExpression(BooleanExpressionParser.ArithmeticFunctionExpressionContext ctx) {
+ final Node node = mapArithmeticFunctionExpressionContext(ctx);
+ currentNodes.add(node);
+ super.exitArithmeticFunctionExpression(ctx);
+ }
+
@Override
public void exitInExpression(BooleanExpressionParser.InExpressionContext ctx) {
+ currentNodes.add(mapInExpressionContext(ctx));
+ super.exitInExpression(ctx);
+ }
+
+ private List getArrayElements(final List trees) {
+ return trees
+ .stream()
+ .filter(child -> !(child instanceof TerminalNodeImpl))
+ .map(this::mapContextToNode)
+ .collect(Collectors.toList());
+ }
+
+ private Node mapContextToNode(final ParseTree ctx) {
+ if (ctx instanceof BooleanExpressionParser.ArithmeticExpressionContext) {
+ return mapArithmeticExpressionContext((BooleanExpressionParser.ArithmeticExpressionContext) ctx);
+ } else if (ctx instanceof BooleanExpressionParser.InExpressionContext) {
+ return mapInExpressionContext((BooleanExpressionParser.InExpressionContext) ctx);
+ } else if (ctx instanceof BooleanExpressionParser.ArithmeticFunctionExpressionContext) {
+ return mapArithmeticFunctionExpressionContext((BooleanExpressionParser.ArithmeticFunctionExpressionContext) ctx);
+ } else if (ctx instanceof BooleanExpressionParser.ComparatorExpressionContext) {
+ return mapComparatorExpressionContext((BooleanExpressionParser.ComparatorExpressionContext) ctx);
+ } else if (ctx instanceof BooleanExpressionParser.ToExpressionContext) {
+ return mapToExpressionContext((BooleanExpressionParser.ToExpressionContext) ctx);
+ } else if (ctx instanceof BooleanExpressionParser.TypesExpressionContext && ((BooleanExpressionParser.TypesExpressionContext) ctx).start.getType() == BooleanExpressionLexer.FIELD) {
+ return mapTypesExpressionContextField((BooleanExpressionParser.TypesExpressionContext) ctx);
+ } else if (ctx instanceof BooleanExpressionParser.TypesExpressionContext) {
+ return mapTypesExpressionContext((BooleanExpressionParser.TypesExpressionContext) ctx);
+ } else {
+ throw new InvalidExpressionException(String.format("Array does not support this expression %s", ctx.getText()));
+ }
+ }
+
+ private FieldNode mapTypesExpressionContextField(BooleanExpressionParser.TypesExpressionContext ctx) {
+ final String value = StringUtils.isBlank(ctx.getText()) ? defaultField : ctx.getText();
+ return new FieldNode(value);
+ }
+
+ private Node mapTypesExpressionContext(BooleanExpressionParser.TypesExpressionContext ctx) {
+ if (ctx.start.getType() == BooleanExpressionLexer.FIELD) {
+ return mapTypesExpressionContextField(ctx);
+ }
+ if (StringUtils.isBlank(ctx.getText())) {
+ return mapTypesExpressionContextField(ctx);
+ }
+ final DataType dataType = getDataType(ctx.start);
+ final Object value = ValueUtils.convertValue(ctx.start.getText(), dataType);
+ return new UnaryNode(dataType, value);
+ }
+
+ private ArithmeticFunctionNode mapArithmeticFunctionExpressionContext(BooleanExpressionParser.ArithmeticFunctionExpressionContext ctx) {
+ if (ctx.data.exception != null) {
+ throw new InvalidExpressionException(String.format("Error parsing expression for the string %s", ctx.getText()));
+ }
+ final FunctionType functionType = FunctionType.getArrayFunctionFromSymbol(ctx.left.getText()).orElseThrow(() -> {
+ return new InvalidExpressionException(String.format("Error parsing expression for the string %s", ctx.getText()));
+ });
+ final List items = getArrayElements(ctx.data.children);
+ return new ArithmeticFunctionNode(functionType, items);
+ }
+
+ private ComparisonNode mapComparatorExpressionContext(BooleanExpressionParser.ComparatorExpressionContext ctx) {
+ final Operator operator = Operator.getOperatorFromSymbol(ctx.op.getText()).orElse(Operator.EQUALS);
+
+ if (!currentNodes.isEmpty() && ((ctx.right instanceof BooleanExpressionParser.ParentExpressionContext || ctx.left instanceof BooleanExpressionParser.ParentExpressionContext) || !(currentNodes.peek() instanceof ComparisonNode || currentNodes.peek() instanceof BooleanNode))) {
+ if (ctx.left instanceof BooleanExpressionParser.TypesExpressionContext) {
+ final DataType dataType = getDataType(ctx.left.getStart());
+ final Node value = mapContextToNode(ctx.left);
+ return new ComparisonNode(value, currentNodes.pop(), operator, dataType);
+ } else if (ctx.right instanceof BooleanExpressionParser.TypesExpressionContext) {
+ final DataType dataType = getDataType(ctx.right.getStart());
+ final Node value = mapContextToNode(ctx.right);
+ return new ComparisonNode(currentNodes.pop(), value, operator, dataType);
+ }
+ }
+
+ final DataType dataType = getDataType(ctx.right.getStart());
+ final Node value = mapContextToNode(ctx.right);
+ return new ComparisonNode(mapContextToNode(ctx.left), value, operator, dataType);
+ }
+
+ private ArithmeticNode mapArithmeticExpressionContext(BooleanExpressionParser.ArithmeticExpressionContext ctx) {
+ final Operator operator = Operator.getOperatorFromSymbol(ctx.op.getText()).orElse(Operator.EQUALS);
+ if (ctx.left instanceof BooleanExpressionParser.TypesExpressionContext && ctx.right instanceof BooleanExpressionParser.TypesExpressionContext) {
+ final Node left = mapTypesExpressionContext((BooleanExpressionParser.TypesExpressionContext) ctx.left);
+ final Node right = mapTypesExpressionContext((BooleanExpressionParser.TypesExpressionContext) ctx.right);
+ return ArithmeticNode.builder().left(left).right(right).operator(operator).build();
+ } else if (ctx.left instanceof BooleanExpressionParser.TypesExpressionContext) {
+ final Node left = mapTypesExpressionContext((BooleanExpressionParser.TypesExpressionContext) ctx.left);
+ final Node right = currentNodes.pop();
+ return ArithmeticNode.builder().left(left).right(right).operator(operator).build();
+ } else if (ctx.right instanceof BooleanExpressionParser.TypesExpressionContext) {
+ final Node right = mapTypesExpressionContext((BooleanExpressionParser.TypesExpressionContext) ctx.right);
+ final Node left = currentNodes.pop();
+ return ArithmeticNode.builder().left(left).right(right).operator(operator).build();
+ } else {
+ if (currentNodes.size() < 2) {
+ throw new InvalidExpressionException(String.format("Error parsing expression for the string %s", ctx.getText()));
+ }
+ final Node right = currentNodes.pop();
+ final Node left = currentNodes.pop();
+ return ArithmeticNode.builder().left(left).right(right).operator(operator).build();
+ }
+ }
+
+ private Node mapInExpressionContext(BooleanExpressionParser.InExpressionContext ctx) {
validateField(ctx.field, ctx.getText());
final String field = getField(ctx.field.getText());
- final List> items = getArrayElements(ctx.data.children);
+ final List items = getArrayElements(ctx.data.children);
final InNode inNode = new InNode(field, items);
if (Objects.isNull(ctx.not)) {
- currentNodes.add(inNode);
+ return inNode;
} else {
- final BooleanNode booleanNode = new BooleanNode(inNode, null, LogicalOperationType.NOT);
- currentNodes.add(booleanNode);
+ return new BooleanNode(inNode, null, LogicalOperationType.NOT);
}
- super.exitInExpression(ctx);
}
- private List