From 73215bb3e1efe9fbe17de99f5f3c2e8f42c4a30f Mon Sep 17 00:00:00 2001 From: vinglogn Date: Sat, 24 Feb 2024 19:06:34 +0800 Subject: [PATCH] Adding pcre query to the grammar (#37) --- parser/JsonQuery.g4 | 25 ++- parser/JsonQuery.interp | 4 +- parser/JsonQuery.tokens | 41 ++-- parser/JsonQueryLexer.interp | 13 +- parser/JsonQueryLexer.tokens | 41 ++-- parser/bench_test.go | 15 ++ parser/float_operation.go | 13 ++ parser/int_operation.go | 12 ++ parser/jsonquery_lexer.go | 340 +++++++++++++++++-------------- parser/jsonquery_parser.go | 88 ++++---- parser/jsonquery_visitor_impl.go | 2 + parser/null_operation.go | 4 + parser/operation.go | 1 + parser/parse_simple_test.go | 64 ++++++ parser/string_operation.go | 27 +++ 15 files changed, 454 insertions(+), 236 deletions(-) diff --git a/parser/JsonQuery.g4 b/parser/JsonQuery.g4 index b66b4ea..3e6521f 100644 --- a/parser/JsonQuery.g4 +++ b/parser/JsonQuery.g4 @@ -4,7 +4,7 @@ query : NOT? SP? '(' SP? query SP? ')' #parenExp | query SP LOGICAL_OPERATOR SP query #logicalExp | attrPath SP 'pr' #presentExp - | attrPath SP op=( EQ | NE | GT | LT | GE | LE | CO | SW | EW | IN ) SP value #compareExp + | attrPath SP op=( EQ | NE | GT | LT | GE | LE | CO | SW | EW | IN | LIKE ) SP value #compareExp ; NOT @@ -23,6 +23,10 @@ NULL : 'null' ; +LIKE + : 'like' | 'regx' + ; + IN: 'IN' | 'in'; EQ : 'eq' | 'EQ' | '=='; NE : 'ne' | 'NE' | '!='; @@ -74,9 +78,26 @@ VERSION ; STRING - : '"' (ESC | ~ ["\\])* '"' + : '"' (ESC | ~ ["\\] | REGEX)* '"' ; +fragment REGEX: CHOICE | ATOM_CHARACTER+; + +fragment CHOICE: GROUP ('|' GROUP)*; + +fragment GROUP: '(' (ATOM_CHARACTER | GROUP)* ')'; + +fragment ATOM_CHARACTER: CHAR | ESCAPE_CHAR | SPECIAL_CHAR | REPEAT; + +fragment REPEAT: '{' INT '}'; + +fragment CHAR: [a-zA-Z0-9]; + +fragment SPECIAL_CHAR: ',' | '.' | ':' | ';' | '!' | '?' | '(' | ')' | '[' | ']' | '{' | '}' | '-' | '=' | '>' | '<' | '\'' | '\\' | '&' | '|' | '+' | '*' | '$' | '%' | '/' | '^' | '~' | '`' | ' '; + +fragment ESCAPE_CHAR: '\\' ~[abfnrtv]; + + listStrings : '[' subListOfStrings ; diff --git a/parser/JsonQuery.interp b/parser/JsonQuery.interp index 5297170..f2e80e2 100644 --- a/parser/JsonQuery.interp +++ b/parser/JsonQuery.interp @@ -27,6 +27,7 @@ null null null null +null '\n' null null @@ -44,6 +45,7 @@ NOT LOGICAL_OPERATOR BOOLEAN NULL +LIKE IN EQ NE @@ -78,4 +80,4 @@ subListOfInts atn: -[4, 1, 30, 114, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 1, 0, 1, 0, 3, 0, 23, 8, 0, 1, 0, 3, 0, 26, 8, 0, 1, 0, 1, 0, 3, 0, 30, 8, 0, 1, 0, 1, 0, 3, 0, 34, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 48, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 55, 8, 0, 10, 0, 12, 0, 58, 9, 0, 1, 1, 1, 1, 3, 1, 62, 8, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 73, 8, 3, 1, 3, 1, 3, 3, 3, 77, 8, 3, 1, 3, 1, 3, 1, 3, 3, 3, 82, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 92, 8, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 102, 8, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 112, 8, 9, 1, 9, 0, 1, 0, 10, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 0, 1, 1, 0, 12, 21, 124, 0, 47, 1, 0, 0, 0, 2, 59, 1, 0, 0, 0, 4, 63, 1, 0, 0, 0, 6, 81, 1, 0, 0, 0, 8, 83, 1, 0, 0, 0, 10, 91, 1, 0, 0, 0, 12, 93, 1, 0, 0, 0, 14, 101, 1, 0, 0, 0, 16, 103, 1, 0, 0, 0, 18, 111, 1, 0, 0, 0, 20, 22, 6, 0, -1, 0, 21, 23, 5, 8, 0, 0, 22, 21, 1, 0, 0, 0, 22, 23, 1, 0, 0, 0, 23, 25, 1, 0, 0, 0, 24, 26, 5, 30, 0, 0, 25, 24, 1, 0, 0, 0, 25, 26, 1, 0, 0, 0, 26, 27, 1, 0, 0, 0, 27, 29, 5, 1, 0, 0, 28, 30, 5, 30, 0, 0, 29, 28, 1, 0, 0, 0, 29, 30, 1, 0, 0, 0, 30, 31, 1, 0, 0, 0, 31, 33, 3, 0, 0, 0, 32, 34, 5, 30, 0, 0, 33, 32, 1, 0, 0, 0, 33, 34, 1, 0, 0, 0, 34, 35, 1, 0, 0, 0, 35, 36, 5, 2, 0, 0, 36, 48, 1, 0, 0, 0, 37, 38, 3, 2, 1, 0, 38, 39, 5, 30, 0, 0, 39, 40, 5, 3, 0, 0, 40, 48, 1, 0, 0, 0, 41, 42, 3, 2, 1, 0, 42, 43, 5, 30, 0, 0, 43, 44, 7, 0, 0, 0, 44, 45, 5, 30, 0, 0, 45, 46, 3, 6, 3, 0, 46, 48, 1, 0, 0, 0, 47, 20, 1, 0, 0, 0, 47, 37, 1, 0, 0, 0, 47, 41, 1, 0, 0, 0, 48, 56, 1, 0, 0, 0, 49, 50, 10, 3, 0, 0, 50, 51, 5, 30, 0, 0, 51, 52, 5, 9, 0, 0, 52, 53, 5, 30, 0, 0, 53, 55, 3, 0, 0, 4, 54, 49, 1, 0, 0, 0, 55, 58, 1, 0, 0, 0, 56, 54, 1, 0, 0, 0, 56, 57, 1, 0, 0, 0, 57, 1, 1, 0, 0, 0, 58, 56, 1, 0, 0, 0, 59, 61, 5, 22, 0, 0, 60, 62, 3, 4, 2, 0, 61, 60, 1, 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 3, 1, 0, 0, 0, 63, 64, 5, 4, 0, 0, 64, 65, 3, 2, 1, 0, 65, 5, 1, 0, 0, 0, 66, 82, 5, 10, 0, 0, 67, 82, 5, 11, 0, 0, 68, 82, 5, 23, 0, 0, 69, 82, 5, 24, 0, 0, 70, 82, 5, 25, 0, 0, 71, 73, 5, 5, 0, 0, 72, 71, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 76, 5, 26, 0, 0, 75, 77, 5, 27, 0, 0, 76, 75, 1, 0, 0, 0, 76, 77, 1, 0, 0, 0, 77, 82, 1, 0, 0, 0, 78, 82, 3, 16, 8, 0, 79, 82, 3, 12, 6, 0, 80, 82, 3, 8, 4, 0, 81, 66, 1, 0, 0, 0, 81, 67, 1, 0, 0, 0, 81, 68, 1, 0, 0, 0, 81, 69, 1, 0, 0, 0, 81, 70, 1, 0, 0, 0, 81, 72, 1, 0, 0, 0, 81, 78, 1, 0, 0, 0, 81, 79, 1, 0, 0, 0, 81, 80, 1, 0, 0, 0, 82, 7, 1, 0, 0, 0, 83, 84, 5, 6, 0, 0, 84, 85, 3, 10, 5, 0, 85, 9, 1, 0, 0, 0, 86, 87, 5, 24, 0, 0, 87, 88, 5, 29, 0, 0, 88, 92, 3, 10, 5, 0, 89, 90, 5, 24, 0, 0, 90, 92, 5, 7, 0, 0, 91, 86, 1, 0, 0, 0, 91, 89, 1, 0, 0, 0, 92, 11, 1, 0, 0, 0, 93, 94, 5, 6, 0, 0, 94, 95, 3, 14, 7, 0, 95, 13, 1, 0, 0, 0, 96, 97, 5, 25, 0, 0, 97, 98, 5, 29, 0, 0, 98, 102, 3, 14, 7, 0, 99, 100, 5, 25, 0, 0, 100, 102, 5, 7, 0, 0, 101, 96, 1, 0, 0, 0, 101, 99, 1, 0, 0, 0, 102, 15, 1, 0, 0, 0, 103, 104, 5, 6, 0, 0, 104, 105, 3, 18, 9, 0, 105, 17, 1, 0, 0, 0, 106, 107, 5, 26, 0, 0, 107, 108, 5, 29, 0, 0, 108, 112, 3, 18, 9, 0, 109, 110, 5, 26, 0, 0, 110, 112, 5, 7, 0, 0, 111, 106, 1, 0, 0, 0, 111, 109, 1, 0, 0, 0, 112, 19, 1, 0, 0, 0, 13, 22, 25, 29, 33, 47, 56, 61, 72, 76, 81, 91, 101, 111] \ No newline at end of file +[4, 1, 31, 114, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 1, 0, 1, 0, 3, 0, 23, 8, 0, 1, 0, 3, 0, 26, 8, 0, 1, 0, 1, 0, 3, 0, 30, 8, 0, 1, 0, 1, 0, 3, 0, 34, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 48, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 55, 8, 0, 10, 0, 12, 0, 58, 9, 0, 1, 1, 1, 1, 3, 1, 62, 8, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 73, 8, 3, 1, 3, 1, 3, 3, 3, 77, 8, 3, 1, 3, 1, 3, 1, 3, 3, 3, 82, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 92, 8, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 102, 8, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 112, 8, 9, 1, 9, 0, 1, 0, 10, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 0, 1, 1, 0, 12, 22, 124, 0, 47, 1, 0, 0, 0, 2, 59, 1, 0, 0, 0, 4, 63, 1, 0, 0, 0, 6, 81, 1, 0, 0, 0, 8, 83, 1, 0, 0, 0, 10, 91, 1, 0, 0, 0, 12, 93, 1, 0, 0, 0, 14, 101, 1, 0, 0, 0, 16, 103, 1, 0, 0, 0, 18, 111, 1, 0, 0, 0, 20, 22, 6, 0, -1, 0, 21, 23, 5, 8, 0, 0, 22, 21, 1, 0, 0, 0, 22, 23, 1, 0, 0, 0, 23, 25, 1, 0, 0, 0, 24, 26, 5, 31, 0, 0, 25, 24, 1, 0, 0, 0, 25, 26, 1, 0, 0, 0, 26, 27, 1, 0, 0, 0, 27, 29, 5, 1, 0, 0, 28, 30, 5, 31, 0, 0, 29, 28, 1, 0, 0, 0, 29, 30, 1, 0, 0, 0, 30, 31, 1, 0, 0, 0, 31, 33, 3, 0, 0, 0, 32, 34, 5, 31, 0, 0, 33, 32, 1, 0, 0, 0, 33, 34, 1, 0, 0, 0, 34, 35, 1, 0, 0, 0, 35, 36, 5, 2, 0, 0, 36, 48, 1, 0, 0, 0, 37, 38, 3, 2, 1, 0, 38, 39, 5, 31, 0, 0, 39, 40, 5, 3, 0, 0, 40, 48, 1, 0, 0, 0, 41, 42, 3, 2, 1, 0, 42, 43, 5, 31, 0, 0, 43, 44, 7, 0, 0, 0, 44, 45, 5, 31, 0, 0, 45, 46, 3, 6, 3, 0, 46, 48, 1, 0, 0, 0, 47, 20, 1, 0, 0, 0, 47, 37, 1, 0, 0, 0, 47, 41, 1, 0, 0, 0, 48, 56, 1, 0, 0, 0, 49, 50, 10, 3, 0, 0, 50, 51, 5, 31, 0, 0, 51, 52, 5, 9, 0, 0, 52, 53, 5, 31, 0, 0, 53, 55, 3, 0, 0, 4, 54, 49, 1, 0, 0, 0, 55, 58, 1, 0, 0, 0, 56, 54, 1, 0, 0, 0, 56, 57, 1, 0, 0, 0, 57, 1, 1, 0, 0, 0, 58, 56, 1, 0, 0, 0, 59, 61, 5, 23, 0, 0, 60, 62, 3, 4, 2, 0, 61, 60, 1, 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 3, 1, 0, 0, 0, 63, 64, 5, 4, 0, 0, 64, 65, 3, 2, 1, 0, 65, 5, 1, 0, 0, 0, 66, 82, 5, 10, 0, 0, 67, 82, 5, 11, 0, 0, 68, 82, 5, 24, 0, 0, 69, 82, 5, 25, 0, 0, 70, 82, 5, 26, 0, 0, 71, 73, 5, 5, 0, 0, 72, 71, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 76, 5, 27, 0, 0, 75, 77, 5, 28, 0, 0, 76, 75, 1, 0, 0, 0, 76, 77, 1, 0, 0, 0, 77, 82, 1, 0, 0, 0, 78, 82, 3, 16, 8, 0, 79, 82, 3, 12, 6, 0, 80, 82, 3, 8, 4, 0, 81, 66, 1, 0, 0, 0, 81, 67, 1, 0, 0, 0, 81, 68, 1, 0, 0, 0, 81, 69, 1, 0, 0, 0, 81, 70, 1, 0, 0, 0, 81, 72, 1, 0, 0, 0, 81, 78, 1, 0, 0, 0, 81, 79, 1, 0, 0, 0, 81, 80, 1, 0, 0, 0, 82, 7, 1, 0, 0, 0, 83, 84, 5, 6, 0, 0, 84, 85, 3, 10, 5, 0, 85, 9, 1, 0, 0, 0, 86, 87, 5, 25, 0, 0, 87, 88, 5, 30, 0, 0, 88, 92, 3, 10, 5, 0, 89, 90, 5, 25, 0, 0, 90, 92, 5, 7, 0, 0, 91, 86, 1, 0, 0, 0, 91, 89, 1, 0, 0, 0, 92, 11, 1, 0, 0, 0, 93, 94, 5, 6, 0, 0, 94, 95, 3, 14, 7, 0, 95, 13, 1, 0, 0, 0, 96, 97, 5, 26, 0, 0, 97, 98, 5, 30, 0, 0, 98, 102, 3, 14, 7, 0, 99, 100, 5, 26, 0, 0, 100, 102, 5, 7, 0, 0, 101, 96, 1, 0, 0, 0, 101, 99, 1, 0, 0, 0, 102, 15, 1, 0, 0, 0, 103, 104, 5, 6, 0, 0, 104, 105, 3, 18, 9, 0, 105, 17, 1, 0, 0, 0, 106, 107, 5, 27, 0, 0, 107, 108, 5, 30, 0, 0, 108, 112, 3, 18, 9, 0, 109, 110, 5, 27, 0, 0, 110, 112, 5, 7, 0, 0, 111, 106, 1, 0, 0, 0, 111, 109, 1, 0, 0, 0, 112, 19, 1, 0, 0, 0, 13, 22, 25, 29, 33, 47, 56, 61, 72, 76, 81, 91, 101, 111] \ No newline at end of file diff --git a/parser/JsonQuery.tokens b/parser/JsonQuery.tokens index ac16344..aea46d2 100644 --- a/parser/JsonQuery.tokens +++ b/parser/JsonQuery.tokens @@ -9,25 +9,26 @@ NOT=8 LOGICAL_OPERATOR=9 BOOLEAN=10 NULL=11 -IN=12 -EQ=13 -NE=14 -GT=15 -LT=16 -GE=17 -LE=18 -CO=19 -SW=20 -EW=21 -ATTRNAME=22 -VERSION=23 -STRING=24 -DOUBLE=25 -INT=26 -EXP=27 -NEWLINE=28 -COMMA=29 -SP=30 +LIKE=12 +IN=13 +EQ=14 +NE=15 +GT=16 +LT=17 +GE=18 +LE=19 +CO=20 +SW=21 +EW=22 +ATTRNAME=23 +VERSION=24 +STRING=25 +DOUBLE=26 +INT=27 +EXP=28 +NEWLINE=29 +COMMA=30 +SP=31 '('=1 ')'=2 'pr'=3 @@ -36,4 +37,4 @@ SP=30 '['=6 ']'=7 'null'=11 -'\n'=28 +'\n'=29 diff --git a/parser/JsonQueryLexer.interp b/parser/JsonQueryLexer.interp index eff3c90..61404ab 100644 --- a/parser/JsonQueryLexer.interp +++ b/parser/JsonQueryLexer.interp @@ -27,6 +27,7 @@ null null null null +null '\n' null null @@ -44,6 +45,7 @@ NOT LOGICAL_OPERATOR BOOLEAN NULL +LIKE IN EQ NE @@ -76,6 +78,7 @@ NOT LOGICAL_OPERATOR BOOLEAN NULL +LIKE IN EQ NE @@ -92,6 +95,14 @@ DIGIT ALPHA VERSION STRING +REGEX +CHOICE +GROUP +ATOM_CHARACTER +REPEAT +CHAR +SPECIAL_CHAR +ESCAPE_CHAR ESC UNICODE HEX @@ -110,4 +121,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 30, 279, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 95, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 102, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 113, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 124, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 132, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 140, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 147, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 154, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 162, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 170, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 176, 8, 18, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 182, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 188, 8, 20, 1, 21, 1, 21, 5, 21, 192, 8, 21, 10, 21, 12, 21, 195, 9, 21, 1, 22, 1, 22, 1, 22, 3, 22, 200, 8, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 5, 26, 215, 8, 26, 10, 26, 12, 26, 218, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 3, 27, 225, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 3, 30, 236, 8, 30, 1, 30, 1, 30, 1, 30, 4, 30, 241, 8, 30, 11, 30, 12, 30, 242, 1, 30, 3, 30, 246, 8, 30, 1, 31, 1, 31, 1, 31, 5, 31, 251, 8, 31, 10, 31, 12, 31, 254, 9, 31, 3, 31, 256, 8, 31, 1, 32, 1, 32, 3, 32, 260, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 5, 34, 268, 8, 34, 10, 34, 12, 34, 271, 9, 34, 1, 35, 1, 35, 5, 35, 275, 8, 35, 10, 35, 12, 35, 278, 9, 35, 0, 0, 36, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 0, 47, 0, 49, 0, 51, 23, 53, 24, 55, 0, 57, 0, 59, 0, 61, 25, 63, 26, 65, 27, 67, 28, 69, 29, 71, 30, 1, 0, 9, 3, 0, 45, 45, 58, 58, 95, 95, 2, 0, 65, 90, 97, 122, 2, 0, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 305, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 1, 73, 1, 0, 0, 0, 3, 75, 1, 0, 0, 0, 5, 77, 1, 0, 0, 0, 7, 80, 1, 0, 0, 0, 9, 82, 1, 0, 0, 0, 11, 84, 1, 0, 0, 0, 13, 86, 1, 0, 0, 0, 15, 94, 1, 0, 0, 0, 17, 101, 1, 0, 0, 0, 19, 112, 1, 0, 0, 0, 21, 114, 1, 0, 0, 0, 23, 123, 1, 0, 0, 0, 25, 131, 1, 0, 0, 0, 27, 139, 1, 0, 0, 0, 29, 146, 1, 0, 0, 0, 31, 153, 1, 0, 0, 0, 33, 161, 1, 0, 0, 0, 35, 169, 1, 0, 0, 0, 37, 175, 1, 0, 0, 0, 39, 181, 1, 0, 0, 0, 41, 187, 1, 0, 0, 0, 43, 189, 1, 0, 0, 0, 45, 199, 1, 0, 0, 0, 47, 201, 1, 0, 0, 0, 49, 203, 1, 0, 0, 0, 51, 205, 1, 0, 0, 0, 53, 211, 1, 0, 0, 0, 55, 221, 1, 0, 0, 0, 57, 226, 1, 0, 0, 0, 59, 232, 1, 0, 0, 0, 61, 235, 1, 0, 0, 0, 63, 255, 1, 0, 0, 0, 65, 257, 1, 0, 0, 0, 67, 263, 1, 0, 0, 0, 69, 265, 1, 0, 0, 0, 71, 272, 1, 0, 0, 0, 73, 74, 5, 40, 0, 0, 74, 2, 1, 0, 0, 0, 75, 76, 5, 41, 0, 0, 76, 4, 1, 0, 0, 0, 77, 78, 5, 112, 0, 0, 78, 79, 5, 114, 0, 0, 79, 6, 1, 0, 0, 0, 80, 81, 5, 46, 0, 0, 81, 8, 1, 0, 0, 0, 82, 83, 5, 45, 0, 0, 83, 10, 1, 0, 0, 0, 84, 85, 5, 91, 0, 0, 85, 12, 1, 0, 0, 0, 86, 87, 5, 93, 0, 0, 87, 14, 1, 0, 0, 0, 88, 89, 5, 110, 0, 0, 89, 90, 5, 111, 0, 0, 90, 95, 5, 116, 0, 0, 91, 92, 5, 78, 0, 0, 92, 93, 5, 79, 0, 0, 93, 95, 5, 84, 0, 0, 94, 88, 1, 0, 0, 0, 94, 91, 1, 0, 0, 0, 95, 16, 1, 0, 0, 0, 96, 97, 5, 97, 0, 0, 97, 98, 5, 110, 0, 0, 98, 102, 5, 100, 0, 0, 99, 100, 5, 111, 0, 0, 100, 102, 5, 114, 0, 0, 101, 96, 1, 0, 0, 0, 101, 99, 1, 0, 0, 0, 102, 18, 1, 0, 0, 0, 103, 104, 5, 116, 0, 0, 104, 105, 5, 114, 0, 0, 105, 106, 5, 117, 0, 0, 106, 113, 5, 101, 0, 0, 107, 108, 5, 102, 0, 0, 108, 109, 5, 97, 0, 0, 109, 110, 5, 108, 0, 0, 110, 111, 5, 115, 0, 0, 111, 113, 5, 101, 0, 0, 112, 103, 1, 0, 0, 0, 112, 107, 1, 0, 0, 0, 113, 20, 1, 0, 0, 0, 114, 115, 5, 110, 0, 0, 115, 116, 5, 117, 0, 0, 116, 117, 5, 108, 0, 0, 117, 118, 5, 108, 0, 0, 118, 22, 1, 0, 0, 0, 119, 120, 5, 73, 0, 0, 120, 124, 5, 78, 0, 0, 121, 122, 5, 105, 0, 0, 122, 124, 5, 110, 0, 0, 123, 119, 1, 0, 0, 0, 123, 121, 1, 0, 0, 0, 124, 24, 1, 0, 0, 0, 125, 126, 5, 101, 0, 0, 126, 132, 5, 113, 0, 0, 127, 128, 5, 69, 0, 0, 128, 132, 5, 81, 0, 0, 129, 130, 5, 61, 0, 0, 130, 132, 5, 61, 0, 0, 131, 125, 1, 0, 0, 0, 131, 127, 1, 0, 0, 0, 131, 129, 1, 0, 0, 0, 132, 26, 1, 0, 0, 0, 133, 134, 5, 110, 0, 0, 134, 140, 5, 101, 0, 0, 135, 136, 5, 78, 0, 0, 136, 140, 5, 69, 0, 0, 137, 138, 5, 33, 0, 0, 138, 140, 5, 61, 0, 0, 139, 133, 1, 0, 0, 0, 139, 135, 1, 0, 0, 0, 139, 137, 1, 0, 0, 0, 140, 28, 1, 0, 0, 0, 141, 142, 5, 103, 0, 0, 142, 147, 5, 116, 0, 0, 143, 144, 5, 71, 0, 0, 144, 147, 5, 84, 0, 0, 145, 147, 5, 62, 0, 0, 146, 141, 1, 0, 0, 0, 146, 143, 1, 0, 0, 0, 146, 145, 1, 0, 0, 0, 147, 30, 1, 0, 0, 0, 148, 149, 5, 108, 0, 0, 149, 154, 5, 116, 0, 0, 150, 151, 5, 76, 0, 0, 151, 154, 5, 84, 0, 0, 152, 154, 5, 60, 0, 0, 153, 148, 1, 0, 0, 0, 153, 150, 1, 0, 0, 0, 153, 152, 1, 0, 0, 0, 154, 32, 1, 0, 0, 0, 155, 156, 5, 103, 0, 0, 156, 162, 5, 101, 0, 0, 157, 158, 5, 71, 0, 0, 158, 162, 5, 69, 0, 0, 159, 160, 5, 62, 0, 0, 160, 162, 5, 61, 0, 0, 161, 155, 1, 0, 0, 0, 161, 157, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 162, 34, 1, 0, 0, 0, 163, 164, 5, 108, 0, 0, 164, 170, 5, 101, 0, 0, 165, 166, 5, 76, 0, 0, 166, 170, 5, 69, 0, 0, 167, 168, 5, 60, 0, 0, 168, 170, 5, 61, 0, 0, 169, 163, 1, 0, 0, 0, 169, 165, 1, 0, 0, 0, 169, 167, 1, 0, 0, 0, 170, 36, 1, 0, 0, 0, 171, 172, 5, 99, 0, 0, 172, 176, 5, 111, 0, 0, 173, 174, 5, 67, 0, 0, 174, 176, 5, 79, 0, 0, 175, 171, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 176, 38, 1, 0, 0, 0, 177, 178, 5, 115, 0, 0, 178, 182, 5, 119, 0, 0, 179, 180, 5, 83, 0, 0, 180, 182, 5, 87, 0, 0, 181, 177, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 182, 40, 1, 0, 0, 0, 183, 184, 5, 101, 0, 0, 184, 188, 5, 119, 0, 0, 185, 186, 5, 69, 0, 0, 186, 188, 5, 87, 0, 0, 187, 183, 1, 0, 0, 0, 187, 185, 1, 0, 0, 0, 188, 42, 1, 0, 0, 0, 189, 193, 3, 49, 24, 0, 190, 192, 3, 45, 22, 0, 191, 190, 1, 0, 0, 0, 192, 195, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 44, 1, 0, 0, 0, 195, 193, 1, 0, 0, 0, 196, 200, 7, 0, 0, 0, 197, 200, 3, 47, 23, 0, 198, 200, 3, 49, 24, 0, 199, 196, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 198, 1, 0, 0, 0, 200, 46, 1, 0, 0, 0, 201, 202, 2, 48, 57, 0, 202, 48, 1, 0, 0, 0, 203, 204, 7, 1, 0, 0, 204, 50, 1, 0, 0, 0, 205, 206, 3, 63, 31, 0, 206, 207, 5, 46, 0, 0, 207, 208, 3, 63, 31, 0, 208, 209, 5, 46, 0, 0, 209, 210, 3, 63, 31, 0, 210, 52, 1, 0, 0, 0, 211, 216, 5, 34, 0, 0, 212, 215, 3, 55, 27, 0, 213, 215, 8, 2, 0, 0, 214, 212, 1, 0, 0, 0, 214, 213, 1, 0, 0, 0, 215, 218, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 219, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 219, 220, 5, 34, 0, 0, 220, 54, 1, 0, 0, 0, 221, 224, 5, 92, 0, 0, 222, 225, 7, 3, 0, 0, 223, 225, 3, 57, 28, 0, 224, 222, 1, 0, 0, 0, 224, 223, 1, 0, 0, 0, 225, 56, 1, 0, 0, 0, 226, 227, 5, 117, 0, 0, 227, 228, 3, 59, 29, 0, 228, 229, 3, 59, 29, 0, 229, 230, 3, 59, 29, 0, 230, 231, 3, 59, 29, 0, 231, 58, 1, 0, 0, 0, 232, 233, 7, 4, 0, 0, 233, 60, 1, 0, 0, 0, 234, 236, 5, 45, 0, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 238, 3, 63, 31, 0, 238, 240, 5, 46, 0, 0, 239, 241, 7, 5, 0, 0, 240, 239, 1, 0, 0, 0, 241, 242, 1, 0, 0, 0, 242, 240, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 245, 1, 0, 0, 0, 244, 246, 3, 65, 32, 0, 245, 244, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 62, 1, 0, 0, 0, 247, 256, 5, 48, 0, 0, 248, 252, 7, 6, 0, 0, 249, 251, 7, 5, 0, 0, 250, 249, 1, 0, 0, 0, 251, 254, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 256, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 255, 247, 1, 0, 0, 0, 255, 248, 1, 0, 0, 0, 256, 64, 1, 0, 0, 0, 257, 259, 7, 7, 0, 0, 258, 260, 7, 8, 0, 0, 259, 258, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 3, 63, 31, 0, 262, 66, 1, 0, 0, 0, 263, 264, 5, 10, 0, 0, 264, 68, 1, 0, 0, 0, 265, 269, 5, 44, 0, 0, 266, 268, 5, 32, 0, 0, 267, 266, 1, 0, 0, 0, 268, 271, 1, 0, 0, 0, 269, 267, 1, 0, 0, 0, 269, 270, 1, 0, 0, 0, 270, 70, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 272, 276, 5, 32, 0, 0, 273, 275, 3, 67, 33, 0, 274, 273, 1, 0, 0, 0, 275, 278, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 72, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 27, 0, 94, 101, 112, 123, 131, 139, 146, 153, 161, 169, 175, 181, 187, 193, 199, 214, 216, 224, 235, 242, 245, 252, 255, 259, 269, 276, 0] \ No newline at end of file +[4, 0, 31, 351, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 113, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 120, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 131, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 146, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 152, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 160, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 168, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 175, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 182, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 190, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 198, 8, 18, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 204, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 210, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 216, 8, 21, 1, 22, 1, 22, 5, 22, 220, 8, 22, 10, 22, 12, 22, 223, 9, 22, 1, 23, 1, 23, 1, 23, 3, 23, 228, 8, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 244, 8, 27, 10, 27, 12, 27, 247, 9, 27, 1, 27, 1, 27, 1, 28, 1, 28, 4, 28, 253, 8, 28, 11, 28, 12, 28, 254, 3, 28, 257, 8, 28, 1, 29, 1, 29, 1, 29, 5, 29, 262, 8, 29, 10, 29, 12, 29, 265, 9, 29, 1, 30, 1, 30, 1, 30, 5, 30, 270, 8, 30, 10, 30, 12, 30, 273, 9, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 281, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 3, 36, 297, 8, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 3, 39, 308, 8, 39, 1, 39, 1, 39, 1, 39, 4, 39, 313, 8, 39, 11, 39, 12, 39, 314, 1, 39, 3, 39, 318, 8, 39, 1, 40, 1, 40, 1, 40, 5, 40, 323, 8, 40, 10, 40, 12, 40, 326, 9, 40, 3, 40, 328, 8, 40, 1, 41, 1, 41, 3, 41, 332, 8, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 5, 43, 340, 8, 43, 10, 43, 12, 43, 343, 9, 43, 1, 44, 1, 44, 5, 44, 347, 8, 44, 10, 44, 12, 44, 350, 9, 44, 0, 0, 45, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 0, 49, 0, 51, 0, 53, 24, 55, 25, 57, 0, 59, 0, 61, 0, 63, 0, 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 26, 81, 27, 83, 28, 85, 29, 87, 30, 89, 31, 1, 0, 12, 3, 0, 45, 45, 58, 58, 95, 95, 2, 0, 65, 90, 97, 122, 2, 0, 34, 34, 92, 92, 3, 0, 48, 57, 65, 90, 97, 122, 6, 0, 32, 33, 36, 47, 58, 63, 91, 94, 96, 96, 123, 126, 6, 0, 97, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 379, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 1, 91, 1, 0, 0, 0, 3, 93, 1, 0, 0, 0, 5, 95, 1, 0, 0, 0, 7, 98, 1, 0, 0, 0, 9, 100, 1, 0, 0, 0, 11, 102, 1, 0, 0, 0, 13, 104, 1, 0, 0, 0, 15, 112, 1, 0, 0, 0, 17, 119, 1, 0, 0, 0, 19, 130, 1, 0, 0, 0, 21, 132, 1, 0, 0, 0, 23, 145, 1, 0, 0, 0, 25, 151, 1, 0, 0, 0, 27, 159, 1, 0, 0, 0, 29, 167, 1, 0, 0, 0, 31, 174, 1, 0, 0, 0, 33, 181, 1, 0, 0, 0, 35, 189, 1, 0, 0, 0, 37, 197, 1, 0, 0, 0, 39, 203, 1, 0, 0, 0, 41, 209, 1, 0, 0, 0, 43, 215, 1, 0, 0, 0, 45, 217, 1, 0, 0, 0, 47, 227, 1, 0, 0, 0, 49, 229, 1, 0, 0, 0, 51, 231, 1, 0, 0, 0, 53, 233, 1, 0, 0, 0, 55, 239, 1, 0, 0, 0, 57, 256, 1, 0, 0, 0, 59, 258, 1, 0, 0, 0, 61, 266, 1, 0, 0, 0, 63, 280, 1, 0, 0, 0, 65, 282, 1, 0, 0, 0, 67, 286, 1, 0, 0, 0, 69, 288, 1, 0, 0, 0, 71, 290, 1, 0, 0, 0, 73, 293, 1, 0, 0, 0, 75, 298, 1, 0, 0, 0, 77, 304, 1, 0, 0, 0, 79, 307, 1, 0, 0, 0, 81, 327, 1, 0, 0, 0, 83, 329, 1, 0, 0, 0, 85, 335, 1, 0, 0, 0, 87, 337, 1, 0, 0, 0, 89, 344, 1, 0, 0, 0, 91, 92, 5, 40, 0, 0, 92, 2, 1, 0, 0, 0, 93, 94, 5, 41, 0, 0, 94, 4, 1, 0, 0, 0, 95, 96, 5, 112, 0, 0, 96, 97, 5, 114, 0, 0, 97, 6, 1, 0, 0, 0, 98, 99, 5, 46, 0, 0, 99, 8, 1, 0, 0, 0, 100, 101, 5, 45, 0, 0, 101, 10, 1, 0, 0, 0, 102, 103, 5, 91, 0, 0, 103, 12, 1, 0, 0, 0, 104, 105, 5, 93, 0, 0, 105, 14, 1, 0, 0, 0, 106, 107, 5, 110, 0, 0, 107, 108, 5, 111, 0, 0, 108, 113, 5, 116, 0, 0, 109, 110, 5, 78, 0, 0, 110, 111, 5, 79, 0, 0, 111, 113, 5, 84, 0, 0, 112, 106, 1, 0, 0, 0, 112, 109, 1, 0, 0, 0, 113, 16, 1, 0, 0, 0, 114, 115, 5, 97, 0, 0, 115, 116, 5, 110, 0, 0, 116, 120, 5, 100, 0, 0, 117, 118, 5, 111, 0, 0, 118, 120, 5, 114, 0, 0, 119, 114, 1, 0, 0, 0, 119, 117, 1, 0, 0, 0, 120, 18, 1, 0, 0, 0, 121, 122, 5, 116, 0, 0, 122, 123, 5, 114, 0, 0, 123, 124, 5, 117, 0, 0, 124, 131, 5, 101, 0, 0, 125, 126, 5, 102, 0, 0, 126, 127, 5, 97, 0, 0, 127, 128, 5, 108, 0, 0, 128, 129, 5, 115, 0, 0, 129, 131, 5, 101, 0, 0, 130, 121, 1, 0, 0, 0, 130, 125, 1, 0, 0, 0, 131, 20, 1, 0, 0, 0, 132, 133, 5, 110, 0, 0, 133, 134, 5, 117, 0, 0, 134, 135, 5, 108, 0, 0, 135, 136, 5, 108, 0, 0, 136, 22, 1, 0, 0, 0, 137, 138, 5, 108, 0, 0, 138, 139, 5, 105, 0, 0, 139, 140, 5, 107, 0, 0, 140, 146, 5, 101, 0, 0, 141, 142, 5, 114, 0, 0, 142, 143, 5, 101, 0, 0, 143, 144, 5, 103, 0, 0, 144, 146, 5, 120, 0, 0, 145, 137, 1, 0, 0, 0, 145, 141, 1, 0, 0, 0, 146, 24, 1, 0, 0, 0, 147, 148, 5, 73, 0, 0, 148, 152, 5, 78, 0, 0, 149, 150, 5, 105, 0, 0, 150, 152, 5, 110, 0, 0, 151, 147, 1, 0, 0, 0, 151, 149, 1, 0, 0, 0, 152, 26, 1, 0, 0, 0, 153, 154, 5, 101, 0, 0, 154, 160, 5, 113, 0, 0, 155, 156, 5, 69, 0, 0, 156, 160, 5, 81, 0, 0, 157, 158, 5, 61, 0, 0, 158, 160, 5, 61, 0, 0, 159, 153, 1, 0, 0, 0, 159, 155, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 160, 28, 1, 0, 0, 0, 161, 162, 5, 110, 0, 0, 162, 168, 5, 101, 0, 0, 163, 164, 5, 78, 0, 0, 164, 168, 5, 69, 0, 0, 165, 166, 5, 33, 0, 0, 166, 168, 5, 61, 0, 0, 167, 161, 1, 0, 0, 0, 167, 163, 1, 0, 0, 0, 167, 165, 1, 0, 0, 0, 168, 30, 1, 0, 0, 0, 169, 170, 5, 103, 0, 0, 170, 175, 5, 116, 0, 0, 171, 172, 5, 71, 0, 0, 172, 175, 5, 84, 0, 0, 173, 175, 5, 62, 0, 0, 174, 169, 1, 0, 0, 0, 174, 171, 1, 0, 0, 0, 174, 173, 1, 0, 0, 0, 175, 32, 1, 0, 0, 0, 176, 177, 5, 108, 0, 0, 177, 182, 5, 116, 0, 0, 178, 179, 5, 76, 0, 0, 179, 182, 5, 84, 0, 0, 180, 182, 5, 60, 0, 0, 181, 176, 1, 0, 0, 0, 181, 178, 1, 0, 0, 0, 181, 180, 1, 0, 0, 0, 182, 34, 1, 0, 0, 0, 183, 184, 5, 103, 0, 0, 184, 190, 5, 101, 0, 0, 185, 186, 5, 71, 0, 0, 186, 190, 5, 69, 0, 0, 187, 188, 5, 62, 0, 0, 188, 190, 5, 61, 0, 0, 189, 183, 1, 0, 0, 0, 189, 185, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 190, 36, 1, 0, 0, 0, 191, 192, 5, 108, 0, 0, 192, 198, 5, 101, 0, 0, 193, 194, 5, 76, 0, 0, 194, 198, 5, 69, 0, 0, 195, 196, 5, 60, 0, 0, 196, 198, 5, 61, 0, 0, 197, 191, 1, 0, 0, 0, 197, 193, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 198, 38, 1, 0, 0, 0, 199, 200, 5, 99, 0, 0, 200, 204, 5, 111, 0, 0, 201, 202, 5, 67, 0, 0, 202, 204, 5, 79, 0, 0, 203, 199, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 204, 40, 1, 0, 0, 0, 205, 206, 5, 115, 0, 0, 206, 210, 5, 119, 0, 0, 207, 208, 5, 83, 0, 0, 208, 210, 5, 87, 0, 0, 209, 205, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 210, 42, 1, 0, 0, 0, 211, 212, 5, 101, 0, 0, 212, 216, 5, 119, 0, 0, 213, 214, 5, 69, 0, 0, 214, 216, 5, 87, 0, 0, 215, 211, 1, 0, 0, 0, 215, 213, 1, 0, 0, 0, 216, 44, 1, 0, 0, 0, 217, 221, 3, 51, 25, 0, 218, 220, 3, 47, 23, 0, 219, 218, 1, 0, 0, 0, 220, 223, 1, 0, 0, 0, 221, 219, 1, 0, 0, 0, 221, 222, 1, 0, 0, 0, 222, 46, 1, 0, 0, 0, 223, 221, 1, 0, 0, 0, 224, 228, 7, 0, 0, 0, 225, 228, 3, 49, 24, 0, 226, 228, 3, 51, 25, 0, 227, 224, 1, 0, 0, 0, 227, 225, 1, 0, 0, 0, 227, 226, 1, 0, 0, 0, 228, 48, 1, 0, 0, 0, 229, 230, 2, 48, 57, 0, 230, 50, 1, 0, 0, 0, 231, 232, 7, 1, 0, 0, 232, 52, 1, 0, 0, 0, 233, 234, 3, 81, 40, 0, 234, 235, 5, 46, 0, 0, 235, 236, 3, 81, 40, 0, 236, 237, 5, 46, 0, 0, 237, 238, 3, 81, 40, 0, 238, 54, 1, 0, 0, 0, 239, 245, 5, 34, 0, 0, 240, 244, 3, 73, 36, 0, 241, 244, 8, 2, 0, 0, 242, 244, 3, 57, 28, 0, 243, 240, 1, 0, 0, 0, 243, 241, 1, 0, 0, 0, 243, 242, 1, 0, 0, 0, 244, 247, 1, 0, 0, 0, 245, 243, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 248, 1, 0, 0, 0, 247, 245, 1, 0, 0, 0, 248, 249, 5, 34, 0, 0, 249, 56, 1, 0, 0, 0, 250, 257, 3, 59, 29, 0, 251, 253, 3, 63, 31, 0, 252, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 257, 1, 0, 0, 0, 256, 250, 1, 0, 0, 0, 256, 252, 1, 0, 0, 0, 257, 58, 1, 0, 0, 0, 258, 263, 3, 61, 30, 0, 259, 260, 5, 124, 0, 0, 260, 262, 3, 61, 30, 0, 261, 259, 1, 0, 0, 0, 262, 265, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 60, 1, 0, 0, 0, 265, 263, 1, 0, 0, 0, 266, 271, 5, 40, 0, 0, 267, 270, 3, 63, 31, 0, 268, 270, 3, 61, 30, 0, 269, 267, 1, 0, 0, 0, 269, 268, 1, 0, 0, 0, 270, 273, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 274, 1, 0, 0, 0, 273, 271, 1, 0, 0, 0, 274, 275, 5, 41, 0, 0, 275, 62, 1, 0, 0, 0, 276, 281, 3, 67, 33, 0, 277, 281, 3, 71, 35, 0, 278, 281, 3, 69, 34, 0, 279, 281, 3, 65, 32, 0, 280, 276, 1, 0, 0, 0, 280, 277, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 280, 279, 1, 0, 0, 0, 281, 64, 1, 0, 0, 0, 282, 283, 5, 123, 0, 0, 283, 284, 3, 81, 40, 0, 284, 285, 5, 125, 0, 0, 285, 66, 1, 0, 0, 0, 286, 287, 7, 3, 0, 0, 287, 68, 1, 0, 0, 0, 288, 289, 7, 4, 0, 0, 289, 70, 1, 0, 0, 0, 290, 291, 5, 92, 0, 0, 291, 292, 8, 5, 0, 0, 292, 72, 1, 0, 0, 0, 293, 296, 5, 92, 0, 0, 294, 297, 7, 6, 0, 0, 295, 297, 3, 75, 37, 0, 296, 294, 1, 0, 0, 0, 296, 295, 1, 0, 0, 0, 297, 74, 1, 0, 0, 0, 298, 299, 5, 117, 0, 0, 299, 300, 3, 77, 38, 0, 300, 301, 3, 77, 38, 0, 301, 302, 3, 77, 38, 0, 302, 303, 3, 77, 38, 0, 303, 76, 1, 0, 0, 0, 304, 305, 7, 7, 0, 0, 305, 78, 1, 0, 0, 0, 306, 308, 5, 45, 0, 0, 307, 306, 1, 0, 0, 0, 307, 308, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 310, 3, 81, 40, 0, 310, 312, 5, 46, 0, 0, 311, 313, 7, 8, 0, 0, 312, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 312, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 317, 1, 0, 0, 0, 316, 318, 3, 83, 41, 0, 317, 316, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 80, 1, 0, 0, 0, 319, 328, 5, 48, 0, 0, 320, 324, 7, 9, 0, 0, 321, 323, 7, 8, 0, 0, 322, 321, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 328, 1, 0, 0, 0, 326, 324, 1, 0, 0, 0, 327, 319, 1, 0, 0, 0, 327, 320, 1, 0, 0, 0, 328, 82, 1, 0, 0, 0, 329, 331, 7, 10, 0, 0, 330, 332, 7, 11, 0, 0, 331, 330, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 334, 3, 81, 40, 0, 334, 84, 1, 0, 0, 0, 335, 336, 5, 10, 0, 0, 336, 86, 1, 0, 0, 0, 337, 341, 5, 44, 0, 0, 338, 340, 5, 32, 0, 0, 339, 338, 1, 0, 0, 0, 340, 343, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 88, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 344, 348, 5, 32, 0, 0, 345, 347, 3, 85, 42, 0, 346, 345, 1, 0, 0, 0, 347, 350, 1, 0, 0, 0, 348, 346, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 90, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, 34, 0, 112, 119, 130, 145, 151, 159, 167, 174, 181, 189, 197, 203, 209, 215, 221, 227, 243, 245, 254, 256, 263, 269, 271, 280, 296, 307, 314, 317, 324, 327, 331, 341, 348, 0] \ No newline at end of file diff --git a/parser/JsonQueryLexer.tokens b/parser/JsonQueryLexer.tokens index ac16344..aea46d2 100644 --- a/parser/JsonQueryLexer.tokens +++ b/parser/JsonQueryLexer.tokens @@ -9,25 +9,26 @@ NOT=8 LOGICAL_OPERATOR=9 BOOLEAN=10 NULL=11 -IN=12 -EQ=13 -NE=14 -GT=15 -LT=16 -GE=17 -LE=18 -CO=19 -SW=20 -EW=21 -ATTRNAME=22 -VERSION=23 -STRING=24 -DOUBLE=25 -INT=26 -EXP=27 -NEWLINE=28 -COMMA=29 -SP=30 +LIKE=12 +IN=13 +EQ=14 +NE=15 +GT=16 +LT=17 +GE=18 +LE=19 +CO=20 +SW=21 +EW=22 +ATTRNAME=23 +VERSION=24 +STRING=25 +DOUBLE=26 +INT=27 +EXP=28 +NEWLINE=29 +COMMA=30 +SP=31 '('=1 ')'=2 'pr'=3 @@ -36,4 +37,4 @@ SP=30 '['=6 ']'=7 'null'=11 -'\n'=28 +'\n'=29 diff --git a/parser/bench_test.go b/parser/bench_test.go index 71858a1..1f0d9e6 100644 --- a/parser/bench_test.go +++ b/parser/bench_test.go @@ -12,6 +12,9 @@ var conditions = []string{ `(a > 123 or b <= 456)`, `(aa == 123123131.1232313131312312 or bb == 1231.1312313123123131231)`, `(jh gt "1.2.3" or kl le "1.4.56")`, + `o like "^(https?://)?(www\.)?([a-zA-Z0-9-]{1,63}\.)*[a-zA-Z0-9][a-zA-Z0-9-]{0,61}\.[a-zA-Z]{2,}(:\d+)?(/.*)?$"`, + `p like ".*世界\s.*"`, + `q like "离职.*未关闭"`, } func BenchmarkLogicalExpression(b *testing.B) { @@ -31,6 +34,9 @@ func BenchmarkLogicalExpression(b *testing.B) { "b": 123131, "aa": 123123.123131232113, "jh": "1.2.3", + "o": "https://subdomain.example.org", + "p": "Hello, 世界 means world in Chinese.", + "q": "员工离职后系统账未关闭", } b.ResetTimer() for i := 0; i < b.N; i++ { @@ -58,6 +64,9 @@ func BenchmarkLogicalExpressionBig(b *testing.B) { "b": 123131, "aa": 123123.123131232113, "jh": "1.2.3", + "o": "https://subdomain.example.org", + "p": "Hello, 世界 means world in Chinese.", + "q": "员工离职后系统账未关闭", } b.ResetTimer() for i := 0; i < b.N; i++ { @@ -86,6 +95,9 @@ func BenchmarkLogicalExpressionBigTreeCached(b *testing.B) { "b": 123131, "aa": 123123.123131232113, "jh": "1.2.3", + "o": "https://subdomain.example.org", + "p": "Hello, 世界 means world in Chinese.", + "q": "员工离职后系统账未关闭", } b.ResetTimer() ev, _ := NewEvaluator(rule) @@ -113,6 +125,9 @@ func BenchmarkLogicalExpressionNested(b *testing.B) { "b": 123131, "aa": 123123.123131232113, "jh": "1.2.3", + "o": "https://subdomain.example.org", + "p": "Hello, 世界 means world in Chinese.", + "q": "员工离职后系统账未关闭", } b.ResetTimer() for i := 0; i < b.N; i++ { diff --git a/parser/float_operation.go b/parser/float_operation.go index 23eaac9..150ba77 100644 --- a/parser/float_operation.go +++ b/parser/float_operation.go @@ -80,3 +80,16 @@ func (o *FloatOperation) IN(left Operand, right Operand) (bool, error) { } return false, nil } + +func (o *FloatOperation) LIKE(left Operand, right Operand) (bool, error) { + leftVal, err := toFloat(left) + if err != nil { + return false, newErrInvalidOperand(left, leftVal) + } + rightVal, ok := right.(string) + if !ok { + return false, newErrInvalidOperand(right, rightVal) + } + + return false, nil +} diff --git a/parser/int_operation.go b/parser/int_operation.go index 1bbd1a4..8878926 100644 --- a/parser/int_operation.go +++ b/parser/int_operation.go @@ -84,3 +84,15 @@ func (o *IntOperation) IN(left Operand, right Operand) (bool, error) { } return false, nil } + +func (o *IntOperation) LIKE(left Operand, right Operand) (bool, error) { + leftVal, ok := left.(int) + if !ok { + return false, newErrInvalidOperand(left, leftVal) + } + rightVal, ok := right.(string) + if !ok { + return false, newErrInvalidOperand(right, rightVal) + } + return false, nil +} diff --git a/parser/jsonquery_lexer.go b/parser/jsonquery_lexer.go index de43e6c..b578803 100644 --- a/parser/jsonquery_lexer.go +++ b/parser/jsonquery_lexer.go @@ -44,153 +44,190 @@ func jsonquerylexerLexerInit() { } staticData.LiteralNames = []string{ "", "'('", "')'", "'pr'", "'.'", "'-'", "'['", "']'", "", "", "", "'null'", - "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "'\\n'", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "'\\n'", } staticData.SymbolicNames = []string{ "", "", "", "", "", "", "", "", "NOT", "LOGICAL_OPERATOR", "BOOLEAN", - "NULL", "IN", "EQ", "NE", "GT", "LT", "GE", "LE", "CO", "SW", "EW", - "ATTRNAME", "VERSION", "STRING", "DOUBLE", "INT", "EXP", "NEWLINE", + "NULL", "LIKE", "IN", "EQ", "NE", "GT", "LT", "GE", "LE", "CO", "SW", + "EW", "ATTRNAME", "VERSION", "STRING", "DOUBLE", "INT", "EXP", "NEWLINE", "COMMA", "SP", } staticData.RuleNames = []string{ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "NOT", "LOGICAL_OPERATOR", - "BOOLEAN", "NULL", "IN", "EQ", "NE", "GT", "LT", "GE", "LE", "CO", "SW", - "EW", "ATTRNAME", "ATTR_NAME_CHAR", "DIGIT", "ALPHA", "VERSION", "STRING", - "ESC", "UNICODE", "HEX", "DOUBLE", "INT", "EXP", "NEWLINE", "COMMA", - "SP", + "BOOLEAN", "NULL", "LIKE", "IN", "EQ", "NE", "GT", "LT", "GE", "LE", + "CO", "SW", "EW", "ATTRNAME", "ATTR_NAME_CHAR", "DIGIT", "ALPHA", "VERSION", + "STRING", "REGEX", "CHOICE", "GROUP", "ATOM_CHARACTER", "REPEAT", "CHAR", + "SPECIAL_CHAR", "ESCAPE_CHAR", "ESC", "UNICODE", "HEX", "DOUBLE", "INT", + "EXP", "NEWLINE", "COMMA", "SP", } staticData.PredictionContextCache = antlr.NewPredictionContextCache() staticData.serializedATN = []int32{ - 4, 0, 30, 279, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, + 4, 0, 31, 351, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, - 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 1, 0, - 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, - 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 95, 8, 7, 1, 8, 1, - 8, 1, 8, 1, 8, 1, 8, 3, 8, 102, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, - 9, 1, 9, 1, 9, 1, 9, 3, 9, 113, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, - 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 124, 8, 11, 1, 12, 1, 12, 1, 12, 1, - 12, 1, 12, 1, 12, 3, 12, 132, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, - 1, 13, 3, 13, 140, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 147, - 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 154, 8, 15, 1, 16, 1, - 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 162, 8, 16, 1, 17, 1, 17, 1, 17, - 1, 17, 1, 17, 1, 17, 3, 17, 170, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 3, - 18, 176, 8, 18, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 182, 8, 19, 1, 20, 1, - 20, 1, 20, 1, 20, 3, 20, 188, 8, 20, 1, 21, 1, 21, 5, 21, 192, 8, 21, 10, - 21, 12, 21, 195, 9, 21, 1, 22, 1, 22, 1, 22, 3, 22, 200, 8, 22, 1, 23, - 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, - 26, 1, 26, 5, 26, 215, 8, 26, 10, 26, 12, 26, 218, 9, 26, 1, 26, 1, 26, - 1, 27, 1, 27, 1, 27, 3, 27, 225, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, - 28, 1, 28, 1, 29, 1, 29, 1, 30, 3, 30, 236, 8, 30, 1, 30, 1, 30, 1, 30, - 4, 30, 241, 8, 30, 11, 30, 12, 30, 242, 1, 30, 3, 30, 246, 8, 30, 1, 31, - 1, 31, 1, 31, 5, 31, 251, 8, 31, 10, 31, 12, 31, 254, 9, 31, 3, 31, 256, - 8, 31, 1, 32, 1, 32, 3, 32, 260, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, - 34, 1, 34, 5, 34, 268, 8, 34, 10, 34, 12, 34, 271, 9, 34, 1, 35, 1, 35, - 5, 35, 275, 8, 35, 10, 35, 12, 35, 278, 9, 35, 0, 0, 36, 1, 1, 3, 2, 5, - 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, - 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, - 22, 45, 0, 47, 0, 49, 0, 51, 23, 53, 24, 55, 0, 57, 0, 59, 0, 61, 25, 63, - 26, 65, 27, 67, 28, 69, 29, 71, 30, 1, 0, 9, 3, 0, 45, 45, 58, 58, 95, - 95, 2, 0, 65, 90, 97, 122, 2, 0, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, - 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, - 70, 97, 102, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, - 43, 43, 45, 45, 305, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, - 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, - 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, - 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, - 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, - 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, - 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, - 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, - 0, 0, 1, 73, 1, 0, 0, 0, 3, 75, 1, 0, 0, 0, 5, 77, 1, 0, 0, 0, 7, 80, 1, - 0, 0, 0, 9, 82, 1, 0, 0, 0, 11, 84, 1, 0, 0, 0, 13, 86, 1, 0, 0, 0, 15, - 94, 1, 0, 0, 0, 17, 101, 1, 0, 0, 0, 19, 112, 1, 0, 0, 0, 21, 114, 1, 0, - 0, 0, 23, 123, 1, 0, 0, 0, 25, 131, 1, 0, 0, 0, 27, 139, 1, 0, 0, 0, 29, - 146, 1, 0, 0, 0, 31, 153, 1, 0, 0, 0, 33, 161, 1, 0, 0, 0, 35, 169, 1, - 0, 0, 0, 37, 175, 1, 0, 0, 0, 39, 181, 1, 0, 0, 0, 41, 187, 1, 0, 0, 0, - 43, 189, 1, 0, 0, 0, 45, 199, 1, 0, 0, 0, 47, 201, 1, 0, 0, 0, 49, 203, - 1, 0, 0, 0, 51, 205, 1, 0, 0, 0, 53, 211, 1, 0, 0, 0, 55, 221, 1, 0, 0, - 0, 57, 226, 1, 0, 0, 0, 59, 232, 1, 0, 0, 0, 61, 235, 1, 0, 0, 0, 63, 255, - 1, 0, 0, 0, 65, 257, 1, 0, 0, 0, 67, 263, 1, 0, 0, 0, 69, 265, 1, 0, 0, - 0, 71, 272, 1, 0, 0, 0, 73, 74, 5, 40, 0, 0, 74, 2, 1, 0, 0, 0, 75, 76, - 5, 41, 0, 0, 76, 4, 1, 0, 0, 0, 77, 78, 5, 112, 0, 0, 78, 79, 5, 114, 0, - 0, 79, 6, 1, 0, 0, 0, 80, 81, 5, 46, 0, 0, 81, 8, 1, 0, 0, 0, 82, 83, 5, - 45, 0, 0, 83, 10, 1, 0, 0, 0, 84, 85, 5, 91, 0, 0, 85, 12, 1, 0, 0, 0, - 86, 87, 5, 93, 0, 0, 87, 14, 1, 0, 0, 0, 88, 89, 5, 110, 0, 0, 89, 90, - 5, 111, 0, 0, 90, 95, 5, 116, 0, 0, 91, 92, 5, 78, 0, 0, 92, 93, 5, 79, - 0, 0, 93, 95, 5, 84, 0, 0, 94, 88, 1, 0, 0, 0, 94, 91, 1, 0, 0, 0, 95, - 16, 1, 0, 0, 0, 96, 97, 5, 97, 0, 0, 97, 98, 5, 110, 0, 0, 98, 102, 5, - 100, 0, 0, 99, 100, 5, 111, 0, 0, 100, 102, 5, 114, 0, 0, 101, 96, 1, 0, - 0, 0, 101, 99, 1, 0, 0, 0, 102, 18, 1, 0, 0, 0, 103, 104, 5, 116, 0, 0, - 104, 105, 5, 114, 0, 0, 105, 106, 5, 117, 0, 0, 106, 113, 5, 101, 0, 0, - 107, 108, 5, 102, 0, 0, 108, 109, 5, 97, 0, 0, 109, 110, 5, 108, 0, 0, - 110, 111, 5, 115, 0, 0, 111, 113, 5, 101, 0, 0, 112, 103, 1, 0, 0, 0, 112, - 107, 1, 0, 0, 0, 113, 20, 1, 0, 0, 0, 114, 115, 5, 110, 0, 0, 115, 116, - 5, 117, 0, 0, 116, 117, 5, 108, 0, 0, 117, 118, 5, 108, 0, 0, 118, 22, - 1, 0, 0, 0, 119, 120, 5, 73, 0, 0, 120, 124, 5, 78, 0, 0, 121, 122, 5, - 105, 0, 0, 122, 124, 5, 110, 0, 0, 123, 119, 1, 0, 0, 0, 123, 121, 1, 0, - 0, 0, 124, 24, 1, 0, 0, 0, 125, 126, 5, 101, 0, 0, 126, 132, 5, 113, 0, - 0, 127, 128, 5, 69, 0, 0, 128, 132, 5, 81, 0, 0, 129, 130, 5, 61, 0, 0, - 130, 132, 5, 61, 0, 0, 131, 125, 1, 0, 0, 0, 131, 127, 1, 0, 0, 0, 131, - 129, 1, 0, 0, 0, 132, 26, 1, 0, 0, 0, 133, 134, 5, 110, 0, 0, 134, 140, - 5, 101, 0, 0, 135, 136, 5, 78, 0, 0, 136, 140, 5, 69, 0, 0, 137, 138, 5, - 33, 0, 0, 138, 140, 5, 61, 0, 0, 139, 133, 1, 0, 0, 0, 139, 135, 1, 0, - 0, 0, 139, 137, 1, 0, 0, 0, 140, 28, 1, 0, 0, 0, 141, 142, 5, 103, 0, 0, - 142, 147, 5, 116, 0, 0, 143, 144, 5, 71, 0, 0, 144, 147, 5, 84, 0, 0, 145, - 147, 5, 62, 0, 0, 146, 141, 1, 0, 0, 0, 146, 143, 1, 0, 0, 0, 146, 145, - 1, 0, 0, 0, 147, 30, 1, 0, 0, 0, 148, 149, 5, 108, 0, 0, 149, 154, 5, 116, - 0, 0, 150, 151, 5, 76, 0, 0, 151, 154, 5, 84, 0, 0, 152, 154, 5, 60, 0, - 0, 153, 148, 1, 0, 0, 0, 153, 150, 1, 0, 0, 0, 153, 152, 1, 0, 0, 0, 154, - 32, 1, 0, 0, 0, 155, 156, 5, 103, 0, 0, 156, 162, 5, 101, 0, 0, 157, 158, - 5, 71, 0, 0, 158, 162, 5, 69, 0, 0, 159, 160, 5, 62, 0, 0, 160, 162, 5, - 61, 0, 0, 161, 155, 1, 0, 0, 0, 161, 157, 1, 0, 0, 0, 161, 159, 1, 0, 0, - 0, 162, 34, 1, 0, 0, 0, 163, 164, 5, 108, 0, 0, 164, 170, 5, 101, 0, 0, - 165, 166, 5, 76, 0, 0, 166, 170, 5, 69, 0, 0, 167, 168, 5, 60, 0, 0, 168, - 170, 5, 61, 0, 0, 169, 163, 1, 0, 0, 0, 169, 165, 1, 0, 0, 0, 169, 167, - 1, 0, 0, 0, 170, 36, 1, 0, 0, 0, 171, 172, 5, 99, 0, 0, 172, 176, 5, 111, - 0, 0, 173, 174, 5, 67, 0, 0, 174, 176, 5, 79, 0, 0, 175, 171, 1, 0, 0, - 0, 175, 173, 1, 0, 0, 0, 176, 38, 1, 0, 0, 0, 177, 178, 5, 115, 0, 0, 178, - 182, 5, 119, 0, 0, 179, 180, 5, 83, 0, 0, 180, 182, 5, 87, 0, 0, 181, 177, - 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 182, 40, 1, 0, 0, 0, 183, 184, 5, 101, - 0, 0, 184, 188, 5, 119, 0, 0, 185, 186, 5, 69, 0, 0, 186, 188, 5, 87, 0, - 0, 187, 183, 1, 0, 0, 0, 187, 185, 1, 0, 0, 0, 188, 42, 1, 0, 0, 0, 189, - 193, 3, 49, 24, 0, 190, 192, 3, 45, 22, 0, 191, 190, 1, 0, 0, 0, 192, 195, - 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 44, 1, 0, - 0, 0, 195, 193, 1, 0, 0, 0, 196, 200, 7, 0, 0, 0, 197, 200, 3, 47, 23, - 0, 198, 200, 3, 49, 24, 0, 199, 196, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, - 199, 198, 1, 0, 0, 0, 200, 46, 1, 0, 0, 0, 201, 202, 2, 48, 57, 0, 202, - 48, 1, 0, 0, 0, 203, 204, 7, 1, 0, 0, 204, 50, 1, 0, 0, 0, 205, 206, 3, - 63, 31, 0, 206, 207, 5, 46, 0, 0, 207, 208, 3, 63, 31, 0, 208, 209, 5, - 46, 0, 0, 209, 210, 3, 63, 31, 0, 210, 52, 1, 0, 0, 0, 211, 216, 5, 34, - 0, 0, 212, 215, 3, 55, 27, 0, 213, 215, 8, 2, 0, 0, 214, 212, 1, 0, 0, - 0, 214, 213, 1, 0, 0, 0, 215, 218, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 216, - 217, 1, 0, 0, 0, 217, 219, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 219, 220, - 5, 34, 0, 0, 220, 54, 1, 0, 0, 0, 221, 224, 5, 92, 0, 0, 222, 225, 7, 3, - 0, 0, 223, 225, 3, 57, 28, 0, 224, 222, 1, 0, 0, 0, 224, 223, 1, 0, 0, - 0, 225, 56, 1, 0, 0, 0, 226, 227, 5, 117, 0, 0, 227, 228, 3, 59, 29, 0, - 228, 229, 3, 59, 29, 0, 229, 230, 3, 59, 29, 0, 230, 231, 3, 59, 29, 0, - 231, 58, 1, 0, 0, 0, 232, 233, 7, 4, 0, 0, 233, 60, 1, 0, 0, 0, 234, 236, - 5, 45, 0, 0, 235, 234, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 237, 1, 0, - 0, 0, 237, 238, 3, 63, 31, 0, 238, 240, 5, 46, 0, 0, 239, 241, 7, 5, 0, - 0, 240, 239, 1, 0, 0, 0, 241, 242, 1, 0, 0, 0, 242, 240, 1, 0, 0, 0, 242, - 243, 1, 0, 0, 0, 243, 245, 1, 0, 0, 0, 244, 246, 3, 65, 32, 0, 245, 244, - 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 62, 1, 0, 0, 0, 247, 256, 5, 48, - 0, 0, 248, 252, 7, 6, 0, 0, 249, 251, 7, 5, 0, 0, 250, 249, 1, 0, 0, 0, - 251, 254, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, - 256, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 255, 247, 1, 0, 0, 0, 255, 248, - 1, 0, 0, 0, 256, 64, 1, 0, 0, 0, 257, 259, 7, 7, 0, 0, 258, 260, 7, 8, - 0, 0, 259, 258, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, - 261, 262, 3, 63, 31, 0, 262, 66, 1, 0, 0, 0, 263, 264, 5, 10, 0, 0, 264, - 68, 1, 0, 0, 0, 265, 269, 5, 44, 0, 0, 266, 268, 5, 32, 0, 0, 267, 266, - 1, 0, 0, 0, 268, 271, 1, 0, 0, 0, 269, 267, 1, 0, 0, 0, 269, 270, 1, 0, - 0, 0, 270, 70, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 272, 276, 5, 32, 0, 0, - 273, 275, 3, 67, 33, 0, 274, 273, 1, 0, 0, 0, 275, 278, 1, 0, 0, 0, 276, - 274, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 72, 1, 0, 0, 0, 278, 276, 1, - 0, 0, 0, 27, 0, 94, 101, 112, 123, 131, 139, 146, 153, 161, 169, 175, 181, - 187, 193, 199, 214, 216, 224, 235, 242, 245, 252, 255, 259, 269, 276, 0, + 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, + 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, + 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 1, 0, 1, 0, 1, 1, 1, 1, 1, + 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, + 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 113, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, + 8, 3, 8, 120, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, + 9, 3, 9, 131, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, + 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 146, 8, 11, 1, 12, 1, 12, + 1, 12, 1, 12, 3, 12, 152, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, + 13, 3, 13, 160, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, + 168, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 175, 8, 15, 1, 16, + 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 182, 8, 16, 1, 17, 1, 17, 1, 17, 1, + 17, 1, 17, 1, 17, 3, 17, 190, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, + 1, 18, 3, 18, 198, 8, 18, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 204, 8, 19, + 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 210, 8, 20, 1, 21, 1, 21, 1, 21, 1, + 21, 3, 21, 216, 8, 21, 1, 22, 1, 22, 5, 22, 220, 8, 22, 10, 22, 12, 22, + 223, 9, 22, 1, 23, 1, 23, 1, 23, 3, 23, 228, 8, 23, 1, 24, 1, 24, 1, 25, + 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, + 27, 5, 27, 244, 8, 27, 10, 27, 12, 27, 247, 9, 27, 1, 27, 1, 27, 1, 28, + 1, 28, 4, 28, 253, 8, 28, 11, 28, 12, 28, 254, 3, 28, 257, 8, 28, 1, 29, + 1, 29, 1, 29, 5, 29, 262, 8, 29, 10, 29, 12, 29, 265, 9, 29, 1, 30, 1, + 30, 1, 30, 5, 30, 270, 8, 30, 10, 30, 12, 30, 273, 9, 30, 1, 30, 1, 30, + 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 281, 8, 31, 1, 32, 1, 32, 1, 32, 1, + 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, + 3, 36, 297, 8, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, + 38, 1, 39, 3, 39, 308, 8, 39, 1, 39, 1, 39, 1, 39, 4, 39, 313, 8, 39, 11, + 39, 12, 39, 314, 1, 39, 3, 39, 318, 8, 39, 1, 40, 1, 40, 1, 40, 5, 40, + 323, 8, 40, 10, 40, 12, 40, 326, 9, 40, 3, 40, 328, 8, 40, 1, 41, 1, 41, + 3, 41, 332, 8, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 5, 43, 340, + 8, 43, 10, 43, 12, 43, 343, 9, 43, 1, 44, 1, 44, 5, 44, 347, 8, 44, 10, + 44, 12, 44, 350, 9, 44, 0, 0, 45, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, + 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, + 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 0, 49, + 0, 51, 0, 53, 24, 55, 25, 57, 0, 59, 0, 61, 0, 63, 0, 65, 0, 67, 0, 69, + 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 26, 81, 27, 83, 28, 85, 29, 87, 30, + 89, 31, 1, 0, 12, 3, 0, 45, 45, 58, 58, 95, 95, 2, 0, 65, 90, 97, 122, + 2, 0, 34, 34, 92, 92, 3, 0, 48, 57, 65, 90, 97, 122, 6, 0, 32, 33, 36, + 47, 58, 63, 91, 94, 96, 96, 123, 126, 6, 0, 97, 98, 102, 102, 110, 110, + 114, 114, 116, 116, 118, 118, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, + 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, + 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 379, + 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, + 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, + 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, + 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, + 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, + 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, + 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, + 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, + 0, 1, 91, 1, 0, 0, 0, 3, 93, 1, 0, 0, 0, 5, 95, 1, 0, 0, 0, 7, 98, 1, 0, + 0, 0, 9, 100, 1, 0, 0, 0, 11, 102, 1, 0, 0, 0, 13, 104, 1, 0, 0, 0, 15, + 112, 1, 0, 0, 0, 17, 119, 1, 0, 0, 0, 19, 130, 1, 0, 0, 0, 21, 132, 1, + 0, 0, 0, 23, 145, 1, 0, 0, 0, 25, 151, 1, 0, 0, 0, 27, 159, 1, 0, 0, 0, + 29, 167, 1, 0, 0, 0, 31, 174, 1, 0, 0, 0, 33, 181, 1, 0, 0, 0, 35, 189, + 1, 0, 0, 0, 37, 197, 1, 0, 0, 0, 39, 203, 1, 0, 0, 0, 41, 209, 1, 0, 0, + 0, 43, 215, 1, 0, 0, 0, 45, 217, 1, 0, 0, 0, 47, 227, 1, 0, 0, 0, 49, 229, + 1, 0, 0, 0, 51, 231, 1, 0, 0, 0, 53, 233, 1, 0, 0, 0, 55, 239, 1, 0, 0, + 0, 57, 256, 1, 0, 0, 0, 59, 258, 1, 0, 0, 0, 61, 266, 1, 0, 0, 0, 63, 280, + 1, 0, 0, 0, 65, 282, 1, 0, 0, 0, 67, 286, 1, 0, 0, 0, 69, 288, 1, 0, 0, + 0, 71, 290, 1, 0, 0, 0, 73, 293, 1, 0, 0, 0, 75, 298, 1, 0, 0, 0, 77, 304, + 1, 0, 0, 0, 79, 307, 1, 0, 0, 0, 81, 327, 1, 0, 0, 0, 83, 329, 1, 0, 0, + 0, 85, 335, 1, 0, 0, 0, 87, 337, 1, 0, 0, 0, 89, 344, 1, 0, 0, 0, 91, 92, + 5, 40, 0, 0, 92, 2, 1, 0, 0, 0, 93, 94, 5, 41, 0, 0, 94, 4, 1, 0, 0, 0, + 95, 96, 5, 112, 0, 0, 96, 97, 5, 114, 0, 0, 97, 6, 1, 0, 0, 0, 98, 99, + 5, 46, 0, 0, 99, 8, 1, 0, 0, 0, 100, 101, 5, 45, 0, 0, 101, 10, 1, 0, 0, + 0, 102, 103, 5, 91, 0, 0, 103, 12, 1, 0, 0, 0, 104, 105, 5, 93, 0, 0, 105, + 14, 1, 0, 0, 0, 106, 107, 5, 110, 0, 0, 107, 108, 5, 111, 0, 0, 108, 113, + 5, 116, 0, 0, 109, 110, 5, 78, 0, 0, 110, 111, 5, 79, 0, 0, 111, 113, 5, + 84, 0, 0, 112, 106, 1, 0, 0, 0, 112, 109, 1, 0, 0, 0, 113, 16, 1, 0, 0, + 0, 114, 115, 5, 97, 0, 0, 115, 116, 5, 110, 0, 0, 116, 120, 5, 100, 0, + 0, 117, 118, 5, 111, 0, 0, 118, 120, 5, 114, 0, 0, 119, 114, 1, 0, 0, 0, + 119, 117, 1, 0, 0, 0, 120, 18, 1, 0, 0, 0, 121, 122, 5, 116, 0, 0, 122, + 123, 5, 114, 0, 0, 123, 124, 5, 117, 0, 0, 124, 131, 5, 101, 0, 0, 125, + 126, 5, 102, 0, 0, 126, 127, 5, 97, 0, 0, 127, 128, 5, 108, 0, 0, 128, + 129, 5, 115, 0, 0, 129, 131, 5, 101, 0, 0, 130, 121, 1, 0, 0, 0, 130, 125, + 1, 0, 0, 0, 131, 20, 1, 0, 0, 0, 132, 133, 5, 110, 0, 0, 133, 134, 5, 117, + 0, 0, 134, 135, 5, 108, 0, 0, 135, 136, 5, 108, 0, 0, 136, 22, 1, 0, 0, + 0, 137, 138, 5, 108, 0, 0, 138, 139, 5, 105, 0, 0, 139, 140, 5, 107, 0, + 0, 140, 146, 5, 101, 0, 0, 141, 142, 5, 114, 0, 0, 142, 143, 5, 101, 0, + 0, 143, 144, 5, 103, 0, 0, 144, 146, 5, 120, 0, 0, 145, 137, 1, 0, 0, 0, + 145, 141, 1, 0, 0, 0, 146, 24, 1, 0, 0, 0, 147, 148, 5, 73, 0, 0, 148, + 152, 5, 78, 0, 0, 149, 150, 5, 105, 0, 0, 150, 152, 5, 110, 0, 0, 151, + 147, 1, 0, 0, 0, 151, 149, 1, 0, 0, 0, 152, 26, 1, 0, 0, 0, 153, 154, 5, + 101, 0, 0, 154, 160, 5, 113, 0, 0, 155, 156, 5, 69, 0, 0, 156, 160, 5, + 81, 0, 0, 157, 158, 5, 61, 0, 0, 158, 160, 5, 61, 0, 0, 159, 153, 1, 0, + 0, 0, 159, 155, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 160, 28, 1, 0, 0, 0, + 161, 162, 5, 110, 0, 0, 162, 168, 5, 101, 0, 0, 163, 164, 5, 78, 0, 0, + 164, 168, 5, 69, 0, 0, 165, 166, 5, 33, 0, 0, 166, 168, 5, 61, 0, 0, 167, + 161, 1, 0, 0, 0, 167, 163, 1, 0, 0, 0, 167, 165, 1, 0, 0, 0, 168, 30, 1, + 0, 0, 0, 169, 170, 5, 103, 0, 0, 170, 175, 5, 116, 0, 0, 171, 172, 5, 71, + 0, 0, 172, 175, 5, 84, 0, 0, 173, 175, 5, 62, 0, 0, 174, 169, 1, 0, 0, + 0, 174, 171, 1, 0, 0, 0, 174, 173, 1, 0, 0, 0, 175, 32, 1, 0, 0, 0, 176, + 177, 5, 108, 0, 0, 177, 182, 5, 116, 0, 0, 178, 179, 5, 76, 0, 0, 179, + 182, 5, 84, 0, 0, 180, 182, 5, 60, 0, 0, 181, 176, 1, 0, 0, 0, 181, 178, + 1, 0, 0, 0, 181, 180, 1, 0, 0, 0, 182, 34, 1, 0, 0, 0, 183, 184, 5, 103, + 0, 0, 184, 190, 5, 101, 0, 0, 185, 186, 5, 71, 0, 0, 186, 190, 5, 69, 0, + 0, 187, 188, 5, 62, 0, 0, 188, 190, 5, 61, 0, 0, 189, 183, 1, 0, 0, 0, + 189, 185, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 190, 36, 1, 0, 0, 0, 191, 192, + 5, 108, 0, 0, 192, 198, 5, 101, 0, 0, 193, 194, 5, 76, 0, 0, 194, 198, + 5, 69, 0, 0, 195, 196, 5, 60, 0, 0, 196, 198, 5, 61, 0, 0, 197, 191, 1, + 0, 0, 0, 197, 193, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 198, 38, 1, 0, 0, + 0, 199, 200, 5, 99, 0, 0, 200, 204, 5, 111, 0, 0, 201, 202, 5, 67, 0, 0, + 202, 204, 5, 79, 0, 0, 203, 199, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 204, + 40, 1, 0, 0, 0, 205, 206, 5, 115, 0, 0, 206, 210, 5, 119, 0, 0, 207, 208, + 5, 83, 0, 0, 208, 210, 5, 87, 0, 0, 209, 205, 1, 0, 0, 0, 209, 207, 1, + 0, 0, 0, 210, 42, 1, 0, 0, 0, 211, 212, 5, 101, 0, 0, 212, 216, 5, 119, + 0, 0, 213, 214, 5, 69, 0, 0, 214, 216, 5, 87, 0, 0, 215, 211, 1, 0, 0, + 0, 215, 213, 1, 0, 0, 0, 216, 44, 1, 0, 0, 0, 217, 221, 3, 51, 25, 0, 218, + 220, 3, 47, 23, 0, 219, 218, 1, 0, 0, 0, 220, 223, 1, 0, 0, 0, 221, 219, + 1, 0, 0, 0, 221, 222, 1, 0, 0, 0, 222, 46, 1, 0, 0, 0, 223, 221, 1, 0, + 0, 0, 224, 228, 7, 0, 0, 0, 225, 228, 3, 49, 24, 0, 226, 228, 3, 51, 25, + 0, 227, 224, 1, 0, 0, 0, 227, 225, 1, 0, 0, 0, 227, 226, 1, 0, 0, 0, 228, + 48, 1, 0, 0, 0, 229, 230, 2, 48, 57, 0, 230, 50, 1, 0, 0, 0, 231, 232, + 7, 1, 0, 0, 232, 52, 1, 0, 0, 0, 233, 234, 3, 81, 40, 0, 234, 235, 5, 46, + 0, 0, 235, 236, 3, 81, 40, 0, 236, 237, 5, 46, 0, 0, 237, 238, 3, 81, 40, + 0, 238, 54, 1, 0, 0, 0, 239, 245, 5, 34, 0, 0, 240, 244, 3, 73, 36, 0, + 241, 244, 8, 2, 0, 0, 242, 244, 3, 57, 28, 0, 243, 240, 1, 0, 0, 0, 243, + 241, 1, 0, 0, 0, 243, 242, 1, 0, 0, 0, 244, 247, 1, 0, 0, 0, 245, 243, + 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 248, 1, 0, 0, 0, 247, 245, 1, 0, + 0, 0, 248, 249, 5, 34, 0, 0, 249, 56, 1, 0, 0, 0, 250, 257, 3, 59, 29, + 0, 251, 253, 3, 63, 31, 0, 252, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, + 254, 252, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 257, 1, 0, 0, 0, 256, + 250, 1, 0, 0, 0, 256, 252, 1, 0, 0, 0, 257, 58, 1, 0, 0, 0, 258, 263, 3, + 61, 30, 0, 259, 260, 5, 124, 0, 0, 260, 262, 3, 61, 30, 0, 261, 259, 1, + 0, 0, 0, 262, 265, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, + 0, 264, 60, 1, 0, 0, 0, 265, 263, 1, 0, 0, 0, 266, 271, 5, 40, 0, 0, 267, + 270, 3, 63, 31, 0, 268, 270, 3, 61, 30, 0, 269, 267, 1, 0, 0, 0, 269, 268, + 1, 0, 0, 0, 270, 273, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 271, 272, 1, 0, + 0, 0, 272, 274, 1, 0, 0, 0, 273, 271, 1, 0, 0, 0, 274, 275, 5, 41, 0, 0, + 275, 62, 1, 0, 0, 0, 276, 281, 3, 67, 33, 0, 277, 281, 3, 71, 35, 0, 278, + 281, 3, 69, 34, 0, 279, 281, 3, 65, 32, 0, 280, 276, 1, 0, 0, 0, 280, 277, + 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 280, 279, 1, 0, 0, 0, 281, 64, 1, 0, + 0, 0, 282, 283, 5, 123, 0, 0, 283, 284, 3, 81, 40, 0, 284, 285, 5, 125, + 0, 0, 285, 66, 1, 0, 0, 0, 286, 287, 7, 3, 0, 0, 287, 68, 1, 0, 0, 0, 288, + 289, 7, 4, 0, 0, 289, 70, 1, 0, 0, 0, 290, 291, 5, 92, 0, 0, 291, 292, + 8, 5, 0, 0, 292, 72, 1, 0, 0, 0, 293, 296, 5, 92, 0, 0, 294, 297, 7, 6, + 0, 0, 295, 297, 3, 75, 37, 0, 296, 294, 1, 0, 0, 0, 296, 295, 1, 0, 0, + 0, 297, 74, 1, 0, 0, 0, 298, 299, 5, 117, 0, 0, 299, 300, 3, 77, 38, 0, + 300, 301, 3, 77, 38, 0, 301, 302, 3, 77, 38, 0, 302, 303, 3, 77, 38, 0, + 303, 76, 1, 0, 0, 0, 304, 305, 7, 7, 0, 0, 305, 78, 1, 0, 0, 0, 306, 308, + 5, 45, 0, 0, 307, 306, 1, 0, 0, 0, 307, 308, 1, 0, 0, 0, 308, 309, 1, 0, + 0, 0, 309, 310, 3, 81, 40, 0, 310, 312, 5, 46, 0, 0, 311, 313, 7, 8, 0, + 0, 312, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 312, 1, 0, 0, 0, 314, + 315, 1, 0, 0, 0, 315, 317, 1, 0, 0, 0, 316, 318, 3, 83, 41, 0, 317, 316, + 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 80, 1, 0, 0, 0, 319, 328, 5, 48, + 0, 0, 320, 324, 7, 9, 0, 0, 321, 323, 7, 8, 0, 0, 322, 321, 1, 0, 0, 0, + 323, 326, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, + 328, 1, 0, 0, 0, 326, 324, 1, 0, 0, 0, 327, 319, 1, 0, 0, 0, 327, 320, + 1, 0, 0, 0, 328, 82, 1, 0, 0, 0, 329, 331, 7, 10, 0, 0, 330, 332, 7, 11, + 0, 0, 331, 330, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, + 333, 334, 3, 81, 40, 0, 334, 84, 1, 0, 0, 0, 335, 336, 5, 10, 0, 0, 336, + 86, 1, 0, 0, 0, 337, 341, 5, 44, 0, 0, 338, 340, 5, 32, 0, 0, 339, 338, + 1, 0, 0, 0, 340, 343, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, + 0, 0, 342, 88, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 344, 348, 5, 32, 0, 0, + 345, 347, 3, 85, 42, 0, 346, 345, 1, 0, 0, 0, 347, 350, 1, 0, 0, 0, 348, + 346, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 90, 1, 0, 0, 0, 350, 348, 1, + 0, 0, 0, 34, 0, 112, 119, 130, 145, 151, 159, 167, 174, 181, 189, 197, + 203, 209, 215, 221, 227, 243, 245, 254, 256, 263, 269, 271, 280, 296, 307, + 314, 317, 324, 327, 331, 341, 348, 0, } deserializer := antlr.NewATNDeserializer(nil) staticData.atn = deserializer.Deserialize(staticData.serializedATN) @@ -242,23 +279,24 @@ const ( JsonQueryLexerLOGICAL_OPERATOR = 9 JsonQueryLexerBOOLEAN = 10 JsonQueryLexerNULL = 11 - JsonQueryLexerIN = 12 - JsonQueryLexerEQ = 13 - JsonQueryLexerNE = 14 - JsonQueryLexerGT = 15 - JsonQueryLexerLT = 16 - JsonQueryLexerGE = 17 - JsonQueryLexerLE = 18 - JsonQueryLexerCO = 19 - JsonQueryLexerSW = 20 - JsonQueryLexerEW = 21 - JsonQueryLexerATTRNAME = 22 - JsonQueryLexerVERSION = 23 - JsonQueryLexerSTRING = 24 - JsonQueryLexerDOUBLE = 25 - JsonQueryLexerINT = 26 - JsonQueryLexerEXP = 27 - JsonQueryLexerNEWLINE = 28 - JsonQueryLexerCOMMA = 29 - JsonQueryLexerSP = 30 + JsonQueryLexerLIKE = 12 + JsonQueryLexerIN = 13 + JsonQueryLexerEQ = 14 + JsonQueryLexerNE = 15 + JsonQueryLexerGT = 16 + JsonQueryLexerLT = 17 + JsonQueryLexerGE = 18 + JsonQueryLexerLE = 19 + JsonQueryLexerCO = 20 + JsonQueryLexerSW = 21 + JsonQueryLexerEW = 22 + JsonQueryLexerATTRNAME = 23 + JsonQueryLexerVERSION = 24 + JsonQueryLexerSTRING = 25 + JsonQueryLexerDOUBLE = 26 + JsonQueryLexerINT = 27 + JsonQueryLexerEXP = 28 + JsonQueryLexerNEWLINE = 29 + JsonQueryLexerCOMMA = 30 + JsonQueryLexerSP = 31 ) diff --git a/parser/jsonquery_parser.go b/parser/jsonquery_parser.go index 771c69f..721bd3d 100644 --- a/parser/jsonquery_parser.go +++ b/parser/jsonquery_parser.go @@ -34,12 +34,13 @@ func jsonqueryParserInit() { staticData := &JsonQueryParserStaticData staticData.LiteralNames = []string{ "", "'('", "')'", "'pr'", "'.'", "'-'", "'['", "']'", "", "", "", "'null'", - "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "'\\n'", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "'\\n'", } staticData.SymbolicNames = []string{ "", "", "", "", "", "", "", "", "NOT", "LOGICAL_OPERATOR", "BOOLEAN", - "NULL", "IN", "EQ", "NE", "GT", "LT", "GE", "LE", "CO", "SW", "EW", - "ATTRNAME", "VERSION", "STRING", "DOUBLE", "INT", "EXP", "NEWLINE", + "NULL", "LIKE", "IN", "EQ", "NE", "GT", "LT", "GE", "LE", "CO", "SW", + "EW", "ATTRNAME", "VERSION", "STRING", "DOUBLE", "INT", "EXP", "NEWLINE", "COMMA", "SP", } staticData.RuleNames = []string{ @@ -48,7 +49,7 @@ func jsonqueryParserInit() { } staticData.PredictionContextCache = antlr.NewPredictionContextCache() staticData.serializedATN = []int32{ - 4, 1, 30, 114, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, + 4, 1, 31, 114, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 1, 0, 1, 0, 3, 0, 23, 8, 0, 1, 0, 3, 0, 26, 8, 0, 1, 0, 1, 0, 3, 0, 30, 8, 0, 1, 0, 1, 0, 3, 0, 34, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, @@ -59,41 +60,41 @@ func jsonqueryParserInit() { 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 92, 8, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 102, 8, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 112, 8, 9, 1, 9, 0, 1, 0, 10, 0, 2, 4, 6, 8, 10, 12, - 14, 16, 18, 0, 1, 1, 0, 12, 21, 124, 0, 47, 1, 0, 0, 0, 2, 59, 1, 0, 0, + 14, 16, 18, 0, 1, 1, 0, 12, 22, 124, 0, 47, 1, 0, 0, 0, 2, 59, 1, 0, 0, 0, 4, 63, 1, 0, 0, 0, 6, 81, 1, 0, 0, 0, 8, 83, 1, 0, 0, 0, 10, 91, 1, 0, 0, 0, 12, 93, 1, 0, 0, 0, 14, 101, 1, 0, 0, 0, 16, 103, 1, 0, 0, 0, 18, 111, 1, 0, 0, 0, 20, 22, 6, 0, -1, 0, 21, 23, 5, 8, 0, 0, 22, 21, 1, - 0, 0, 0, 22, 23, 1, 0, 0, 0, 23, 25, 1, 0, 0, 0, 24, 26, 5, 30, 0, 0, 25, + 0, 0, 0, 22, 23, 1, 0, 0, 0, 23, 25, 1, 0, 0, 0, 24, 26, 5, 31, 0, 0, 25, 24, 1, 0, 0, 0, 25, 26, 1, 0, 0, 0, 26, 27, 1, 0, 0, 0, 27, 29, 5, 1, 0, - 0, 28, 30, 5, 30, 0, 0, 29, 28, 1, 0, 0, 0, 29, 30, 1, 0, 0, 0, 30, 31, - 1, 0, 0, 0, 31, 33, 3, 0, 0, 0, 32, 34, 5, 30, 0, 0, 33, 32, 1, 0, 0, 0, + 0, 28, 30, 5, 31, 0, 0, 29, 28, 1, 0, 0, 0, 29, 30, 1, 0, 0, 0, 30, 31, + 1, 0, 0, 0, 31, 33, 3, 0, 0, 0, 32, 34, 5, 31, 0, 0, 33, 32, 1, 0, 0, 0, 33, 34, 1, 0, 0, 0, 34, 35, 1, 0, 0, 0, 35, 36, 5, 2, 0, 0, 36, 48, 1, - 0, 0, 0, 37, 38, 3, 2, 1, 0, 38, 39, 5, 30, 0, 0, 39, 40, 5, 3, 0, 0, 40, - 48, 1, 0, 0, 0, 41, 42, 3, 2, 1, 0, 42, 43, 5, 30, 0, 0, 43, 44, 7, 0, - 0, 0, 44, 45, 5, 30, 0, 0, 45, 46, 3, 6, 3, 0, 46, 48, 1, 0, 0, 0, 47, + 0, 0, 0, 37, 38, 3, 2, 1, 0, 38, 39, 5, 31, 0, 0, 39, 40, 5, 3, 0, 0, 40, + 48, 1, 0, 0, 0, 41, 42, 3, 2, 1, 0, 42, 43, 5, 31, 0, 0, 43, 44, 7, 0, + 0, 0, 44, 45, 5, 31, 0, 0, 45, 46, 3, 6, 3, 0, 46, 48, 1, 0, 0, 0, 47, 20, 1, 0, 0, 0, 47, 37, 1, 0, 0, 0, 47, 41, 1, 0, 0, 0, 48, 56, 1, 0, 0, - 0, 49, 50, 10, 3, 0, 0, 50, 51, 5, 30, 0, 0, 51, 52, 5, 9, 0, 0, 52, 53, - 5, 30, 0, 0, 53, 55, 3, 0, 0, 4, 54, 49, 1, 0, 0, 0, 55, 58, 1, 0, 0, 0, + 0, 49, 50, 10, 3, 0, 0, 50, 51, 5, 31, 0, 0, 51, 52, 5, 9, 0, 0, 52, 53, + 5, 31, 0, 0, 53, 55, 3, 0, 0, 4, 54, 49, 1, 0, 0, 0, 55, 58, 1, 0, 0, 0, 56, 54, 1, 0, 0, 0, 56, 57, 1, 0, 0, 0, 57, 1, 1, 0, 0, 0, 58, 56, 1, 0, - 0, 0, 59, 61, 5, 22, 0, 0, 60, 62, 3, 4, 2, 0, 61, 60, 1, 0, 0, 0, 61, + 0, 0, 59, 61, 5, 23, 0, 0, 60, 62, 3, 4, 2, 0, 61, 60, 1, 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 3, 1, 0, 0, 0, 63, 64, 5, 4, 0, 0, 64, 65, 3, 2, 1, 0, 65, 5, 1, 0, 0, 0, 66, 82, 5, 10, 0, 0, 67, 82, 5, 11, 0, 0, 68, 82, - 5, 23, 0, 0, 69, 82, 5, 24, 0, 0, 70, 82, 5, 25, 0, 0, 71, 73, 5, 5, 0, + 5, 24, 0, 0, 69, 82, 5, 25, 0, 0, 70, 82, 5, 26, 0, 0, 71, 73, 5, 5, 0, 0, 72, 71, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 76, - 5, 26, 0, 0, 75, 77, 5, 27, 0, 0, 76, 75, 1, 0, 0, 0, 76, 77, 1, 0, 0, + 5, 27, 0, 0, 75, 77, 5, 28, 0, 0, 76, 75, 1, 0, 0, 0, 76, 77, 1, 0, 0, 0, 77, 82, 1, 0, 0, 0, 78, 82, 3, 16, 8, 0, 79, 82, 3, 12, 6, 0, 80, 82, 3, 8, 4, 0, 81, 66, 1, 0, 0, 0, 81, 67, 1, 0, 0, 0, 81, 68, 1, 0, 0, 0, 81, 69, 1, 0, 0, 0, 81, 70, 1, 0, 0, 0, 81, 72, 1, 0, 0, 0, 81, 78, 1, 0, 0, 0, 81, 79, 1, 0, 0, 0, 81, 80, 1, 0, 0, 0, 82, 7, 1, 0, 0, 0, 83, - 84, 5, 6, 0, 0, 84, 85, 3, 10, 5, 0, 85, 9, 1, 0, 0, 0, 86, 87, 5, 24, - 0, 0, 87, 88, 5, 29, 0, 0, 88, 92, 3, 10, 5, 0, 89, 90, 5, 24, 0, 0, 90, + 84, 5, 6, 0, 0, 84, 85, 3, 10, 5, 0, 85, 9, 1, 0, 0, 0, 86, 87, 5, 25, + 0, 0, 87, 88, 5, 30, 0, 0, 88, 92, 3, 10, 5, 0, 89, 90, 5, 25, 0, 0, 90, 92, 5, 7, 0, 0, 91, 86, 1, 0, 0, 0, 91, 89, 1, 0, 0, 0, 92, 11, 1, 0, 0, 0, 93, 94, 5, 6, 0, 0, 94, 95, 3, 14, 7, 0, 95, 13, 1, 0, 0, 0, 96, 97, - 5, 25, 0, 0, 97, 98, 5, 29, 0, 0, 98, 102, 3, 14, 7, 0, 99, 100, 5, 25, + 5, 26, 0, 0, 97, 98, 5, 30, 0, 0, 98, 102, 3, 14, 7, 0, 99, 100, 5, 26, 0, 0, 100, 102, 5, 7, 0, 0, 101, 96, 1, 0, 0, 0, 101, 99, 1, 0, 0, 0, 102, 15, 1, 0, 0, 0, 103, 104, 5, 6, 0, 0, 104, 105, 3, 18, 9, 0, 105, 17, 1, - 0, 0, 0, 106, 107, 5, 26, 0, 0, 107, 108, 5, 29, 0, 0, 108, 112, 3, 18, - 9, 0, 109, 110, 5, 26, 0, 0, 110, 112, 5, 7, 0, 0, 111, 106, 1, 0, 0, 0, + 0, 0, 0, 106, 107, 5, 27, 0, 0, 107, 108, 5, 30, 0, 0, 108, 112, 3, 18, + 9, 0, 109, 110, 5, 27, 0, 0, 110, 112, 5, 7, 0, 0, 111, 106, 1, 0, 0, 0, 111, 109, 1, 0, 0, 0, 112, 19, 1, 0, 0, 0, 13, 22, 25, 29, 33, 47, 56, 61, 72, 76, 81, 91, 101, 111, } @@ -145,25 +146,26 @@ const ( JsonQueryParserLOGICAL_OPERATOR = 9 JsonQueryParserBOOLEAN = 10 JsonQueryParserNULL = 11 - JsonQueryParserIN = 12 - JsonQueryParserEQ = 13 - JsonQueryParserNE = 14 - JsonQueryParserGT = 15 - JsonQueryParserLT = 16 - JsonQueryParserGE = 17 - JsonQueryParserLE = 18 - JsonQueryParserCO = 19 - JsonQueryParserSW = 20 - JsonQueryParserEW = 21 - JsonQueryParserATTRNAME = 22 - JsonQueryParserVERSION = 23 - JsonQueryParserSTRING = 24 - JsonQueryParserDOUBLE = 25 - JsonQueryParserINT = 26 - JsonQueryParserEXP = 27 - JsonQueryParserNEWLINE = 28 - JsonQueryParserCOMMA = 29 - JsonQueryParserSP = 30 + JsonQueryParserLIKE = 12 + JsonQueryParserIN = 13 + JsonQueryParserEQ = 14 + JsonQueryParserNE = 15 + JsonQueryParserGT = 16 + JsonQueryParserLT = 17 + JsonQueryParserGE = 18 + JsonQueryParserLE = 19 + JsonQueryParserCO = 20 + JsonQueryParserSW = 21 + JsonQueryParserEW = 22 + JsonQueryParserATTRNAME = 23 + JsonQueryParserVERSION = 24 + JsonQueryParserSTRING = 25 + JsonQueryParserDOUBLE = 26 + JsonQueryParserINT = 27 + JsonQueryParserEXP = 28 + JsonQueryParserNEWLINE = 29 + JsonQueryParserCOMMA = 30 + JsonQueryParserSP = 31 ) // JsonQueryParser rules. @@ -337,6 +339,10 @@ func (s *CompareExpContext) IN() antlr.TerminalNode { return s.GetToken(JsonQueryParserIN, 0) } +func (s *CompareExpContext) LIKE() antlr.TerminalNode { + return s.GetToken(JsonQueryParserLIKE, 0) +} + func (s *CompareExpContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { switch t := visitor.(type) { case JsonQueryVisitor: @@ -703,7 +709,7 @@ func (p *JsonQueryParser) query(_p int) (localctx IQueryContext) { _la = p.GetTokenStream().LA(1) - if !((int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&4190208) != 0) { + if !((int64(_la) & ^0x3f) == 0 && ((int64(1)<<_la)&8384512) != 0) { var _ri = p.GetErrorHandler().RecoverInline(p) localctx.(*CompareExpContext).op = _ri diff --git a/parser/jsonquery_visitor_impl.go b/parser/jsonquery_visitor_impl.go index b9a53ab..7863fc9 100644 --- a/parser/jsonquery_visitor_impl.go +++ b/parser/jsonquery_visitor_impl.go @@ -145,6 +145,8 @@ func (j *JsonQueryVisitorImpl) VisitCompareExp(ctx *CompareExpContext) interface apply = currentOp.EW case JsonQueryParserIN: apply = currentOp.IN + case JsonQueryLexerLIKE: + apply = currentOp.LIKE default: j.setErr(fmt.Errorf("Unknown operation %s", ctx.op.GetText())) return false diff --git a/parser/null_operation.go b/parser/null_operation.go index 3dfb487..e896d5b 100644 --- a/parser/null_operation.go +++ b/parser/null_operation.go @@ -42,3 +42,7 @@ func (o *NullOperation) EW(left Operand, right Operand) (bool, error) { func (o *NullOperation) IN(left Operand, right Operand) (bool, error) { return false, ErrInvalidOperation } + +func (o *NullOperation) LIKE(left Operand, right Operand) (bool, error) { + return false, ErrInvalidOperation +} diff --git a/parser/operation.go b/parser/operation.go index f84eca3..f3b721e 100644 --- a/parser/operation.go +++ b/parser/operation.go @@ -70,4 +70,5 @@ type Operation interface { SW(left Operand, right Operand) (bool, error) EW(left Operand, right Operand) (bool, error) IN(left Operand, right Operand) (bool, error) + LIKE(left Operand, right Operand) (bool, error) } diff --git a/parser/parse_simple_test.go b/parser/parse_simple_test.go index 3243447..68557d0 100644 --- a/parser/parse_simple_test.go +++ b/parser/parse_simple_test.go @@ -1235,6 +1235,70 @@ func TestString(t *testing.T) { false, false, }, + { + `x regx "^\d.*"`, + obj{ + "x": "123bbc", + }, + true, + false, + }, + { + `x regx "^\d.*"`, + obj{ + "x": "bbc123", + }, + false, + false, + }, + { + `x like "a{3}|b[c-d]"`, + obj{ + "x": "aaa", + }, + true, + false, + }, + { + `x like "a{3}|b[c-d]"`, + obj{ + "x": "baa", + }, + false, + false, + }, + { + `x like "^(https?://)?(www\.)?([a-zA-Z0-9-]{1,63}\.)*[a-zA-Z0-9][a-zA-Z0-9-]{0,61}\.[a-zA-Z]{2,}(:\d+)?(/.*)?$"`, + obj{ + "x": "https://subdomain.example.org", + }, + true, + false, + }, + { + `x like "^(https?://)?(www\.)?([a-zA-Z0-9-]{1,63}\.)*[a-zA-Z0-9][a-zA-Z0-9-]{0,61}\.[a-zA-Z]{2,}(:\d+)?(/.*)?$"`, + obj{ + "x": "ws-https://subdomain.example.org", + }, + false, + false, + }, + { + `x like ".*世界\s.*"`, + obj{ + "x": "Hello, 世界 means world in Chinese.", + }, + true, + false, + }, + { + `x like "[\\u4e00-\\u9fa5]+"`, + obj{ + "x": "Hello, 中国means world in Chinese.", + }, + true, + false, + }, } for _, tt := range tests { diff --git a/parser/string_operation.go b/parser/string_operation.go index f05f0e6..19c3f4b 100644 --- a/parser/string_operation.go +++ b/parser/string_operation.go @@ -2,11 +2,13 @@ package parser import ( "fmt" + "regexp" "strings" ) type StringOperation struct { NullOperation + RegexPatternMap map[string]*regexp.Regexp } func (o *StringOperation) getString(operand Operand) (string, error) { @@ -125,3 +127,28 @@ func (o *StringOperation) IN(left Operand, right Operand) (bool, error) { } return false, nil } + +func (o *StringOperation) LIKE(left Operand, right Operand) (bool, error) { + l, r, err := o.get(left, right) + if err != nil { + return false, err + } + + if o.RegexPatternMap == nil { + o.RegexPatternMap = make(map[string]*regexp.Regexp) + } + + if regx, ok := o.RegexPatternMap[r]; ok { + match := regx.MatchString(l) + return match, nil + } + + regx, err := regexp.Compile(r) + if err != nil { + return false, err + } + + o.RegexPatternMap[r] = regx + match := regx.MatchString(l) + return match, nil +}