diff --git a/grammar/Expr.g4 b/grammar/Expr.g4 index ea11348b..286ab08a 100644 --- a/grammar/Expr.g4 +++ b/grammar/Expr.g4 @@ -17,14 +17,23 @@ grammar Expr; /* To match the whole input */ fullexpr: expr EOF; -shift: TIME expr?; +shift: TIME shift_expr?; -expr +shift_expr : op=('+' | '-') NUMBER # signedNumber | op=('+' | '-') IDENTIFIER # signedIdentifier - | expr op=('/' | '*') expr # muldiv - | expr op=('+' | '-') expr # addsub - | '-' expr # negation + | op=('+' | '-') '(' expr ')' # signedExpression + | op=('+' | '-') IDENTIFIER '(' expr ')' # signedFunction + | shift_expr op=('/' | '*') NUMBER # shiftMuldivNumber + | shift_expr op=('/' | '*') IDENTIFIER # shiftMuldivIdentifier + | shift_expr op=('/' | '*') '(' expr ')' # shiftMuldiv + | shift_expr op=('+' | '-') expr # shiftAddsub + ; + +expr + : '-' expr # negation + | expr op=('/' | '*') expr # muldiv + | expr op=('+' | '-') expr # addsub | expr COMPARISON expr # comparison | IDENTIFIER # identifier | IDENTIFIER '.' IDENTIFIER # portField diff --git a/src/andromede/expression/parsing/antlr/Expr.interp b/src/andromede/expression/parsing/antlr/Expr.interp index 959e596d..22ba3b79 100644 --- a/src/andromede/expression/parsing/antlr/Expr.interp +++ b/src/andromede/expression/parsing/antlr/Expr.interp @@ -2,11 +2,11 @@ token literal names: null '+' '-' +'(' +')' '/' '*' '.' -'(' -')' ',' '..' null @@ -43,8 +43,9 @@ WS rule names: fullexpr shift +shift_expr expr atn: -[4, 1, 18, 89, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 3, 1, 12, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 40, 8, 2, 10, 2, 12, 2, 43, 9, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 52, 8, 2, 10, 2, 12, 2, 55, 9, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 73, 8, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 84, 8, 2, 10, 2, 12, 2, 87, 9, 2, 1, 2, 0, 1, 4, 3, 0, 2, 4, 0, 2, 1, 0, 1, 2, 1, 0, 3, 4, 102, 0, 6, 1, 0, 0, 0, 2, 9, 1, 0, 0, 0, 4, 72, 1, 0, 0, 0, 6, 7, 3, 4, 2, 0, 7, 8, 5, 0, 0, 1, 8, 1, 1, 0, 0, 0, 9, 11, 5, 11, 0, 0, 10, 12, 3, 4, 2, 0, 11, 10, 1, 0, 0, 0, 11, 12, 1, 0, 0, 0, 12, 3, 1, 0, 0, 0, 13, 14, 6, 2, -1, 0, 14, 15, 7, 0, 0, 0, 15, 73, 5, 10, 0, 0, 16, 17, 7, 0, 0, 0, 17, 73, 5, 12, 0, 0, 18, 19, 5, 2, 0, 0, 19, 73, 3, 4, 2, 11, 20, 73, 5, 12, 0, 0, 21, 22, 5, 12, 0, 0, 22, 23, 5, 5, 0, 0, 23, 73, 5, 12, 0, 0, 24, 73, 5, 10, 0, 0, 25, 26, 5, 6, 0, 0, 26, 27, 3, 4, 2, 0, 27, 28, 5, 7, 0, 0, 28, 73, 1, 0, 0, 0, 29, 30, 5, 12, 0, 0, 30, 31, 5, 6, 0, 0, 31, 32, 3, 4, 2, 0, 32, 33, 5, 7, 0, 0, 33, 73, 1, 0, 0, 0, 34, 35, 5, 12, 0, 0, 35, 36, 5, 16, 0, 0, 36, 41, 3, 2, 1, 0, 37, 38, 5, 8, 0, 0, 38, 40, 3, 2, 1, 0, 39, 37, 1, 0, 0, 0, 40, 43, 1, 0, 0, 0, 41, 39, 1, 0, 0, 0, 41, 42, 1, 0, 0, 0, 42, 44, 1, 0, 0, 0, 43, 41, 1, 0, 0, 0, 44, 45, 5, 17, 0, 0, 45, 73, 1, 0, 0, 0, 46, 47, 5, 12, 0, 0, 47, 48, 5, 16, 0, 0, 48, 53, 3, 4, 2, 0, 49, 50, 5, 8, 0, 0, 50, 52, 3, 4, 2, 0, 51, 49, 1, 0, 0, 0, 52, 55, 1, 0, 0, 0, 53, 51, 1, 0, 0, 0, 53, 54, 1, 0, 0, 0, 54, 56, 1, 0, 0, 0, 55, 53, 1, 0, 0, 0, 56, 57, 5, 17, 0, 0, 57, 73, 1, 0, 0, 0, 58, 59, 5, 12, 0, 0, 59, 60, 5, 16, 0, 0, 60, 61, 3, 2, 1, 0, 61, 62, 5, 9, 0, 0, 62, 63, 3, 2, 1, 0, 63, 64, 5, 17, 0, 0, 64, 73, 1, 0, 0, 0, 65, 66, 5, 12, 0, 0, 66, 67, 5, 16, 0, 0, 67, 68, 3, 4, 2, 0, 68, 69, 5, 9, 0, 0, 69, 70, 3, 4, 2, 0, 70, 71, 5, 17, 0, 0, 71, 73, 1, 0, 0, 0, 72, 13, 1, 0, 0, 0, 72, 16, 1, 0, 0, 0, 72, 18, 1, 0, 0, 0, 72, 20, 1, 0, 0, 0, 72, 21, 1, 0, 0, 0, 72, 24, 1, 0, 0, 0, 72, 25, 1, 0, 0, 0, 72, 29, 1, 0, 0, 0, 72, 34, 1, 0, 0, 0, 72, 46, 1, 0, 0, 0, 72, 58, 1, 0, 0, 0, 72, 65, 1, 0, 0, 0, 73, 85, 1, 0, 0, 0, 74, 75, 10, 13, 0, 0, 75, 76, 7, 1, 0, 0, 76, 84, 3, 4, 2, 14, 77, 78, 10, 12, 0, 0, 78, 79, 7, 0, 0, 0, 79, 84, 3, 4, 2, 13, 80, 81, 10, 10, 0, 0, 81, 82, 5, 13, 0, 0, 82, 84, 3, 4, 2, 11, 83, 74, 1, 0, 0, 0, 83, 77, 1, 0, 0, 0, 83, 80, 1, 0, 0, 0, 84, 87, 1, 0, 0, 0, 85, 83, 1, 0, 0, 0, 85, 86, 1, 0, 0, 0, 86, 5, 1, 0, 0, 0, 87, 85, 1, 0, 0, 0, 6, 11, 41, 53, 72, 83, 85] \ No newline at end of file +[4, 1, 18, 125, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 3, 1, 14, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 32, 8, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 49, 8, 2, 10, 2, 12, 2, 52, 9, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 76, 8, 3, 10, 3, 12, 3, 79, 9, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 88, 8, 3, 10, 3, 12, 3, 91, 9, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 109, 8, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 120, 8, 3, 10, 3, 12, 3, 123, 9, 3, 1, 3, 0, 2, 4, 6, 4, 0, 2, 4, 6, 0, 2, 1, 0, 1, 2, 1, 0, 5, 6, 142, 0, 8, 1, 0, 0, 0, 2, 11, 1, 0, 0, 0, 4, 31, 1, 0, 0, 0, 6, 108, 1, 0, 0, 0, 8, 9, 3, 6, 3, 0, 9, 10, 5, 0, 0, 1, 10, 1, 1, 0, 0, 0, 11, 13, 5, 11, 0, 0, 12, 14, 3, 4, 2, 0, 13, 12, 1, 0, 0, 0, 13, 14, 1, 0, 0, 0, 14, 3, 1, 0, 0, 0, 15, 16, 6, 2, -1, 0, 16, 17, 7, 0, 0, 0, 17, 32, 5, 10, 0, 0, 18, 19, 7, 0, 0, 0, 19, 32, 5, 12, 0, 0, 20, 21, 7, 0, 0, 0, 21, 22, 5, 3, 0, 0, 22, 23, 3, 6, 3, 0, 23, 24, 5, 4, 0, 0, 24, 32, 1, 0, 0, 0, 25, 26, 7, 0, 0, 0, 26, 27, 5, 12, 0, 0, 27, 28, 5, 3, 0, 0, 28, 29, 3, 6, 3, 0, 29, 30, 5, 4, 0, 0, 30, 32, 1, 0, 0, 0, 31, 15, 1, 0, 0, 0, 31, 18, 1, 0, 0, 0, 31, 20, 1, 0, 0, 0, 31, 25, 1, 0, 0, 0, 32, 50, 1, 0, 0, 0, 33, 34, 10, 4, 0, 0, 34, 35, 7, 1, 0, 0, 35, 49, 5, 10, 0, 0, 36, 37, 10, 3, 0, 0, 37, 38, 7, 1, 0, 0, 38, 49, 5, 12, 0, 0, 39, 40, 10, 2, 0, 0, 40, 41, 7, 1, 0, 0, 41, 42, 5, 3, 0, 0, 42, 43, 3, 6, 3, 0, 43, 44, 5, 4, 0, 0, 44, 49, 1, 0, 0, 0, 45, 46, 10, 1, 0, 0, 46, 47, 7, 0, 0, 0, 47, 49, 3, 6, 3, 0, 48, 33, 1, 0, 0, 0, 48, 36, 1, 0, 0, 0, 48, 39, 1, 0, 0, 0, 48, 45, 1, 0, 0, 0, 49, 52, 1, 0, 0, 0, 50, 48, 1, 0, 0, 0, 50, 51, 1, 0, 0, 0, 51, 5, 1, 0, 0, 0, 52, 50, 1, 0, 0, 0, 53, 54, 6, 3, -1, 0, 54, 55, 5, 2, 0, 0, 55, 109, 3, 6, 3, 13, 56, 109, 5, 12, 0, 0, 57, 58, 5, 12, 0, 0, 58, 59, 5, 7, 0, 0, 59, 109, 5, 12, 0, 0, 60, 109, 5, 10, 0, 0, 61, 62, 5, 3, 0, 0, 62, 63, 3, 6, 3, 0, 63, 64, 5, 4, 0, 0, 64, 109, 1, 0, 0, 0, 65, 66, 5, 12, 0, 0, 66, 67, 5, 3, 0, 0, 67, 68, 3, 6, 3, 0, 68, 69, 5, 4, 0, 0, 69, 109, 1, 0, 0, 0, 70, 71, 5, 12, 0, 0, 71, 72, 5, 16, 0, 0, 72, 77, 3, 2, 1, 0, 73, 74, 5, 8, 0, 0, 74, 76, 3, 2, 1, 0, 75, 73, 1, 0, 0, 0, 76, 79, 1, 0, 0, 0, 77, 75, 1, 0, 0, 0, 77, 78, 1, 0, 0, 0, 78, 80, 1, 0, 0, 0, 79, 77, 1, 0, 0, 0, 80, 81, 5, 17, 0, 0, 81, 109, 1, 0, 0, 0, 82, 83, 5, 12, 0, 0, 83, 84, 5, 16, 0, 0, 84, 89, 3, 6, 3, 0, 85, 86, 5, 8, 0, 0, 86, 88, 3, 6, 3, 0, 87, 85, 1, 0, 0, 0, 88, 91, 1, 0, 0, 0, 89, 87, 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 92, 1, 0, 0, 0, 91, 89, 1, 0, 0, 0, 92, 93, 5, 17, 0, 0, 93, 109, 1, 0, 0, 0, 94, 95, 5, 12, 0, 0, 95, 96, 5, 16, 0, 0, 96, 97, 3, 2, 1, 0, 97, 98, 5, 9, 0, 0, 98, 99, 3, 2, 1, 0, 99, 100, 5, 17, 0, 0, 100, 109, 1, 0, 0, 0, 101, 102, 5, 12, 0, 0, 102, 103, 5, 16, 0, 0, 103, 104, 3, 6, 3, 0, 104, 105, 5, 9, 0, 0, 105, 106, 3, 6, 3, 0, 106, 107, 5, 17, 0, 0, 107, 109, 1, 0, 0, 0, 108, 53, 1, 0, 0, 0, 108, 56, 1, 0, 0, 0, 108, 57, 1, 0, 0, 0, 108, 60, 1, 0, 0, 0, 108, 61, 1, 0, 0, 0, 108, 65, 1, 0, 0, 0, 108, 70, 1, 0, 0, 0, 108, 82, 1, 0, 0, 0, 108, 94, 1, 0, 0, 0, 108, 101, 1, 0, 0, 0, 109, 121, 1, 0, 0, 0, 110, 111, 10, 12, 0, 0, 111, 112, 7, 1, 0, 0, 112, 120, 3, 6, 3, 13, 113, 114, 10, 11, 0, 0, 114, 115, 7, 0, 0, 0, 115, 120, 3, 6, 3, 12, 116, 117, 10, 10, 0, 0, 117, 118, 5, 13, 0, 0, 118, 120, 3, 6, 3, 11, 119, 110, 1, 0, 0, 0, 119, 113, 1, 0, 0, 0, 119, 116, 1, 0, 0, 0, 120, 123, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 121, 122, 1, 0, 0, 0, 122, 7, 1, 0, 0, 0, 123, 121, 1, 0, 0, 0, 9, 13, 31, 48, 50, 77, 89, 108, 119, 121] \ No newline at end of file diff --git a/src/andromede/expression/parsing/antlr/Expr.tokens b/src/andromede/expression/parsing/antlr/Expr.tokens index 29d96df5..a7df6308 100644 --- a/src/andromede/expression/parsing/antlr/Expr.tokens +++ b/src/andromede/expression/parsing/antlr/Expr.tokens @@ -18,11 +18,11 @@ RBRACKET=17 WS=18 '+'=1 '-'=2 -'/'=3 -'*'=4 -'.'=5 -'('=6 -')'=7 +'('=3 +')'=4 +'/'=5 +'*'=6 +'.'=7 ','=8 '..'=9 't'=11 diff --git a/src/andromede/expression/parsing/antlr/ExprLexer.interp b/src/andromede/expression/parsing/antlr/ExprLexer.interp index e98cab1e..8d45a225 100644 --- a/src/andromede/expression/parsing/antlr/ExprLexer.interp +++ b/src/andromede/expression/parsing/antlr/ExprLexer.interp @@ -2,11 +2,11 @@ token literal names: null '+' '-' +'(' +')' '/' '*' '.' -'(' -')' ',' '..' null @@ -71,4 +71,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 18, 111, 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, 1, 0, 1, 0, 1, 1, 1, 1, 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, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 3, 11, 69, 8, 11, 1, 12, 4, 12, 72, 8, 12, 11, 12, 12, 12, 73, 1, 12, 1, 12, 4, 12, 78, 8, 12, 11, 12, 12, 12, 79, 3, 12, 82, 8, 12, 1, 13, 1, 13, 1, 14, 1, 14, 5, 14, 88, 8, 14, 10, 14, 12, 14, 91, 9, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 98, 8, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 0, 0, 21, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 0, 21, 0, 23, 0, 25, 10, 27, 11, 29, 12, 31, 13, 33, 14, 35, 15, 37, 16, 39, 17, 41, 18, 1, 0, 5, 1, 0, 48, 57, 3, 0, 65, 90, 95, 95, 97, 122, 2, 0, 43, 43, 45, 45, 2, 0, 42, 42, 47, 47, 3, 0, 9, 10, 13, 13, 32, 32, 114, 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, 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, 1, 43, 1, 0, 0, 0, 3, 45, 1, 0, 0, 0, 5, 47, 1, 0, 0, 0, 7, 49, 1, 0, 0, 0, 9, 51, 1, 0, 0, 0, 11, 53, 1, 0, 0, 0, 13, 55, 1, 0, 0, 0, 15, 57, 1, 0, 0, 0, 17, 59, 1, 0, 0, 0, 19, 62, 1, 0, 0, 0, 21, 64, 1, 0, 0, 0, 23, 68, 1, 0, 0, 0, 25, 71, 1, 0, 0, 0, 27, 83, 1, 0, 0, 0, 29, 85, 1, 0, 0, 0, 31, 97, 1, 0, 0, 0, 33, 99, 1, 0, 0, 0, 35, 101, 1, 0, 0, 0, 37, 103, 1, 0, 0, 0, 39, 105, 1, 0, 0, 0, 41, 107, 1, 0, 0, 0, 43, 44, 5, 43, 0, 0, 44, 2, 1, 0, 0, 0, 45, 46, 5, 45, 0, 0, 46, 4, 1, 0, 0, 0, 47, 48, 5, 47, 0, 0, 48, 6, 1, 0, 0, 0, 49, 50, 5, 42, 0, 0, 50, 8, 1, 0, 0, 0, 51, 52, 5, 46, 0, 0, 52, 10, 1, 0, 0, 0, 53, 54, 5, 40, 0, 0, 54, 12, 1, 0, 0, 0, 55, 56, 5, 41, 0, 0, 56, 14, 1, 0, 0, 0, 57, 58, 5, 44, 0, 0, 58, 16, 1, 0, 0, 0, 59, 60, 5, 46, 0, 0, 60, 61, 5, 46, 0, 0, 61, 18, 1, 0, 0, 0, 62, 63, 7, 0, 0, 0, 63, 20, 1, 0, 0, 0, 64, 65, 7, 1, 0, 0, 65, 22, 1, 0, 0, 0, 66, 69, 3, 21, 10, 0, 67, 69, 3, 19, 9, 0, 68, 66, 1, 0, 0, 0, 68, 67, 1, 0, 0, 0, 69, 24, 1, 0, 0, 0, 70, 72, 3, 19, 9, 0, 71, 70, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 71, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 81, 1, 0, 0, 0, 75, 77, 5, 46, 0, 0, 76, 78, 3, 19, 9, 0, 77, 76, 1, 0, 0, 0, 78, 79, 1, 0, 0, 0, 79, 77, 1, 0, 0, 0, 79, 80, 1, 0, 0, 0, 80, 82, 1, 0, 0, 0, 81, 75, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 26, 1, 0, 0, 0, 83, 84, 5, 116, 0, 0, 84, 28, 1, 0, 0, 0, 85, 89, 3, 21, 10, 0, 86, 88, 3, 23, 11, 0, 87, 86, 1, 0, 0, 0, 88, 91, 1, 0, 0, 0, 89, 87, 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 30, 1, 0, 0, 0, 91, 89, 1, 0, 0, 0, 92, 98, 5, 61, 0, 0, 93, 94, 5, 62, 0, 0, 94, 98, 5, 61, 0, 0, 95, 96, 5, 60, 0, 0, 96, 98, 5, 61, 0, 0, 97, 92, 1, 0, 0, 0, 97, 93, 1, 0, 0, 0, 97, 95, 1, 0, 0, 0, 98, 32, 1, 0, 0, 0, 99, 100, 7, 2, 0, 0, 100, 34, 1, 0, 0, 0, 101, 102, 7, 3, 0, 0, 102, 36, 1, 0, 0, 0, 103, 104, 5, 91, 0, 0, 104, 38, 1, 0, 0, 0, 105, 106, 5, 93, 0, 0, 106, 40, 1, 0, 0, 0, 107, 108, 7, 4, 0, 0, 108, 109, 1, 0, 0, 0, 109, 110, 6, 20, 0, 0, 110, 42, 1, 0, 0, 0, 7, 0, 68, 73, 79, 81, 89, 97, 1, 6, 0, 0] \ No newline at end of file +[4, 0, 18, 111, 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, 1, 0, 1, 0, 1, 1, 1, 1, 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, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 3, 11, 69, 8, 11, 1, 12, 4, 12, 72, 8, 12, 11, 12, 12, 12, 73, 1, 12, 1, 12, 4, 12, 78, 8, 12, 11, 12, 12, 12, 79, 3, 12, 82, 8, 12, 1, 13, 1, 13, 1, 14, 1, 14, 5, 14, 88, 8, 14, 10, 14, 12, 14, 91, 9, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 98, 8, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 0, 0, 21, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 0, 21, 0, 23, 0, 25, 10, 27, 11, 29, 12, 31, 13, 33, 14, 35, 15, 37, 16, 39, 17, 41, 18, 1, 0, 5, 1, 0, 48, 57, 3, 0, 65, 90, 95, 95, 97, 122, 2, 0, 43, 43, 45, 45, 2, 0, 42, 42, 47, 47, 3, 0, 9, 10, 13, 13, 32, 32, 114, 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, 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, 1, 43, 1, 0, 0, 0, 3, 45, 1, 0, 0, 0, 5, 47, 1, 0, 0, 0, 7, 49, 1, 0, 0, 0, 9, 51, 1, 0, 0, 0, 11, 53, 1, 0, 0, 0, 13, 55, 1, 0, 0, 0, 15, 57, 1, 0, 0, 0, 17, 59, 1, 0, 0, 0, 19, 62, 1, 0, 0, 0, 21, 64, 1, 0, 0, 0, 23, 68, 1, 0, 0, 0, 25, 71, 1, 0, 0, 0, 27, 83, 1, 0, 0, 0, 29, 85, 1, 0, 0, 0, 31, 97, 1, 0, 0, 0, 33, 99, 1, 0, 0, 0, 35, 101, 1, 0, 0, 0, 37, 103, 1, 0, 0, 0, 39, 105, 1, 0, 0, 0, 41, 107, 1, 0, 0, 0, 43, 44, 5, 43, 0, 0, 44, 2, 1, 0, 0, 0, 45, 46, 5, 45, 0, 0, 46, 4, 1, 0, 0, 0, 47, 48, 5, 40, 0, 0, 48, 6, 1, 0, 0, 0, 49, 50, 5, 41, 0, 0, 50, 8, 1, 0, 0, 0, 51, 52, 5, 47, 0, 0, 52, 10, 1, 0, 0, 0, 53, 54, 5, 42, 0, 0, 54, 12, 1, 0, 0, 0, 55, 56, 5, 46, 0, 0, 56, 14, 1, 0, 0, 0, 57, 58, 5, 44, 0, 0, 58, 16, 1, 0, 0, 0, 59, 60, 5, 46, 0, 0, 60, 61, 5, 46, 0, 0, 61, 18, 1, 0, 0, 0, 62, 63, 7, 0, 0, 0, 63, 20, 1, 0, 0, 0, 64, 65, 7, 1, 0, 0, 65, 22, 1, 0, 0, 0, 66, 69, 3, 21, 10, 0, 67, 69, 3, 19, 9, 0, 68, 66, 1, 0, 0, 0, 68, 67, 1, 0, 0, 0, 69, 24, 1, 0, 0, 0, 70, 72, 3, 19, 9, 0, 71, 70, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 71, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 81, 1, 0, 0, 0, 75, 77, 5, 46, 0, 0, 76, 78, 3, 19, 9, 0, 77, 76, 1, 0, 0, 0, 78, 79, 1, 0, 0, 0, 79, 77, 1, 0, 0, 0, 79, 80, 1, 0, 0, 0, 80, 82, 1, 0, 0, 0, 81, 75, 1, 0, 0, 0, 81, 82, 1, 0, 0, 0, 82, 26, 1, 0, 0, 0, 83, 84, 5, 116, 0, 0, 84, 28, 1, 0, 0, 0, 85, 89, 3, 21, 10, 0, 86, 88, 3, 23, 11, 0, 87, 86, 1, 0, 0, 0, 88, 91, 1, 0, 0, 0, 89, 87, 1, 0, 0, 0, 89, 90, 1, 0, 0, 0, 90, 30, 1, 0, 0, 0, 91, 89, 1, 0, 0, 0, 92, 98, 5, 61, 0, 0, 93, 94, 5, 62, 0, 0, 94, 98, 5, 61, 0, 0, 95, 96, 5, 60, 0, 0, 96, 98, 5, 61, 0, 0, 97, 92, 1, 0, 0, 0, 97, 93, 1, 0, 0, 0, 97, 95, 1, 0, 0, 0, 98, 32, 1, 0, 0, 0, 99, 100, 7, 2, 0, 0, 100, 34, 1, 0, 0, 0, 101, 102, 7, 3, 0, 0, 102, 36, 1, 0, 0, 0, 103, 104, 5, 91, 0, 0, 104, 38, 1, 0, 0, 0, 105, 106, 5, 93, 0, 0, 106, 40, 1, 0, 0, 0, 107, 108, 7, 4, 0, 0, 108, 109, 1, 0, 0, 0, 109, 110, 6, 20, 0, 0, 110, 42, 1, 0, 0, 0, 7, 0, 68, 73, 79, 81, 89, 97, 1, 6, 0, 0] \ No newline at end of file diff --git a/src/andromede/expression/parsing/antlr/ExprLexer.py b/src/andromede/expression/parsing/antlr/ExprLexer.py index 7d750dc2..4fd7b553 100644 --- a/src/andromede/expression/parsing/antlr/ExprLexer.py +++ b/src/andromede/expression/parsing/antlr/ExprLexer.py @@ -589,7 +589,7 @@ def serializedATN(): 47, 48, 5, - 47, + 40, 0, 0, 48, @@ -601,7 +601,7 @@ def serializedATN(): 49, 50, 5, - 42, + 41, 0, 0, 50, @@ -613,7 +613,7 @@ def serializedATN(): 51, 52, 5, - 46, + 47, 0, 0, 52, @@ -625,7 +625,7 @@ def serializedATN(): 53, 54, 5, - 40, + 42, 0, 0, 54, @@ -637,7 +637,7 @@ def serializedATN(): 55, 56, 5, - 41, + 46, 0, 0, 56, @@ -1059,11 +1059,11 @@ class ExprLexer(Lexer): "", "'+'", "'-'", + "'('", + "')'", "'/'", "'*'", "'.'", - "'('", - "')'", "','", "'..'", "'t'", diff --git a/src/andromede/expression/parsing/antlr/ExprLexer.tokens b/src/andromede/expression/parsing/antlr/ExprLexer.tokens index 29d96df5..a7df6308 100644 --- a/src/andromede/expression/parsing/antlr/ExprLexer.tokens +++ b/src/andromede/expression/parsing/antlr/ExprLexer.tokens @@ -18,11 +18,11 @@ RBRACKET=17 WS=18 '+'=1 '-'=2 -'/'=3 -'*'=4 -'.'=5 -'('=6 -')'=7 +'('=3 +')'=4 +'/'=5 +'*'=6 +'.'=7 ','=8 '..'=9 't'=11 diff --git a/src/andromede/expression/parsing/antlr/ExprParser.py b/src/andromede/expression/parsing/antlr/ExprParser.py index 2a350caf..c6f2b6a4 100644 --- a/src/andromede/expression/parsing/antlr/ExprParser.py +++ b/src/andromede/expression/parsing/antlr/ExprParser.py @@ -16,7 +16,7 @@ def serializedATN(): 4, 1, 18, - 89, + 125, 2, 0, 7, @@ -29,6 +29,10 @@ def serializedATN(): 2, 7, 2, + 2, + 3, + 7, + 3, 1, 0, 1, @@ -41,7 +45,7 @@ def serializedATN(): 1, 3, 1, - 12, + 14, 8, 1, 1, @@ -76,9 +80,10 @@ def serializedATN(): 2, 1, 2, - 1, + 3, 2, - 1, + 32, + 8, 2, 1, 2, @@ -96,18 +101,6 @@ def serializedATN(): 2, 1, 2, - 5, - 2, - 40, - 8, - 2, - 10, - 2, - 12, - 2, - 43, - 9, - 2, 1, 2, 1, @@ -124,92 +117,176 @@ def serializedATN(): 2, 5, 2, - 52, + 49, 8, 2, 10, 2, 12, 2, - 55, + 52, 9, 2, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, 3, - 2, - 73, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 5, + 3, + 76, 8, - 2, + 3, + 10, + 3, + 12, + 3, + 79, + 9, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, 1, - 2, + 3, + 5, + 3, + 88, + 8, + 3, + 10, + 3, + 12, + 3, + 91, + 9, + 3, 1, - 2, + 3, 1, - 2, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 3, + 3, + 109, + 8, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, + 1, + 3, 5, - 2, - 84, + 3, + 120, 8, - 2, + 3, 10, - 2, + 3, 12, - 2, - 87, + 3, + 123, 9, - 2, + 3, 1, - 2, + 3, 0, - 1, + 2, + 4, + 6, 4, - 3, 0, 2, 4, + 6, 0, 2, 1, @@ -218,395 +295,419 @@ def serializedATN(): 2, 1, 0, - 3, - 4, - 102, - 0, + 5, 6, + 142, + 0, + 8, 1, 0, 0, 0, 2, - 9, + 11, 1, 0, 0, 0, 4, - 72, + 31, 1, 0, 0, 0, 6, - 7, - 3, - 4, - 2, + 108, + 1, + 0, + 0, 0, - 7, 8, + 9, + 3, + 6, + 3, + 0, + 9, + 10, 5, 0, 0, 1, - 8, + 10, 1, 1, 0, 0, 0, - 9, 11, + 13, 5, 11, 0, 0, - 10, 12, + 14, 3, 4, 2, 0, - 11, - 10, + 13, + 12, 1, 0, 0, 0, - 11, - 12, + 13, + 14, 1, 0, 0, 0, - 12, + 14, 3, 1, 0, 0, 0, - 13, - 14, + 15, + 16, 6, 2, -1, 0, - 14, - 15, + 16, + 17, 7, 0, 0, 0, - 15, - 73, + 17, + 32, 5, 10, 0, 0, - 16, - 17, + 18, + 19, 7, 0, 0, 0, - 17, - 73, + 19, + 32, 5, 12, 0, 0, - 18, - 19, - 5, - 2, + 20, + 21, + 7, 0, 0, - 19, - 73, - 3, - 4, - 2, - 11, - 20, - 73, - 5, - 12, - 0, 0, 21, 22, 5, - 12, + 3, 0, 0, 22, 23, - 5, - 5, - 0, + 3, + 6, + 3, 0, 23, - 73, + 24, 5, - 12, + 4, 0, 0, 24, - 73, - 5, - 10, + 32, + 1, + 0, 0, 0, 25, 26, - 5, - 6, + 7, + 0, 0, 0, 26, 27, - 3, - 4, - 2, + 5, + 12, + 0, 0, 27, 28, 5, - 7, + 3, 0, 0, 28, - 73, - 1, - 0, - 0, + 29, + 3, + 6, + 3, 0, 29, 30, 5, - 12, + 4, 0, 0, 30, + 32, + 1, + 0, + 0, + 0, 31, - 5, - 6, + 15, + 1, + 0, 0, 0, 31, - 32, - 3, - 4, - 2, + 18, + 1, 0, - 32, - 33, - 5, - 7, 0, 0, - 33, - 73, + 31, + 20, + 1, + 0, + 0, + 0, + 31, + 25, + 1, + 0, + 0, + 0, + 32, + 50, 1, 0, 0, 0, + 33, + 34, + 10, + 4, + 0, + 0, 34, 35, - 5, - 12, + 7, + 1, 0, 0, 35, - 36, + 49, 5, - 16, + 10, 0, 0, 36, - 41, + 37, + 10, 3, - 2, - 1, + 0, 0, 37, 38, - 5, - 8, + 7, + 1, 0, 0, 38, - 40, - 3, - 2, - 1, + 49, + 5, + 12, 0, - 39, - 37, - 1, 0, + 39, + 40, + 10, + 2, 0, 0, 40, - 43, + 41, + 7, 1, 0, 0, - 0, 41, - 39, - 1, - 0, + 42, + 5, + 3, 0, 0, - 41, 42, - 1, + 43, + 3, + 6, + 3, 0, + 43, + 44, + 5, + 4, 0, 0, - 42, 44, + 49, 1, 0, 0, 0, - 43, - 41, + 45, + 46, + 10, 1, 0, 0, + 46, + 47, + 7, 0, - 44, - 45, - 5, - 17, 0, 0, - 45, - 73, + 47, + 49, + 3, + 6, + 3, + 0, + 48, + 33, 1, 0, 0, 0, - 46, - 47, - 5, - 12, + 48, + 36, + 1, + 0, 0, 0, - 47, 48, - 5, - 16, + 39, + 1, 0, 0, - 48, - 53, - 3, - 4, - 2, 0, - 49, - 50, - 5, - 8, + 48, + 45, + 1, 0, 0, - 50, - 52, - 3, - 4, - 2, 0, - 51, 49, + 52, 1, 0, 0, 0, - 52, - 55, + 50, + 48, 1, 0, 0, 0, - 53, + 50, 51, 1, 0, 0, 0, - 53, - 54, + 51, + 5, 1, 0, 0, 0, - 54, - 56, + 52, + 50, 1, 0, 0, 0, - 55, 53, - 1, + 54, + 6, + 3, + -1, 0, + 54, + 55, + 5, + 2, 0, 0, + 55, + 109, + 3, + 6, + 3, + 13, 56, - 57, + 109, 5, - 17, + 12, 0, 0, 57, - 73, - 1, - 0, + 58, + 5, + 12, 0, 0, 58, 59, 5, - 12, + 7, 0, 0, 59, - 60, + 109, 5, - 16, + 12, 0, 0, 60, - 61, - 3, - 2, - 1, + 109, + 5, + 10, + 0, 0, 61, 62, 5, - 9, + 3, 0, 0, 62, 63, 3, - 2, - 1, + 6, + 3, 0, 63, 64, 5, - 17, + 4, 0, 0, 64, - 73, + 109, 1, 0, 0, @@ -620,230 +721,449 @@ def serializedATN(): 66, 67, 5, - 16, + 3, 0, 0, 67, 68, 3, - 4, - 2, + 6, + 3, 0, 68, 69, 5, - 9, + 4, 0, 0, 69, - 70, - 3, - 4, - 2, + 109, + 1, + 0, + 0, 0, 70, 71, 5, - 17, + 12, 0, 0, 71, - 73, + 72, + 5, + 16, + 0, + 0, + 72, + 77, + 3, + 2, 1, 0, + 73, + 74, + 5, + 8, 0, 0, - 72, - 13, + 74, + 76, + 3, + 2, + 1, + 0, + 75, + 73, 1, 0, 0, 0, - 72, - 16, + 76, + 79, 1, 0, 0, 0, - 72, - 18, + 77, + 75, 1, 0, 0, 0, - 72, - 20, + 77, + 78, 1, 0, 0, 0, - 72, - 21, + 78, + 80, 1, 0, 0, 0, - 72, - 24, + 79, + 77, 1, 0, 0, 0, - 72, - 25, + 80, + 81, + 5, + 17, + 0, + 0, + 81, + 109, 1, 0, 0, 0, - 72, - 29, + 82, + 83, + 5, + 12, + 0, + 0, + 83, + 84, + 5, + 16, + 0, + 0, + 84, + 89, + 3, + 6, + 3, + 0, + 85, + 86, + 5, + 8, + 0, + 0, + 86, + 88, + 3, + 6, + 3, + 0, + 87, + 85, 1, 0, 0, 0, - 72, - 34, + 88, + 91, 1, 0, 0, 0, - 72, - 46, + 89, + 87, 1, 0, 0, 0, - 72, - 58, + 89, + 90, 1, 0, 0, 0, - 72, - 65, + 90, + 92, 1, 0, 0, 0, - 73, - 85, + 91, + 89, 1, 0, 0, 0, - 74, - 75, - 10, - 13, + 92, + 93, + 5, + 17, 0, 0, - 75, - 76, - 7, + 93, + 109, 1, 0, 0, - 76, - 84, - 3, - 4, - 2, - 14, - 77, - 78, - 10, + 0, + 94, + 95, + 5, 12, 0, 0, - 78, - 79, - 7, + 95, + 96, + 5, + 16, + 0, + 0, + 96, + 97, + 3, + 2, + 1, 0, + 97, + 98, + 5, + 9, 0, 0, - 79, - 84, + 98, + 99, 3, - 4, 2, - 13, - 80, - 81, - 10, - 10, + 1, + 0, + 99, + 100, + 5, + 17, 0, 0, - 81, - 82, + 100, + 109, + 1, + 0, + 0, + 0, + 101, + 102, 5, - 13, + 12, 0, 0, - 82, - 84, + 102, + 103, + 5, + 16, + 0, + 0, + 103, + 104, 3, - 4, - 2, - 11, - 83, - 74, + 6, + 3, + 0, + 104, + 105, + 5, + 9, + 0, + 0, + 105, + 106, + 3, + 6, + 3, + 0, + 106, + 107, + 5, + 17, + 0, + 0, + 107, + 109, 1, 0, 0, 0, - 83, - 77, + 108, + 53, 1, 0, 0, 0, - 83, - 80, + 108, + 56, 1, 0, 0, 0, - 84, - 87, + 108, + 57, 1, 0, 0, 0, - 85, - 83, + 108, + 60, 1, 0, 0, 0, - 85, - 86, + 108, + 61, 1, 0, 0, 0, - 86, - 5, + 108, + 65, 1, 0, 0, 0, - 87, - 85, + 108, + 70, + 1, + 0, + 0, + 0, + 108, + 82, + 1, + 0, + 0, + 0, + 108, + 94, + 1, + 0, + 0, + 0, + 108, + 101, + 1, + 0, + 0, + 0, + 109, + 121, 1, 0, 0, 0, + 110, + 111, + 10, + 12, + 0, + 0, + 111, + 112, + 7, + 1, + 0, + 0, + 112, + 120, + 3, 6, + 3, + 13, + 113, + 114, + 10, 11, - 41, - 53, - 72, - 83, - 85, - ] - - -class ExprParser(Parser): + 0, + 0, + 114, + 115, + 7, + 0, + 0, + 0, + 115, + 120, + 3, + 6, + 3, + 12, + 116, + 117, + 10, + 10, + 0, + 0, + 117, + 118, + 5, + 13, + 0, + 0, + 118, + 120, + 3, + 6, + 3, + 11, + 119, + 110, + 1, + 0, + 0, + 0, + 119, + 113, + 1, + 0, + 0, + 0, + 119, + 116, + 1, + 0, + 0, + 0, + 120, + 123, + 1, + 0, + 0, + 0, + 121, + 119, + 1, + 0, + 0, + 0, + 121, + 122, + 1, + 0, + 0, + 0, + 122, + 7, + 1, + 0, + 0, + 0, + 123, + 121, + 1, + 0, + 0, + 0, + 9, + 13, + 31, + 48, + 50, + 77, + 89, + 108, + 119, + 121, + ] + + +class ExprParser(Parser): grammarFileName = "Expr.g4" atn = ATNDeserializer().deserialize(serializedATN()) @@ -856,11 +1176,11 @@ class ExprParser(Parser): "", "'+'", "'-'", + "'('", + "')'", "'/'", "'*'", "'.'", - "'('", - "')'", "','", "'..'", "", @@ -897,9 +1217,10 @@ class ExprParser(Parser): RULE_fullexpr = 0 RULE_shift = 1 - RULE_expr = 2 + RULE_shift_expr = 2 + RULE_expr = 3 - ruleNames = ["fullexpr", "shift", "expr"] + ruleNames = ["fullexpr", "shift", "shift_expr", "expr"] EOF = Token.EOF T__0 = 1 @@ -947,74 +1268,472 @@ def EOF(self): def getRuleIndex(self): return ExprParser.RULE_fullexpr - def accept(self, visitor: ParseTreeVisitor): - if hasattr(visitor, "visitFullexpr"): - return visitor.visitFullexpr(self) - else: - return visitor.visitChildren(self) + def accept(self, visitor: ParseTreeVisitor): + if hasattr(visitor, "visitFullexpr"): + return visitor.visitFullexpr(self) + else: + return visitor.visitChildren(self) + + def fullexpr(self): + localctx = ExprParser.FullexprContext(self, self._ctx, self.state) + self.enterRule(localctx, 0, self.RULE_fullexpr) + try: + self.enterOuterAlt(localctx, 1) + self.state = 8 + self.expr(0) + self.state = 9 + self.match(ExprParser.EOF) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class ShiftContext(ParserRuleContext): + __slots__ = "parser" + + def __init__( + self, parser, parent: ParserRuleContext = None, invokingState: int = -1 + ): + super().__init__(parent, invokingState) + self.parser = parser + + def TIME(self): + return self.getToken(ExprParser.TIME, 0) + + def shift_expr(self): + return self.getTypedRuleContext(ExprParser.Shift_exprContext, 0) + + def getRuleIndex(self): + return ExprParser.RULE_shift + + def accept(self, visitor: ParseTreeVisitor): + if hasattr(visitor, "visitShift"): + return visitor.visitShift(self) + else: + return visitor.visitChildren(self) + + def shift(self): + localctx = ExprParser.ShiftContext(self, self._ctx, self.state) + self.enterRule(localctx, 2, self.RULE_shift) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 11 + self.match(ExprParser.TIME) + self.state = 13 + self._errHandler.sync(self) + _la = self._input.LA(1) + if _la == 1 or _la == 2: + self.state = 12 + self.shift_expr(0) + + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class Shift_exprContext(ParserRuleContext): + __slots__ = "parser" + + def __init__( + self, parser, parent: ParserRuleContext = None, invokingState: int = -1 + ): + super().__init__(parent, invokingState) + self.parser = parser + + def getRuleIndex(self): + return ExprParser.RULE_shift_expr + + def copyFrom(self, ctx: ParserRuleContext): + super().copyFrom(ctx) + + class ShiftMuldivIdentifierContext(Shift_exprContext): + def __init__( + self, parser, ctx: ParserRuleContext + ): # actually a ExprParser.Shift_exprContext + super().__init__(parser) + self.op = None # Token + self.copyFrom(ctx) + + def shift_expr(self): + return self.getTypedRuleContext(ExprParser.Shift_exprContext, 0) + + def IDENTIFIER(self): + return self.getToken(ExprParser.IDENTIFIER, 0) + + def accept(self, visitor: ParseTreeVisitor): + if hasattr(visitor, "visitShiftMuldivIdentifier"): + return visitor.visitShiftMuldivIdentifier(self) + else: + return visitor.visitChildren(self) + + class SignedIdentifierContext(Shift_exprContext): + def __init__( + self, parser, ctx: ParserRuleContext + ): # actually a ExprParser.Shift_exprContext + super().__init__(parser) + self.op = None # Token + self.copyFrom(ctx) + + def IDENTIFIER(self): + return self.getToken(ExprParser.IDENTIFIER, 0) + + def accept(self, visitor: ParseTreeVisitor): + if hasattr(visitor, "visitSignedIdentifier"): + return visitor.visitSignedIdentifier(self) + else: + return visitor.visitChildren(self) + + class SignedExpressionContext(Shift_exprContext): + def __init__( + self, parser, ctx: ParserRuleContext + ): # actually a ExprParser.Shift_exprContext + super().__init__(parser) + self.op = None # Token + self.copyFrom(ctx) + + def expr(self): + return self.getTypedRuleContext(ExprParser.ExprContext, 0) + + def accept(self, visitor: ParseTreeVisitor): + if hasattr(visitor, "visitSignedExpression"): + return visitor.visitSignedExpression(self) + else: + return visitor.visitChildren(self) + + class SignedNumberContext(Shift_exprContext): + def __init__( + self, parser, ctx: ParserRuleContext + ): # actually a ExprParser.Shift_exprContext + super().__init__(parser) + self.op = None # Token + self.copyFrom(ctx) + + def NUMBER(self): + return self.getToken(ExprParser.NUMBER, 0) + + def accept(self, visitor: ParseTreeVisitor): + if hasattr(visitor, "visitSignedNumber"): + return visitor.visitSignedNumber(self) + else: + return visitor.visitChildren(self) + + class SignedFunctionContext(Shift_exprContext): + def __init__( + self, parser, ctx: ParserRuleContext + ): # actually a ExprParser.Shift_exprContext + super().__init__(parser) + self.op = None # Token + self.copyFrom(ctx) + + def IDENTIFIER(self): + return self.getToken(ExprParser.IDENTIFIER, 0) + + def expr(self): + return self.getTypedRuleContext(ExprParser.ExprContext, 0) + + def accept(self, visitor: ParseTreeVisitor): + if hasattr(visitor, "visitSignedFunction"): + return visitor.visitSignedFunction(self) + else: + return visitor.visitChildren(self) + + class ShiftMuldivNumberContext(Shift_exprContext): + def __init__( + self, parser, ctx: ParserRuleContext + ): # actually a ExprParser.Shift_exprContext + super().__init__(parser) + self.op = None # Token + self.copyFrom(ctx) + + def shift_expr(self): + return self.getTypedRuleContext(ExprParser.Shift_exprContext, 0) + + def NUMBER(self): + return self.getToken(ExprParser.NUMBER, 0) + + def accept(self, visitor: ParseTreeVisitor): + if hasattr(visitor, "visitShiftMuldivNumber"): + return visitor.visitShiftMuldivNumber(self) + else: + return visitor.visitChildren(self) + + class ShiftMuldivContext(Shift_exprContext): + def __init__( + self, parser, ctx: ParserRuleContext + ): # actually a ExprParser.Shift_exprContext + super().__init__(parser) + self.op = None # Token + self.copyFrom(ctx) + + def shift_expr(self): + return self.getTypedRuleContext(ExprParser.Shift_exprContext, 0) + + def expr(self): + return self.getTypedRuleContext(ExprParser.ExprContext, 0) + + def accept(self, visitor: ParseTreeVisitor): + if hasattr(visitor, "visitShiftMuldiv"): + return visitor.visitShiftMuldiv(self) + else: + return visitor.visitChildren(self) + + class ShiftAddsubContext(Shift_exprContext): + def __init__( + self, parser, ctx: ParserRuleContext + ): # actually a ExprParser.Shift_exprContext + super().__init__(parser) + self.op = None # Token + self.copyFrom(ctx) + + def shift_expr(self): + return self.getTypedRuleContext(ExprParser.Shift_exprContext, 0) + + def expr(self): + return self.getTypedRuleContext(ExprParser.ExprContext, 0) + + def accept(self, visitor: ParseTreeVisitor): + if hasattr(visitor, "visitShiftAddsub"): + return visitor.visitShiftAddsub(self) + else: + return visitor.visitChildren(self) + + def shift_expr(self, _p: int = 0): + _parentctx = self._ctx + _parentState = self.state + localctx = ExprParser.Shift_exprContext(self, self._ctx, _parentState) + _prevctx = localctx + _startState = 4 + self.enterRecursionRule(localctx, 4, self.RULE_shift_expr, _p) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 31 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input, 1, self._ctx) + if la_ == 1: + localctx = ExprParser.SignedNumberContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + + self.state = 16 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not (_la == 1 or _la == 2): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 17 + self.match(ExprParser.NUMBER) + pass + + elif la_ == 2: + localctx = ExprParser.SignedIdentifierContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 18 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not (_la == 1 or _la == 2): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 19 + self.match(ExprParser.IDENTIFIER) + pass + + elif la_ == 3: + localctx = ExprParser.SignedExpressionContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 20 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not (_la == 1 or _la == 2): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 21 + self.match(ExprParser.T__2) + self.state = 22 + self.expr(0) + self.state = 23 + self.match(ExprParser.T__3) + pass + + elif la_ == 4: + localctx = ExprParser.SignedFunctionContext(self, localctx) + self._ctx = localctx + _prevctx = localctx + self.state = 25 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not (_la == 1 or _la == 2): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 26 + self.match(ExprParser.IDENTIFIER) + self.state = 27 + self.match(ExprParser.T__2) + self.state = 28 + self.expr(0) + self.state = 29 + self.match(ExprParser.T__3) + pass + + self._ctx.stop = self._input.LT(-1) + self.state = 50 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input, 3, self._ctx) + while _alt != 2 and _alt != ATN.INVALID_ALT_NUMBER: + if _alt == 1: + if self._parseListeners is not None: + self.triggerExitRuleEvent() + _prevctx = localctx + self.state = 48 + self._errHandler.sync(self) + la_ = self._interp.adaptivePredict(self._input, 2, self._ctx) + if la_ == 1: + localctx = ExprParser.ShiftMuldivNumberContext( + self, + ExprParser.Shift_exprContext( + self, _parentctx, _parentState + ), + ) + self.pushNewRecursionContext( + localctx, _startState, self.RULE_shift_expr + ) + self.state = 33 + if not self.precpred(self._ctx, 4): + from antlr4.error.Errors import FailedPredicateException - def fullexpr(self): - localctx = ExprParser.FullexprContext(self, self._ctx, self.state) - self.enterRule(localctx, 0, self.RULE_fullexpr) - try: - self.enterOuterAlt(localctx, 1) - self.state = 6 - self.expr(0) - self.state = 7 - self.match(ExprParser.EOF) - except RecognitionException as re: - localctx.exception = re - self._errHandler.reportError(self, re) - self._errHandler.recover(self, re) - finally: - self.exitRule() - return localctx + raise FailedPredicateException( + self, "self.precpred(self._ctx, 4)" + ) + self.state = 34 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not (_la == 5 or _la == 6): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 35 + self.match(ExprParser.NUMBER) + pass - class ShiftContext(ParserRuleContext): - __slots__ = "parser" + elif la_ == 2: + localctx = ExprParser.ShiftMuldivIdentifierContext( + self, + ExprParser.Shift_exprContext( + self, _parentctx, _parentState + ), + ) + self.pushNewRecursionContext( + localctx, _startState, self.RULE_shift_expr + ) + self.state = 36 + if not self.precpred(self._ctx, 3): + from antlr4.error.Errors import FailedPredicateException - def __init__( - self, parser, parent: ParserRuleContext = None, invokingState: int = -1 - ): - super().__init__(parent, invokingState) - self.parser = parser + raise FailedPredicateException( + self, "self.precpred(self._ctx, 3)" + ) + self.state = 37 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not (_la == 5 or _la == 6): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 38 + self.match(ExprParser.IDENTIFIER) + pass - def TIME(self): - return self.getToken(ExprParser.TIME, 0) + elif la_ == 3: + localctx = ExprParser.ShiftMuldivContext( + self, + ExprParser.Shift_exprContext( + self, _parentctx, _parentState + ), + ) + self.pushNewRecursionContext( + localctx, _startState, self.RULE_shift_expr + ) + self.state = 39 + if not self.precpred(self._ctx, 2): + from antlr4.error.Errors import FailedPredicateException - def expr(self): - return self.getTypedRuleContext(ExprParser.ExprContext, 0) + raise FailedPredicateException( + self, "self.precpred(self._ctx, 2)" + ) + self.state = 40 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not (_la == 5 or _la == 6): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 41 + self.match(ExprParser.T__2) + self.state = 42 + self.expr(0) + self.state = 43 + self.match(ExprParser.T__3) + pass - def getRuleIndex(self): - return ExprParser.RULE_shift + elif la_ == 4: + localctx = ExprParser.ShiftAddsubContext( + self, + ExprParser.Shift_exprContext( + self, _parentctx, _parentState + ), + ) + self.pushNewRecursionContext( + localctx, _startState, self.RULE_shift_expr + ) + self.state = 45 + if not self.precpred(self._ctx, 1): + from antlr4.error.Errors import FailedPredicateException - def accept(self, visitor: ParseTreeVisitor): - if hasattr(visitor, "visitShift"): - return visitor.visitShift(self) - else: - return visitor.visitChildren(self) + raise FailedPredicateException( + self, "self.precpred(self._ctx, 1)" + ) + self.state = 46 + localctx.op = self._input.LT(1) + _la = self._input.LA(1) + if not (_la == 1 or _la == 2): + localctx.op = self._errHandler.recoverInline(self) + else: + self._errHandler.reportMatch(self) + self.consume() + self.state = 47 + self.expr(0) + pass - def shift(self): - localctx = ExprParser.ShiftContext(self, self._ctx, self.state) - self.enterRule(localctx, 2, self.RULE_shift) - self._la = 0 # Token type - try: - self.enterOuterAlt(localctx, 1) - self.state = 9 - self.match(ExprParser.TIME) - self.state = 11 - self._errHandler.sync(self) - _la = self._input.LA(1) - if ((_la) & ~0x3F) == 0 and ((1 << _la) & 5190) != 0: - self.state = 10 - self.expr(0) + self.state = 52 + self._errHandler.sync(self) + _alt = self._interp.adaptivePredict(self._input, 3, self._ctx) except RecognitionException as re: localctx.exception = re self._errHandler.reportError(self, re) self._errHandler.recover(self, re) finally: - self.exitRule() + self.unrollRecursionContexts(_parentctx) return localctx class ExprContext(ParserRuleContext): @@ -1161,23 +1880,6 @@ def accept(self, visitor: ParseTreeVisitor): else: return visitor.visitChildren(self) - class SignedIdentifierContext(ExprContext): - def __init__( - self, parser, ctx: ParserRuleContext - ): # actually a ExprParser.ExprContext - super().__init__(parser) - self.op = None # Token - self.copyFrom(ctx) - - def IDENTIFIER(self): - return self.getToken(ExprParser.IDENTIFIER, 0) - - def accept(self, visitor: ParseTreeVisitor): - if hasattr(visitor, "visitSignedIdentifier"): - return visitor.visitSignedIdentifier(self) - else: - return visitor.visitChildren(self) - class NumberContext(ExprContext): def __init__( self, parser, ctx: ParserRuleContext @@ -1250,23 +1952,6 @@ def accept(self, visitor: ParseTreeVisitor): else: return visitor.visitChildren(self) - class SignedNumberContext(ExprContext): - def __init__( - self, parser, ctx: ParserRuleContext - ): # actually a ExprParser.ExprContext - super().__init__(parser) - self.op = None # Token - self.copyFrom(ctx) - - def NUMBER(self): - return self.getToken(ExprParser.NUMBER, 0) - - def accept(self, visitor: ParseTreeVisitor): - if hasattr(visitor, "visitSignedNumber"): - return visitor.visitSignedNumber(self) - else: - return visitor.visitChildren(self) - class FunctionContext(ExprContext): def __init__( self, parser, ctx: ParserRuleContext @@ -1349,211 +2034,179 @@ def expr(self, _p: int = 0): _parentState = self.state localctx = ExprParser.ExprContext(self, self._ctx, _parentState) _prevctx = localctx - _startState = 4 - self.enterRecursionRule(localctx, 4, self.RULE_expr, _p) + _startState = 6 + self.enterRecursionRule(localctx, 6, self.RULE_expr, _p) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 72 + self.state = 108 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input, 3, self._ctx) + la_ = self._interp.adaptivePredict(self._input, 6, self._ctx) if la_ == 1: - localctx = ExprParser.SignedNumberContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - - self.state = 14 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not (_la == 1 or _la == 2): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 15 - self.match(ExprParser.NUMBER) - pass - - elif la_ == 2: - localctx = ExprParser.SignedIdentifierContext(self, localctx) - self._ctx = localctx - _prevctx = localctx - self.state = 16 - localctx.op = self._input.LT(1) - _la = self._input.LA(1) - if not (_la == 1 or _la == 2): - localctx.op = self._errHandler.recoverInline(self) - else: - self._errHandler.reportMatch(self) - self.consume() - self.state = 17 - self.match(ExprParser.IDENTIFIER) - pass - - elif la_ == 3: localctx = ExprParser.NegationContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 18 + + self.state = 54 self.match(ExprParser.T__1) - self.state = 19 - self.expr(11) + self.state = 55 + self.expr(13) pass - elif la_ == 4: + elif la_ == 2: localctx = ExprParser.IdentifierContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 20 + self.state = 56 self.match(ExprParser.IDENTIFIER) pass - elif la_ == 5: + elif la_ == 3: localctx = ExprParser.PortFieldContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 21 + self.state = 57 self.match(ExprParser.IDENTIFIER) - self.state = 22 - self.match(ExprParser.T__4) - self.state = 23 + self.state = 58 + self.match(ExprParser.T__6) + self.state = 59 self.match(ExprParser.IDENTIFIER) pass - elif la_ == 6: + elif la_ == 4: localctx = ExprParser.NumberContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 24 + self.state = 60 self.match(ExprParser.NUMBER) pass - elif la_ == 7: + elif la_ == 5: localctx = ExprParser.ExpressionContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 25 - self.match(ExprParser.T__5) - self.state = 26 + self.state = 61 + self.match(ExprParser.T__2) + self.state = 62 self.expr(0) - self.state = 27 - self.match(ExprParser.T__6) + self.state = 63 + self.match(ExprParser.T__3) pass - elif la_ == 8: + elif la_ == 6: localctx = ExprParser.FunctionContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 29 + self.state = 65 self.match(ExprParser.IDENTIFIER) - self.state = 30 - self.match(ExprParser.T__5) - self.state = 31 + self.state = 66 + self.match(ExprParser.T__2) + self.state = 67 self.expr(0) - self.state = 32 - self.match(ExprParser.T__6) + self.state = 68 + self.match(ExprParser.T__3) pass - elif la_ == 9: + elif la_ == 7: localctx = ExprParser.TimeShiftContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 34 + self.state = 70 self.match(ExprParser.IDENTIFIER) - self.state = 35 + self.state = 71 self.match(ExprParser.LBRACKET) - self.state = 36 + self.state = 72 self.shift() - self.state = 41 + self.state = 77 self._errHandler.sync(self) _la = self._input.LA(1) while _la == 8: - self.state = 37 + self.state = 73 self.match(ExprParser.T__7) - self.state = 38 + self.state = 74 self.shift() - self.state = 43 + self.state = 79 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 44 + self.state = 80 self.match(ExprParser.RBRACKET) pass - elif la_ == 10: + elif la_ == 8: localctx = ExprParser.TimeIndexContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 46 + self.state = 82 self.match(ExprParser.IDENTIFIER) - self.state = 47 + self.state = 83 self.match(ExprParser.LBRACKET) - self.state = 48 + self.state = 84 self.expr(0) - self.state = 53 + self.state = 89 self._errHandler.sync(self) _la = self._input.LA(1) while _la == 8: - self.state = 49 + self.state = 85 self.match(ExprParser.T__7) - self.state = 50 + self.state = 86 self.expr(0) - self.state = 55 + self.state = 91 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 56 + self.state = 92 self.match(ExprParser.RBRACKET) pass - elif la_ == 11: + elif la_ == 9: localctx = ExprParser.TimeShiftRangeContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 58 + self.state = 94 self.match(ExprParser.IDENTIFIER) - self.state = 59 + self.state = 95 self.match(ExprParser.LBRACKET) - self.state = 60 + self.state = 96 localctx.shift1 = self.shift() - self.state = 61 + self.state = 97 self.match(ExprParser.T__8) - self.state = 62 + self.state = 98 localctx.shift2 = self.shift() - self.state = 63 + self.state = 99 self.match(ExprParser.RBRACKET) pass - elif la_ == 12: + elif la_ == 10: localctx = ExprParser.TimeRangeContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 65 + self.state = 101 self.match(ExprParser.IDENTIFIER) - self.state = 66 + self.state = 102 self.match(ExprParser.LBRACKET) - self.state = 67 + self.state = 103 self.expr(0) - self.state = 68 + self.state = 104 self.match(ExprParser.T__8) - self.state = 69 + self.state = 105 self.expr(0) - self.state = 70 + self.state = 106 self.match(ExprParser.RBRACKET) pass self._ctx.stop = self._input.LT(-1) - self.state = 85 + self.state = 121 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input, 5, self._ctx) + _alt = self._interp.adaptivePredict(self._input, 8, self._ctx) while _alt != 2 and _alt != ATN.INVALID_ALT_NUMBER: if _alt == 1: if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 83 + self.state = 119 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input, 4, self._ctx) + la_ = self._interp.adaptivePredict(self._input, 7, self._ctx) if la_ == 1: localctx = ExprParser.MuldivContext( self, ExprParser.ExprContext(self, _parentctx, _parentState) @@ -1561,23 +2214,23 @@ def expr(self, _p: int = 0): self.pushNewRecursionContext( localctx, _startState, self.RULE_expr ) - self.state = 74 - if not self.precpred(self._ctx, 13): + self.state = 110 + if not self.precpred(self._ctx, 12): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException( - self, "self.precpred(self._ctx, 13)" + self, "self.precpred(self._ctx, 12)" ) - self.state = 75 + self.state = 111 localctx.op = self._input.LT(1) _la = self._input.LA(1) - if not (_la == 3 or _la == 4): + if not (_la == 5 or _la == 6): localctx.op = self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 76 - self.expr(14) + self.state = 112 + self.expr(13) pass elif la_ == 2: @@ -1587,14 +2240,14 @@ def expr(self, _p: int = 0): self.pushNewRecursionContext( localctx, _startState, self.RULE_expr ) - self.state = 77 - if not self.precpred(self._ctx, 12): + self.state = 113 + if not self.precpred(self._ctx, 11): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException( - self, "self.precpred(self._ctx, 12)" + self, "self.precpred(self._ctx, 11)" ) - self.state = 78 + self.state = 114 localctx.op = self._input.LT(1) _la = self._input.LA(1) if not (_la == 1 or _la == 2): @@ -1602,8 +2255,8 @@ def expr(self, _p: int = 0): else: self._errHandler.reportMatch(self) self.consume() - self.state = 79 - self.expr(13) + self.state = 115 + self.expr(12) pass elif la_ == 3: @@ -1613,22 +2266,22 @@ def expr(self, _p: int = 0): self.pushNewRecursionContext( localctx, _startState, self.RULE_expr ) - self.state = 80 + self.state = 116 if not self.precpred(self._ctx, 10): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException( self, "self.precpred(self._ctx, 10)" ) - self.state = 81 + self.state = 117 self.match(ExprParser.COMPARISON) - self.state = 82 + self.state = 118 self.expr(11) pass - self.state = 87 + self.state = 123 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input, 5, self._ctx) + _alt = self._interp.adaptivePredict(self._input, 8, self._ctx) except RecognitionException as re: localctx.exception = re @@ -1641,19 +2294,33 @@ def expr(self, _p: int = 0): def sempred(self, localctx: RuleContext, ruleIndex: int, predIndex: int): if self._predicates == None: self._predicates = dict() - self._predicates[2] = self.expr_sempred + self._predicates[2] = self.shift_expr_sempred + self._predicates[3] = self.expr_sempred pred = self._predicates.get(ruleIndex, None) if pred is None: raise Exception("No predicate with index:" + str(ruleIndex)) else: return pred(localctx, predIndex) - def expr_sempred(self, localctx: ExprContext, predIndex: int): + def shift_expr_sempred(self, localctx: Shift_exprContext, predIndex: int): if predIndex == 0: - return self.precpred(self._ctx, 13) + return self.precpred(self._ctx, 4) if predIndex == 1: - return self.precpred(self._ctx, 12) + return self.precpred(self._ctx, 3) if predIndex == 2: + return self.precpred(self._ctx, 2) + + if predIndex == 3: + return self.precpred(self._ctx, 1) + + def expr_sempred(self, localctx: ExprContext, predIndex: int): + if predIndex == 4: + return self.precpred(self._ctx, 12) + + if predIndex == 5: + return self.precpred(self._ctx, 11) + + if predIndex == 6: return self.precpred(self._ctx, 10) diff --git a/src/andromede/expression/parsing/antlr/ExprVisitor.py b/src/andromede/expression/parsing/antlr/ExprVisitor.py index 439ac968..0eb272f1 100644 --- a/src/andromede/expression/parsing/antlr/ExprVisitor.py +++ b/src/andromede/expression/parsing/antlr/ExprVisitor.py @@ -18,6 +18,38 @@ def visitFullexpr(self, ctx: ExprParser.FullexprContext): def visitShift(self, ctx: ExprParser.ShiftContext): return self.visitChildren(ctx) + # Visit a parse tree produced by ExprParser#shiftMuldivIdentifier. + def visitShiftMuldivIdentifier(self, ctx: ExprParser.ShiftMuldivIdentifierContext): + return self.visitChildren(ctx) + + # Visit a parse tree produced by ExprParser#signedIdentifier. + def visitSignedIdentifier(self, ctx: ExprParser.SignedIdentifierContext): + return self.visitChildren(ctx) + + # Visit a parse tree produced by ExprParser#signedExpression. + def visitSignedExpression(self, ctx: ExprParser.SignedExpressionContext): + return self.visitChildren(ctx) + + # Visit a parse tree produced by ExprParser#signedNumber. + def visitSignedNumber(self, ctx: ExprParser.SignedNumberContext): + return self.visitChildren(ctx) + + # Visit a parse tree produced by ExprParser#signedFunction. + def visitSignedFunction(self, ctx: ExprParser.SignedFunctionContext): + return self.visitChildren(ctx) + + # Visit a parse tree produced by ExprParser#shiftMuldivNumber. + def visitShiftMuldivNumber(self, ctx: ExprParser.ShiftMuldivNumberContext): + return self.visitChildren(ctx) + + # Visit a parse tree produced by ExprParser#shiftMuldiv. + def visitShiftMuldiv(self, ctx: ExprParser.ShiftMuldivContext): + return self.visitChildren(ctx) + + # Visit a parse tree produced by ExprParser#shiftAddsub. + def visitShiftAddsub(self, ctx: ExprParser.ShiftAddsubContext): + return self.visitChildren(ctx) + # Visit a parse tree produced by ExprParser#identifier. def visitIdentifier(self, ctx: ExprParser.IdentifierContext): return self.visitChildren(ctx) @@ -46,10 +78,6 @@ def visitPortField(self, ctx: ExprParser.PortFieldContext): def visitMuldiv(self, ctx: ExprParser.MuldivContext): return self.visitChildren(ctx) - # Visit a parse tree produced by ExprParser#signedIdentifier. - def visitSignedIdentifier(self, ctx: ExprParser.SignedIdentifierContext): - return self.visitChildren(ctx) - # Visit a parse tree produced by ExprParser#number. def visitNumber(self, ctx: ExprParser.NumberContext): return self.visitChildren(ctx) @@ -62,10 +90,6 @@ def visitTimeIndex(self, ctx: ExprParser.TimeIndexContext): def visitTimeShift(self, ctx: ExprParser.TimeShiftContext): return self.visitChildren(ctx) - # Visit a parse tree produced by ExprParser#signedNumber. - def visitSignedNumber(self, ctx: ExprParser.SignedNumberContext): - return self.visitChildren(ctx) - # Visit a parse tree produced by ExprParser#function. def visitFunction(self, ctx: ExprParser.FunctionContext): return self.visitChildren(ctx) diff --git a/src/andromede/expression/parsing/parse_expression.py b/src/andromede/expression/parsing/parse_expression.py index 91780814..ffa6b6bc 100644 --- a/src/andromede/expression/parsing/parse_expression.py +++ b/src/andromede/expression/parsing/parse_expression.py @@ -158,9 +158,9 @@ def visitFunction(self, ctx: ExprParser.FunctionContext) -> ExpressionNode: # Visit a parse tree produced by ExprParser#shift. def visitShift(self, ctx: ExprParser.ShiftContext) -> ExpressionNode: - if ctx.expr() is None: # type: ignore + if ctx.shift_expr() is None: # type: ignore return literal(0) - shift = ctx.expr().accept(self) # type: ignore + shift = ctx.shift_expr().accept(self) # type: ignore return shift # Visit a parse tree produced by ExprParser#signedNumber. @@ -170,19 +170,18 @@ def visitSignedNumber(self, ctx: ExprParser.SignedNumberContext) -> ExpressionNo else: return literal(float(ctx.NUMBER().getText())) # type: ignore - # - # # Visit a parse tree produced by ExprParser#shiftAddsub. - # def visitShiftAddsub(self, ctx: ExprParser.ShiftAddsubContext) -> ExpressionNode: - # left = ctx.shift_expr().accept(self) # type: ignore - # right = ctx.expr().accept(self) # type: ignore - # op = ctx.op.text # type: ignore - # if op == "+": - # return left + right - # elif op == "-": - # return left - right - # raise ValueError(f"Invalid operator {op}") - # - # # Visit a parse tree produced by ExprParser#signedIdentifier. + # Visit a parse tree produced by ExprParser#shiftAddsub. + def visitShiftAddsub(self, ctx: ExprParser.ShiftAddsubContext) -> ExpressionNode: + left = ctx.shift_expr().accept(self) # type: ignore + right = ctx.expr().accept(self) # type: ignore + op = ctx.op.text # type: ignore + if op == "+": + return left + right + elif op == "-": + return left - right + raise ValueError(f"Invalid operator {op}") + + # Visit a parse tree produced by ExprParser#signedIdentifier. def visitSignedIdentifier( self, ctx: ExprParser.SignedIdentifierContext ) -> ExpressionNode: @@ -191,57 +190,66 @@ def visitSignedIdentifier( else: return self._convert_identifier(ctx.IDENTIFIER().getText()) # type: ignore - # - # # Visit a parse tree produced by ExprParser#signedPortField. - # def visitSignedPortField( - # self, ctx: ExprParser.SignedPortFieldContext - # ) -> ExpressionNode: - # op = ctx.op.text # type: ignore - # if op == "-": - # return -PortFieldNode( - # port_name=ctx.IDENTIFIER(0).getText(), # type: ignore - # field_name=ctx.IDENTIFIER(1).getText(), # type: ignore - # ) - # else: - # return PortFieldNode( - # port_name=ctx.IDENTIFIER(0).getText(), # type: ignore - # field_name=ctx.IDENTIFIER(1).getText(), # type: ignore - # ) - # - # # Visit a parse tree produced by ExprParser#shiftMuldiv. - # def visitShiftMuldiv(self, ctx: ExprParser.ShiftMuldivContext) -> ExpressionNode: - # left = ctx.shift_expr().accept(self) # type: ignore - # right = ctx.expr().accept(self) # type: ignore - # op = ctx.op.text # type: ignore - # if op == "*": - # return left * right - # elif op == "/": - # return left / right - # raise ValueError(f"Invalid operator {op}") - # - # # Visit a parse tree produced by ExprParser#signedExpression. - # def visitSignedExpression( - # self, ctx: ExprParser.SignedExpressionContext - # ) -> ExpressionNode: - # if ctx.op.text == "-": # type: ignore - # return -ctx.expr().accept(self) # type: ignore - # else: - # return ctx.expr().accept(self) # type: ignore - # - # # Visit a parse tree produced by ExprParser#signedFunction. - # def visitSignedFunction( - # self, ctx: ExprParser.SignedFunctionContext - # ) -> ExpressionNode: - # function_name: str = ctx.IDENTIFIER().getText() # type: ignore - # operand: ExpressionNode = ctx.expr().accept(self) # type: ignore - # op = ctx.op.text # type: ignore - # fn = _FUNCTIONS.get(function_name, None) - # if fn is None: - # raise ValueError(f"Encountered invalid function name {function_name}") - # if ctx.op.text == "-": # type: ignore - # return -fn(operand) - # else: - # return fn(operand) + # Visit a parse tree produced by ExprParser#shiftMuldivIdentifier. + def visitShiftMuldivIdentifier( + self, ctx: ExprParser.ShiftMuldivIdentifierContext + ) -> ExpressionNode: + left = ctx.shift_expr().accept(self) # type: ignore + right = self._convert_identifier(ctx.IDENTIFIER().getText()) # type: ignore + op = ctx.op.text # type: ignore + if op == "*": + return left * right + elif op == "/": + return left / right + raise ValueError(f"Invalid operator {op}") + + # Visit a parse tree produced by ExprParser#shiftMuldivNumber. + def visitShiftMuldivNumber( + self, ctx: ExprParser.ShiftMuldivNumberContext + ) -> ExpressionNode: + left = ctx.shift_expr().accept(self) # type: ignore + right = literal(float(ctx.NUMBER().getText())) # type: ignore + op = ctx.op.text # type: ignore + if op == "*": + return left * right + elif op == "/": + return left / right + raise ValueError(f"Invalid operator {op}") + + # Visit a parse tree produced by ExprParser#shiftMuldiv. + def visitShiftMuldiv(self, ctx: ExprParser.ShiftMuldivContext) -> ExpressionNode: + left = ctx.shift_expr().accept(self) # type: ignore + right = ctx.expr().accept(self) # type: ignore + op = ctx.op.text # type: ignore + if op == "*": + return left * right + elif op == "/": + return left / right + raise ValueError(f"Invalid operator {op}") + + # Visit a parse tree produced by ExprParser#signedExpression. + def visitSignedExpression( + self, ctx: ExprParser.SignedExpressionContext + ) -> ExpressionNode: + if ctx.op.text == "-": # type: ignore + return -ctx.expr().accept(self) # type: ignore + else: + return ctx.expr().accept(self) # type: ignore + + # Visit a parse tree produced by ExprParser#signedFunction. + def visitSignedFunction( + self, ctx: ExprParser.SignedFunctionContext + ) -> ExpressionNode: + function_name: str = ctx.IDENTIFIER().getText() # type: ignore + operand: ExpressionNode = ctx.expr().accept(self) # type: ignore + op = ctx.op.text # type: ignore + fn = _FUNCTIONS.get(function_name, None) + if fn is None: + raise ValueError(f"Encountered invalid function name {function_name}") + if ctx.op.text == "-": # type: ignore + return -fn(operand) + else: + return fn(operand) _FUNCTIONS = { @@ -264,9 +272,7 @@ def parse_expression(expression: str, identifiers: ModelIdentifiers) -> Expressi lexer = ExprLexer(input) stream = CommonTokenStream(lexer) parser = ExprParser(stream) - # tree = parser.expr() parser._errHandler = BailErrorStrategy() - # print(tree.toStringTree(recog=parser)) return ExpressionNodeBuilderVisitor(identifiers).visit(parser.fullexpr()) # type: ignore