From 13eaa3d609317fb2f2bf0177834daac432f84dda Mon Sep 17 00:00:00 2001 From: nichenqin Date: Wed, 30 Oct 2024 16:02:17 +0800 Subject: [PATCH] fix: remove antlr4ts --- .../formula/formula-cursor.visitor.ts | 33 +- bun.lockb | Bin 589368 -> 589040 bytes packages/formula/package.json | 7 +- packages/formula/scripts/generate-parser.ts | 2 +- packages/formula/src/formula.visitor.ts | 64 +- .../formula/src/grammar/FormulaLexer.interp | 2 +- packages/formula/src/grammar/FormulaLexer.ts | 391 ++++--- .../formula/src/grammar/FormulaParser.interp | 2 +- packages/formula/src/grammar/FormulaParser.ts | 979 +++++++++--------- .../src/grammar/FormulaParserVisitor.ts | 159 ++- packages/formula/src/index.ts | 5 +- packages/formula/src/util.ts | 8 +- .../underlying/underlying-formula.visitor.ts | 47 +- .../formula-field/formula-field.visitor.ts | 38 - 14 files changed, 820 insertions(+), 917 deletions(-) delete mode 100644 packages/table/src/modules/schema/fields/variants/formula-field/formula-field.visitor.ts diff --git a/apps/frontend/src/lib/components/formula/formula-cursor.visitor.ts b/apps/frontend/src/lib/components/formula/formula-cursor.visitor.ts index d877455f5..7ff991608 100644 --- a/apps/frontend/src/lib/components/formula/formula-cursor.visitor.ts +++ b/apps/frontend/src/lib/components/formula/formula-cursor.visitor.ts @@ -1,5 +1,4 @@ import { - AbstractParseTreeVisitor, AddSubExprContext, AndExprContext, ArgumentListContext, @@ -16,7 +15,7 @@ import { VariableContext, } from "@undb/formula" -export class FormulaCursorVisitor extends AbstractParseTreeVisitor implements FormulaParserVisitor { +export class FormulaCursorVisitor extends FormulaParserVisitor { private pathNodes: ParseTree[] = [] private variables: Set = new Set() public readonly targetPosition: number @@ -46,7 +45,7 @@ export class FormulaCursorVisitor extends AbstractParseTreeVisitor impleme public getFunctionName(): string | undefined { const functionCall = this.getNearestFunctionNode() - return functionCall?.IDENTIFIER()?.text + return functionCall?.IDENTIFIER().getText() } protected defaultResult(): void { @@ -60,8 +59,8 @@ export class FormulaCursorVisitor extends AbstractParseTreeVisitor impleme visitPositionInRange(ctx: ExpressionContext) { if (!ctx.start || !ctx.stop) return - const start = ctx.start.startIndex - const stop = ctx.stop.stopIndex + const start = ctx.start.tokenIndex + const stop = ctx.stop.tokenIndex const isPositionWithinRange = start <= this.targetPosition && stop >= this.targetPosition if (isPositionWithinRange) { @@ -70,48 +69,48 @@ export class FormulaCursorVisitor extends AbstractParseTreeVisitor impleme } } - visitFormula(ctx: FormulaContext) { + visitFormula = (ctx: FormulaContext) => { this.visitPositionInRange(ctx) } - visitComparisonExpr(ctx: ComparisonExprContext) { + visitComparisonExpr = (ctx: ComparisonExprContext) => { this.visitPositionInRange(ctx) } - visitAndExpr(ctx: AndExprContext) { + visitAndExpr = (ctx: AndExprContext) => { this.visitPositionInRange(ctx) } - visitOrExpr(ctx: OrExprContext) { + visitOrExpr = (ctx: OrExprContext) => { this.visitPositionInRange(ctx) } - visitNotExpr(ctx: NotExprContext) { + visitNotExpr = (ctx: NotExprContext) => { this.visitPositionInRange(ctx) } - visitMulDivModExpr(ctx: MulDivModExprContext) { + visitMulDivModExpr = (ctx: MulDivModExprContext) => { this.visitPositionInRange(ctx) } - visitAddSubExpr(ctx: AddSubExprContext) { + visitAddSubExpr = (ctx: AddSubExprContext) => { this.visitPositionInRange(ctx) } - visitFunctionExpr(ctx: FunctionExprContext) { + visitFunctionExpr = (ctx: FunctionExprContext) => { this.visitPositionInRange(ctx) } - visitFunctionCall(ctx: FunctionCallContext) { + visitFunctionCall = (ctx: FunctionCallContext) => { this.visitPositionInRange(ctx) } - visitArgumentList(ctx: ArgumentListContext) { + visitArgumentList = (ctx: ArgumentListContext) => { this.visitPositionInRange(ctx) } - visitVariable(ctx: VariableContext) { - this.variables.add(ctx.IDENTIFIER().text) + visitVariable = (ctx: VariableContext) => { + this.variables.add(ctx.IDENTIFIER().getText()) this.visitPositionInRange(ctx) } } diff --git a/bun.lockb b/bun.lockb index 508ca4655d6ccc7bcc3c8dc692078265913a7053..f0c1840b8fbb57ee0df11c749f3ffa9805f3c62e 100755 GIT binary patch delta 97828 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 -W6B7Odvy_`3;R8Wx=}@JX|Z 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 K#ir2cyy9PZ!hO>K diff --git a/packages/formula/package.json b/packages/formula/package.json index ddaa33eac..09ae28105 100644 --- a/packages/formula/package.json +++ b/packages/formula/package.json @@ -4,18 +4,17 @@ "type": "module", "types": "src/index.d.ts", "devDependencies": { - "@types/bun": "latest", - "antlr4ts-cli": "^0.5.0-alpha.4" + "@types/bun": "latest" }, "peerDependencies": { "typescript": "^5.0.0" }, "dependencies": { "@undb/zod": "*", - "antlr4ts": "^0.5.0-alpha.4" + "antlr4": "^4.13.2" }, "scripts": { "generate-parser": "bun run scripts/generate-parser.ts", - "generate": "bun generate-parser" + "generate": "bun run generate-parser" } } diff --git a/packages/formula/scripts/generate-parser.ts b/packages/formula/scripts/generate-parser.ts index c898b2df3..8bd379e1d 100644 --- a/packages/formula/scripts/generate-parser.ts +++ b/packages/formula/scripts/generate-parser.ts @@ -1,3 +1,3 @@ import { $ } from "bun" -await $`antlr4ts -visitor -no-listener src/grammar/*.g4` +await $`antlr -Dlanguage=TypeScript -visitor -no-listener src/grammar/*.g4` diff --git a/packages/formula/src/formula.visitor.ts b/packages/formula/src/formula.visitor.ts index eeb513571..47e3da2f7 100644 --- a/packages/formula/src/formula.visitor.ts +++ b/packages/formula/src/formula.visitor.ts @@ -1,4 +1,3 @@ -import { AbstractParseTreeVisitor } from "antlr4ts/tree/AbstractParseTreeVisitor" import { FormulaFunction } from "./formula/formula.type" import { globalFunctionRegistry } from "./formula/registry" import { @@ -18,7 +17,7 @@ import { VariableContext, VariableExprContext, } from "./grammar/FormulaParser" -import type { FormulaParserVisitor } from "./grammar/FormulaParserVisitor" +import FormulaParserVisitor from "./grammar/FormulaParserVisitor" import { ArgumentListResult, ReturnType, @@ -28,10 +27,7 @@ import { type VariableResult, } from "./types" -export class FormulaVisitor - extends AbstractParseTreeVisitor - implements FormulaParserVisitor -{ +export class FormulaVisitor extends FormulaParserVisitor { private variables: Set = new Set() private assertType(result: ExpressionResult, types: ReturnType[]): boolean { @@ -53,11 +49,11 @@ export class FormulaVisitor return true } - visitFormula(ctx: FormulaContext): ExpressionResult { + visitFormula = (ctx: FormulaContext): ExpressionResult => { return this.visit(ctx.expression()) } - visitMulDivModExpr(ctx: MulDivModExprContext): ExpressionResult { + visitMulDivModExpr = (ctx: MulDivModExprContext): ExpressionResult => { const left = this.visit(ctx.expression(0)) as NumberResult | VariableResult const right = this.visit(ctx.expression(1)) as NumberResult | VariableResult @@ -70,11 +66,11 @@ export class FormulaVisitor name: op, arguments: [left, right], returnType: "number", - value: ctx.text, + value: ctx.getText(), } } - visitAddSubExpr(ctx: AddSubExprContext): ExpressionResult { + visitAddSubExpr = (ctx: AddSubExprContext): ExpressionResult => { const left = this.visit(ctx.expression(0)) as NumberResult | VariableResult const right = this.visit(ctx.expression(1)) as NumberResult | VariableResult @@ -87,11 +83,11 @@ export class FormulaVisitor name: op, arguments: [left, right], returnType: "number", - value: ctx.text, + value: ctx.getText(), } } - visitComparisonExpr(ctx: ComparisonExprContext): ExpressionResult { + visitComparisonExpr = (ctx: ComparisonExprContext): ExpressionResult => { const left = this.visit(ctx.expression(0)) const right = this.visit(ctx.expression(1)) @@ -104,11 +100,11 @@ export class FormulaVisitor name: op, arguments: [left, right], returnType: "boolean", - value: ctx.text, + value: ctx.getText(), } } - visitAndExpr(ctx: AndExprContext): ExpressionResult { + visitAndExpr = (ctx: AndExprContext): ExpressionResult => { const left = this.visit(ctx.expression(0)) const right = this.visit(ctx.expression(1)) @@ -120,11 +116,11 @@ export class FormulaVisitor name: "AND", arguments: [left, right], returnType: "boolean", - value: ctx.text, + value: ctx.getText(), } } - visitOrExpr(ctx: OrExprContext): ExpressionResult { + visitOrExpr = (ctx: OrExprContext): ExpressionResult => { const left = this.visit(ctx.expression(0)) const right = this.visit(ctx.expression(1)) @@ -136,11 +132,11 @@ export class FormulaVisitor name: "OR", arguments: [left, right], returnType: "boolean", - value: ctx.text, + value: ctx.getText(), } } - visitNotExpr(ctx: NotExprContext): ExpressionResult { + visitNotExpr = (ctx: NotExprContext): ExpressionResult => { const expr = this.visit(ctx.expression()) this.assertType(expr, ["boolean"]) return { @@ -148,32 +144,32 @@ export class FormulaVisitor name: "NOT", arguments: [expr], returnType: "boolean", - value: ctx.text, + value: ctx.getText(), } } - visitFunctionExpr(ctx: FunctionExprContext): ExpressionResult { + visitFunctionExpr = (ctx: FunctionExprContext): ExpressionResult => { return this.visit(ctx.functionCall()) } - visitVariableExpr(ctx: VariableExprContext): ExpressionResult { + visitVariableExpr = (ctx: VariableExprContext): ExpressionResult => { return this.visit(ctx.variable()) } - visitNumberExpr(ctx: NumberExprContext): ExpressionResult { - return { type: "number", value: Number(ctx.NUMBER().text) } + visitNumberExpr = (ctx: NumberExprContext): ExpressionResult => { + return { type: "number", value: Number(ctx.NUMBER().getText()) } } - visitStringExpr(ctx: StringExprContext): ExpressionResult { - return { type: "string", value: ctx.STRING().text.slice(1, -1) } + visitStringExpr = (ctx: StringExprContext): ExpressionResult => { + return { type: "string", value: ctx.STRING().getText().slice(1, -1) } } - visitParenExpr(ctx: ParenExprContext): ExpressionResult { + visitParenExpr = (ctx: ParenExprContext): ExpressionResult => { return this.visit(ctx.expression()) } - visitFunctionCall(ctx: FunctionCallContext): ExpressionResult { - const funcName = ctx.IDENTIFIER().text as FormulaFunction + visitFunctionCall = (ctx: FunctionCallContext): ExpressionResult => { + const funcName = ctx.IDENTIFIER().getText() as FormulaFunction const args = ctx.argumentList() ? (this.visit(ctx.argumentList()!) as FunctionExpressionResult) : undefined if (!globalFunctionRegistry.isValid(funcName)) { @@ -191,20 +187,20 @@ export class FormulaVisitor name: funcName, arguments: args?.arguments ?? [], returnType, - value: ctx.text, + value: ctx.getText(), } } - visitArgumentList(ctx: ArgumentListContext): ArgumentListResult { - const args = ctx.expression().map((expr) => this.visit(expr)) + visitArgumentList = (ctx: ArgumentListContext): ArgumentListResult => { + const args = ctx.expression_list().map((expr) => this.visit(expr)) return { type: "argumentList", arguments: args, } } - visitVariable(ctx: VariableContext): VariableResult { - const variableName = ctx.IDENTIFIER().text - const raw = ctx.text + visitVariable = (ctx: VariableContext): VariableResult => { + const variableName = ctx.IDENTIFIER().getText() + const raw = ctx.getText() this.variables.add(variableName) return { type: "variable", value: raw, variable: variableName } } diff --git a/packages/formula/src/grammar/FormulaLexer.interp b/packages/formula/src/grammar/FormulaLexer.interp index 6fefff5f8..5b2652930 100644 --- a/packages/formula/src/grammar/FormulaLexer.interp +++ b/packages/formula/src/grammar/FormulaLexer.interp @@ -156,4 +156,4 @@ mode names: DEFAULT_MODE atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 40, 351, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 200, 10, 28, 12, 28, 14, 28, 203, 11, 28, 3, 29, 6, 29, 206, 10, 29, 13, 29, 14, 29, 207, 3, 29, 3, 29, 6, 29, 212, 10, 29, 13, 29, 14, 29, 213, 5, 29, 216, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 222, 10, 30, 12, 30, 14, 30, 225, 11, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 6, 37, 265, 10, 37, 13, 37, 14, 37, 266, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 7, 38, 275, 10, 38, 12, 38, 14, 38, 278, 11, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 7, 39, 286, 10, 39, 12, 39, 14, 39, 289, 11, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 65, 3, 65, 3, 66, 3, 66, 3, 67, 3, 67, 3, 287, 2, 2, 68, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 14, 27, 2, 15, 29, 2, 16, 31, 2, 17, 33, 2, 18, 35, 2, 19, 37, 2, 20, 39, 2, 21, 41, 2, 22, 43, 2, 23, 45, 2, 24, 47, 2, 25, 49, 2, 26, 51, 2, 27, 53, 2, 28, 55, 2, 29, 57, 2, 30, 59, 2, 31, 61, 2, 32, 63, 2, 33, 65, 2, 34, 67, 2, 35, 69, 2, 36, 71, 2, 37, 73, 2, 38, 75, 2, 39, 77, 2, 40, 79, 2, 2, 81, 2, 2, 83, 2, 2, 85, 2, 2, 87, 2, 2, 89, 2, 2, 91, 2, 2, 93, 2, 2, 95, 2, 2, 97, 2, 2, 99, 2, 2, 101, 2, 2, 103, 2, 2, 105, 2, 2, 107, 2, 2, 109, 2, 2, 111, 2, 2, 113, 2, 2, 115, 2, 2, 117, 2, 2, 119, 2, 2, 121, 2, 2, 123, 2, 2, 125, 2, 2, 127, 2, 2, 129, 2, 2, 131, 2, 2, 133, 2, 2, 3, 2, 33, 3, 2, 41, 41, 5, 2, 11, 12, 15, 15, 34, 34, 4, 2, 12, 12, 15, 15, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 4, 2, 67, 67, 99, 99, 4, 2, 68, 68, 100, 100, 4, 2, 69, 69, 101, 101, 4, 2, 70, 70, 102, 102, 4, 2, 71, 71, 103, 103, 4, 2, 72, 72, 104, 104, 4, 2, 73, 73, 105, 105, 4, 2, 74, 74, 106, 106, 4, 2, 75, 75, 107, 107, 4, 2, 76, 76, 108, 108, 4, 2, 77, 77, 109, 109, 4, 2, 78, 78, 110, 110, 4, 2, 79, 79, 111, 111, 4, 2, 80, 80, 112, 112, 4, 2, 81, 81, 113, 113, 4, 2, 82, 82, 114, 114, 4, 2, 83, 83, 115, 115, 4, 2, 84, 84, 116, 116, 4, 2, 85, 85, 117, 117, 4, 2, 86, 86, 118, 118, 4, 2, 87, 87, 119, 119, 4, 2, 88, 88, 120, 120, 4, 2, 89, 89, 121, 121, 4, 2, 90, 90, 122, 122, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 2, 333, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 3, 135, 3, 2, 2, 2, 5, 137, 3, 2, 2, 2, 7, 139, 3, 2, 2, 2, 9, 141, 3, 2, 2, 2, 11, 143, 3, 2, 2, 2, 13, 145, 3, 2, 2, 2, 15, 147, 3, 2, 2, 2, 17, 149, 3, 2, 2, 2, 19, 152, 3, 2, 2, 2, 21, 154, 3, 2, 2, 2, 23, 157, 3, 2, 2, 2, 25, 159, 3, 2, 2, 2, 27, 162, 3, 2, 2, 2, 29, 166, 3, 2, 2, 2, 31, 169, 3, 2, 2, 2, 33, 173, 3, 2, 2, 2, 35, 175, 3, 2, 2, 2, 37, 177, 3, 2, 2, 2, 39, 179, 3, 2, 2, 2, 41, 181, 3, 2, 2, 2, 43, 183, 3, 2, 2, 2, 45, 185, 3, 2, 2, 2, 47, 187, 3, 2, 2, 2, 49, 189, 3, 2, 2, 2, 51, 191, 3, 2, 2, 2, 53, 193, 3, 2, 2, 2, 55, 195, 3, 2, 2, 2, 57, 205, 3, 2, 2, 2, 59, 217, 3, 2, 2, 2, 61, 228, 3, 2, 2, 2, 63, 233, 3, 2, 2, 2, 65, 239, 3, 2, 2, 2, 67, 244, 3, 2, 2, 2, 69, 249, 3, 2, 2, 2, 71, 254, 3, 2, 2, 2, 73, 264, 3, 2, 2, 2, 75, 270, 3, 2, 2, 2, 77, 281, 3, 2, 2, 2, 79, 295, 3, 2, 2, 2, 81, 297, 3, 2, 2, 2, 83, 299, 3, 2, 2, 2, 85, 301, 3, 2, 2, 2, 87, 303, 3, 2, 2, 2, 89, 305, 3, 2, 2, 2, 91, 307, 3, 2, 2, 2, 93, 309, 3, 2, 2, 2, 95, 311, 3, 2, 2, 2, 97, 313, 3, 2, 2, 2, 99, 315, 3, 2, 2, 2, 101, 317, 3, 2, 2, 2, 103, 319, 3, 2, 2, 2, 105, 321, 3, 2, 2, 2, 107, 323, 3, 2, 2, 2, 109, 325, 3, 2, 2, 2, 111, 327, 3, 2, 2, 2, 113, 329, 3, 2, 2, 2, 115, 331, 3, 2, 2, 2, 117, 333, 3, 2, 2, 2, 119, 335, 3, 2, 2, 2, 121, 337, 3, 2, 2, 2, 123, 339, 3, 2, 2, 2, 125, 341, 3, 2, 2, 2, 127, 343, 3, 2, 2, 2, 129, 345, 3, 2, 2, 2, 131, 347, 3, 2, 2, 2, 133, 349, 3, 2, 2, 2, 135, 136, 7, 45, 2, 2, 136, 4, 3, 2, 2, 2, 137, 138, 7, 47, 2, 2, 138, 6, 3, 2, 2, 2, 139, 140, 7, 44, 2, 2, 140, 8, 3, 2, 2, 2, 141, 142, 7, 49, 2, 2, 142, 10, 3, 2, 2, 2, 143, 144, 7, 39, 2, 2, 144, 12, 3, 2, 2, 2, 145, 146, 7, 96, 2, 2, 146, 14, 3, 2, 2, 2, 147, 148, 7, 63, 2, 2, 148, 16, 3, 2, 2, 2, 149, 150, 7, 35, 2, 2, 150, 151, 7, 63, 2, 2, 151, 18, 3, 2, 2, 2, 152, 153, 7, 62, 2, 2, 153, 20, 3, 2, 2, 2, 154, 155, 7, 62, 2, 2, 155, 156, 7, 63, 2, 2, 156, 22, 3, 2, 2, 2, 157, 158, 7, 64, 2, 2, 158, 24, 3, 2, 2, 2, 159, 160, 7, 64, 2, 2, 160, 161, 7, 63, 2, 2, 161, 26, 3, 2, 2, 2, 162, 163, 5, 83, 42, 2, 163, 164, 5, 109, 55, 2, 164, 165, 5, 89, 45, 2, 165, 28, 3, 2, 2, 2, 166, 167, 5, 111, 56, 2, 167, 168, 5, 117, 59, 2, 168, 30, 3, 2, 2, 2, 169, 170, 5, 109, 55, 2, 170, 171, 5, 111, 56, 2, 171, 172, 5, 121, 61, 2, 172, 32, 3, 2, 2, 2, 173, 174, 7, 42, 2, 2, 174, 34, 3, 2, 2, 2, 175, 176, 7, 43, 2, 2, 176, 36, 3, 2, 2, 2, 177, 178, 7, 125, 2, 2, 178, 38, 3, 2, 2, 2, 179, 180, 7, 127, 2, 2, 180, 40, 3, 2, 2, 2, 181, 182, 7, 93, 2, 2, 182, 42, 3, 2, 2, 2, 183, 184, 7, 95, 2, 2, 184, 44, 3, 2, 2, 2, 185, 186, 7, 46, 2, 2, 186, 46, 3, 2, 2, 2, 187, 188, 7, 61, 2, 2, 188, 48, 3, 2, 2, 2, 189, 190, 7, 60, 2, 2, 190, 50, 3, 2, 2, 2, 191, 192, 7, 48, 2, 2, 192, 52, 3, 2, 2, 2, 193, 194, 7, 97, 2, 2, 194, 54, 3, 2, 2, 2, 195, 201, 5, 81, 41, 2, 196, 200, 5, 81, 41, 2, 197, 200, 5, 79, 40, 2, 198, 200, 5, 53, 27, 2, 199, 196, 3, 2, 2, 2, 199, 197, 3, 2, 2, 2, 199, 198, 3, 2, 2, 2, 200, 203, 3, 2, 2, 2, 201, 199, 3, 2, 2, 2, 201, 202, 3, 2, 2, 2, 202, 56, 3, 2, 2, 2, 203, 201, 3, 2, 2, 2, 204, 206, 5, 79, 40, 2, 205, 204, 3, 2, 2, 2, 206, 207, 3, 2, 2, 2, 207, 205, 3, 2, 2, 2, 207, 208, 3, 2, 2, 2, 208, 215, 3, 2, 2, 2, 209, 211, 7, 48, 2, 2, 210, 212, 5, 79, 40, 2, 211, 210, 3, 2, 2, 2, 212, 213, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 209, 3, 2, 2, 2, 215, 216, 3, 2, 2, 2, 216, 58, 3, 2, 2, 2, 217, 223, 7, 41, 2, 2, 218, 222, 10, 2, 2, 2, 219, 220, 7, 41, 2, 2, 220, 222, 7, 41, 2, 2, 221, 218, 3, 2, 2, 2, 221, 219, 3, 2, 2, 2, 222, 225, 3, 2, 2, 2, 223, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 226, 3, 2, 2, 2, 225, 223, 3, 2, 2, 2, 226, 227, 7, 41, 2, 2, 227, 60, 3, 2, 2, 2, 228, 229, 5, 121, 61, 2, 229, 230, 5, 117, 59, 2, 230, 231, 5, 123, 62, 2, 231, 232, 5, 91, 46, 2, 232, 62, 3, 2, 2, 2, 233, 234, 5, 93, 47, 2, 234, 235, 5, 83, 42, 2, 235, 236, 5, 105, 53, 2, 236, 237, 5, 119, 60, 2, 237, 238, 5, 91, 46, 2, 238, 64, 3, 2, 2, 2, 239, 240, 5, 109, 55, 2, 240, 241, 5, 123, 62, 2, 241, 242, 5, 105, 53, 2, 242, 243, 5, 105, 53, 2, 243, 66, 3, 2, 2, 2, 244, 245, 5, 89, 45, 2, 245, 246, 5, 83, 42, 2, 246, 247, 5, 121, 61, 2, 247, 248, 5, 91, 46, 2, 248, 68, 3, 2, 2, 2, 249, 250, 5, 121, 61, 2, 250, 251, 5, 99, 50, 2, 251, 252, 5, 107, 54, 2, 252, 253, 5, 91, 46, 2, 253, 70, 3, 2, 2, 2, 254, 255, 5, 89, 45, 2, 255, 256, 5, 83, 42, 2, 256, 257, 5, 121, 61, 2, 257, 258, 5, 91, 46, 2, 258, 259, 5, 121, 61, 2, 259, 260, 5, 99, 50, 2, 260, 261, 5, 107, 54, 2, 261, 262, 5, 91, 46, 2, 262, 72, 3, 2, 2, 2, 263, 265, 9, 3, 2, 2, 264, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 269, 8, 37, 2, 2, 269, 74, 3, 2, 2, 2, 270, 271, 7, 49, 2, 2, 271, 272, 7, 49, 2, 2, 272, 276, 3, 2, 2, 2, 273, 275, 10, 4, 2, 2, 274, 273, 3, 2, 2, 2, 275, 278, 3, 2, 2, 2, 276, 274, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 279, 3, 2, 2, 2, 278, 276, 3, 2, 2, 2, 279, 280, 8, 38, 2, 2, 280, 76, 3, 2, 2, 2, 281, 282, 7, 49, 2, 2, 282, 283, 7, 44, 2, 2, 283, 287, 3, 2, 2, 2, 284, 286, 11, 2, 2, 2, 285, 284, 3, 2, 2, 2, 286, 289, 3, 2, 2, 2, 287, 288, 3, 2, 2, 2, 287, 285, 3, 2, 2, 2, 288, 290, 3, 2, 2, 2, 289, 287, 3, 2, 2, 2, 290, 291, 7, 44, 2, 2, 291, 292, 7, 49, 2, 2, 292, 293, 3, 2, 2, 2, 293, 294, 8, 39, 2, 2, 294, 78, 3, 2, 2, 2, 295, 296, 9, 5, 2, 2, 296, 80, 3, 2, 2, 2, 297, 298, 9, 6, 2, 2, 298, 82, 3, 2, 2, 2, 299, 300, 9, 7, 2, 2, 300, 84, 3, 2, 2, 2, 301, 302, 9, 8, 2, 2, 302, 86, 3, 2, 2, 2, 303, 304, 9, 9, 2, 2, 304, 88, 3, 2, 2, 2, 305, 306, 9, 10, 2, 2, 306, 90, 3, 2, 2, 2, 307, 308, 9, 11, 2, 2, 308, 92, 3, 2, 2, 2, 309, 310, 9, 12, 2, 2, 310, 94, 3, 2, 2, 2, 311, 312, 9, 13, 2, 2, 312, 96, 3, 2, 2, 2, 313, 314, 9, 14, 2, 2, 314, 98, 3, 2, 2, 2, 315, 316, 9, 15, 2, 2, 316, 100, 3, 2, 2, 2, 317, 318, 9, 16, 2, 2, 318, 102, 3, 2, 2, 2, 319, 320, 9, 17, 2, 2, 320, 104, 3, 2, 2, 2, 321, 322, 9, 18, 2, 2, 322, 106, 3, 2, 2, 2, 323, 324, 9, 19, 2, 2, 324, 108, 3, 2, 2, 2, 325, 326, 9, 20, 2, 2, 326, 110, 3, 2, 2, 2, 327, 328, 9, 21, 2, 2, 328, 112, 3, 2, 2, 2, 329, 330, 9, 22, 2, 2, 330, 114, 3, 2, 2, 2, 331, 332, 9, 23, 2, 2, 332, 116, 3, 2, 2, 2, 333, 334, 9, 24, 2, 2, 334, 118, 3, 2, 2, 2, 335, 336, 9, 25, 2, 2, 336, 120, 3, 2, 2, 2, 337, 338, 9, 26, 2, 2, 338, 122, 3, 2, 2, 2, 339, 340, 9, 27, 2, 2, 340, 124, 3, 2, 2, 2, 341, 342, 9, 28, 2, 2, 342, 126, 3, 2, 2, 2, 343, 344, 9, 29, 2, 2, 344, 128, 3, 2, 2, 2, 345, 346, 9, 30, 2, 2, 346, 130, 3, 2, 2, 2, 347, 348, 9, 31, 2, 2, 348, 132, 3, 2, 2, 2, 349, 350, 9, 32, 2, 2, 350, 134, 3, 2, 2, 2, 13, 2, 199, 201, 207, 213, 215, 221, 223, 266, 276, 287, 3, 8, 2, 2] \ No newline at end of file +[4, 0, 38, 349, 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, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 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, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 5, 26, 198, 8, 26, 10, 26, 12, 26, 201, 9, 26, 1, 27, 4, 27, 204, 8, 27, 11, 27, 12, 27, 205, 1, 27, 1, 27, 4, 27, 210, 8, 27, 11, 27, 12, 27, 211, 3, 27, 214, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 5, 28, 220, 8, 28, 10, 28, 12, 28, 223, 9, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 4, 35, 263, 8, 35, 11, 35, 12, 35, 264, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 273, 8, 36, 10, 36, 12, 36, 276, 9, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 284, 8, 37, 10, 37, 12, 37, 287, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 285, 0, 66, 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, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 0, 79, 0, 81, 0, 83, 0, 85, 0, 87, 0, 89, 0, 91, 0, 93, 0, 95, 0, 97, 0, 99, 0, 101, 0, 103, 0, 105, 0, 107, 0, 109, 0, 111, 0, 113, 0, 115, 0, 117, 0, 119, 0, 121, 0, 123, 0, 125, 0, 127, 0, 129, 0, 131, 0, 1, 0, 31, 1, 0, 39, 39, 3, 0, 9, 10, 13, 13, 32, 32, 2, 0, 10, 10, 13, 13, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, 99, 2, 0, 68, 68, 100, 100, 2, 0, 69, 69, 101, 101, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, 122, 331, 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, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 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, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 1, 133, 1, 0, 0, 0, 3, 135, 1, 0, 0, 0, 5, 137, 1, 0, 0, 0, 7, 139, 1, 0, 0, 0, 9, 141, 1, 0, 0, 0, 11, 143, 1, 0, 0, 0, 13, 145, 1, 0, 0, 0, 15, 147, 1, 0, 0, 0, 17, 150, 1, 0, 0, 0, 19, 152, 1, 0, 0, 0, 21, 155, 1, 0, 0, 0, 23, 157, 1, 0, 0, 0, 25, 160, 1, 0, 0, 0, 27, 164, 1, 0, 0, 0, 29, 167, 1, 0, 0, 0, 31, 171, 1, 0, 0, 0, 33, 173, 1, 0, 0, 0, 35, 175, 1, 0, 0, 0, 37, 177, 1, 0, 0, 0, 39, 179, 1, 0, 0, 0, 41, 181, 1, 0, 0, 0, 43, 183, 1, 0, 0, 0, 45, 185, 1, 0, 0, 0, 47, 187, 1, 0, 0, 0, 49, 189, 1, 0, 0, 0, 51, 191, 1, 0, 0, 0, 53, 193, 1, 0, 0, 0, 55, 203, 1, 0, 0, 0, 57, 215, 1, 0, 0, 0, 59, 226, 1, 0, 0, 0, 61, 231, 1, 0, 0, 0, 63, 237, 1, 0, 0, 0, 65, 242, 1, 0, 0, 0, 67, 247, 1, 0, 0, 0, 69, 252, 1, 0, 0, 0, 71, 262, 1, 0, 0, 0, 73, 268, 1, 0, 0, 0, 75, 279, 1, 0, 0, 0, 77, 293, 1, 0, 0, 0, 79, 295, 1, 0, 0, 0, 81, 297, 1, 0, 0, 0, 83, 299, 1, 0, 0, 0, 85, 301, 1, 0, 0, 0, 87, 303, 1, 0, 0, 0, 89, 305, 1, 0, 0, 0, 91, 307, 1, 0, 0, 0, 93, 309, 1, 0, 0, 0, 95, 311, 1, 0, 0, 0, 97, 313, 1, 0, 0, 0, 99, 315, 1, 0, 0, 0, 101, 317, 1, 0, 0, 0, 103, 319, 1, 0, 0, 0, 105, 321, 1, 0, 0, 0, 107, 323, 1, 0, 0, 0, 109, 325, 1, 0, 0, 0, 111, 327, 1, 0, 0, 0, 113, 329, 1, 0, 0, 0, 115, 331, 1, 0, 0, 0, 117, 333, 1, 0, 0, 0, 119, 335, 1, 0, 0, 0, 121, 337, 1, 0, 0, 0, 123, 339, 1, 0, 0, 0, 125, 341, 1, 0, 0, 0, 127, 343, 1, 0, 0, 0, 129, 345, 1, 0, 0, 0, 131, 347, 1, 0, 0, 0, 133, 134, 5, 43, 0, 0, 134, 2, 1, 0, 0, 0, 135, 136, 5, 45, 0, 0, 136, 4, 1, 0, 0, 0, 137, 138, 5, 42, 0, 0, 138, 6, 1, 0, 0, 0, 139, 140, 5, 47, 0, 0, 140, 8, 1, 0, 0, 0, 141, 142, 5, 37, 0, 0, 142, 10, 1, 0, 0, 0, 143, 144, 5, 94, 0, 0, 144, 12, 1, 0, 0, 0, 145, 146, 5, 61, 0, 0, 146, 14, 1, 0, 0, 0, 147, 148, 5, 33, 0, 0, 148, 149, 5, 61, 0, 0, 149, 16, 1, 0, 0, 0, 150, 151, 5, 60, 0, 0, 151, 18, 1, 0, 0, 0, 152, 153, 5, 60, 0, 0, 153, 154, 5, 61, 0, 0, 154, 20, 1, 0, 0, 0, 155, 156, 5, 62, 0, 0, 156, 22, 1, 0, 0, 0, 157, 158, 5, 62, 0, 0, 158, 159, 5, 61, 0, 0, 159, 24, 1, 0, 0, 0, 160, 161, 3, 81, 40, 0, 161, 162, 3, 107, 53, 0, 162, 163, 3, 87, 43, 0, 163, 26, 1, 0, 0, 0, 164, 165, 3, 109, 54, 0, 165, 166, 3, 115, 57, 0, 166, 28, 1, 0, 0, 0, 167, 168, 3, 107, 53, 0, 168, 169, 3, 109, 54, 0, 169, 170, 3, 119, 59, 0, 170, 30, 1, 0, 0, 0, 171, 172, 5, 40, 0, 0, 172, 32, 1, 0, 0, 0, 173, 174, 5, 41, 0, 0, 174, 34, 1, 0, 0, 0, 175, 176, 5, 123, 0, 0, 176, 36, 1, 0, 0, 0, 177, 178, 5, 125, 0, 0, 178, 38, 1, 0, 0, 0, 179, 180, 5, 91, 0, 0, 180, 40, 1, 0, 0, 0, 181, 182, 5, 93, 0, 0, 182, 42, 1, 0, 0, 0, 183, 184, 5, 44, 0, 0, 184, 44, 1, 0, 0, 0, 185, 186, 5, 59, 0, 0, 186, 46, 1, 0, 0, 0, 187, 188, 5, 58, 0, 0, 188, 48, 1, 0, 0, 0, 189, 190, 5, 46, 0, 0, 190, 50, 1, 0, 0, 0, 191, 192, 5, 95, 0, 0, 192, 52, 1, 0, 0, 0, 193, 199, 3, 79, 39, 0, 194, 198, 3, 79, 39, 0, 195, 198, 3, 77, 38, 0, 196, 198, 3, 51, 25, 0, 197, 194, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 197, 196, 1, 0, 0, 0, 198, 201, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 54, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 202, 204, 3, 77, 38, 0, 203, 202, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 203, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 213, 1, 0, 0, 0, 207, 209, 5, 46, 0, 0, 208, 210, 3, 77, 38, 0, 209, 208, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 209, 1, 0, 0, 0, 211, 212, 1, 0, 0, 0, 212, 214, 1, 0, 0, 0, 213, 207, 1, 0, 0, 0, 213, 214, 1, 0, 0, 0, 214, 56, 1, 0, 0, 0, 215, 221, 5, 39, 0, 0, 216, 220, 8, 0, 0, 0, 217, 218, 5, 39, 0, 0, 218, 220, 5, 39, 0, 0, 219, 216, 1, 0, 0, 0, 219, 217, 1, 0, 0, 0, 220, 223, 1, 0, 0, 0, 221, 219, 1, 0, 0, 0, 221, 222, 1, 0, 0, 0, 222, 224, 1, 0, 0, 0, 223, 221, 1, 0, 0, 0, 224, 225, 5, 39, 0, 0, 225, 58, 1, 0, 0, 0, 226, 227, 3, 119, 59, 0, 227, 228, 3, 115, 57, 0, 228, 229, 3, 121, 60, 0, 229, 230, 3, 89, 44, 0, 230, 60, 1, 0, 0, 0, 231, 232, 3, 91, 45, 0, 232, 233, 3, 81, 40, 0, 233, 234, 3, 103, 51, 0, 234, 235, 3, 117, 58, 0, 235, 236, 3, 89, 44, 0, 236, 62, 1, 0, 0, 0, 237, 238, 3, 107, 53, 0, 238, 239, 3, 121, 60, 0, 239, 240, 3, 103, 51, 0, 240, 241, 3, 103, 51, 0, 241, 64, 1, 0, 0, 0, 242, 243, 3, 87, 43, 0, 243, 244, 3, 81, 40, 0, 244, 245, 3, 119, 59, 0, 245, 246, 3, 89, 44, 0, 246, 66, 1, 0, 0, 0, 247, 248, 3, 119, 59, 0, 248, 249, 3, 97, 48, 0, 249, 250, 3, 105, 52, 0, 250, 251, 3, 89, 44, 0, 251, 68, 1, 0, 0, 0, 252, 253, 3, 87, 43, 0, 253, 254, 3, 81, 40, 0, 254, 255, 3, 119, 59, 0, 255, 256, 3, 89, 44, 0, 256, 257, 3, 119, 59, 0, 257, 258, 3, 97, 48, 0, 258, 259, 3, 105, 52, 0, 259, 260, 3, 89, 44, 0, 260, 70, 1, 0, 0, 0, 261, 263, 7, 1, 0, 0, 262, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 262, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 1, 0, 0, 0, 266, 267, 6, 35, 0, 0, 267, 72, 1, 0, 0, 0, 268, 269, 5, 47, 0, 0, 269, 270, 5, 47, 0, 0, 270, 274, 1, 0, 0, 0, 271, 273, 8, 2, 0, 0, 272, 271, 1, 0, 0, 0, 273, 276, 1, 0, 0, 0, 274, 272, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 277, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 277, 278, 6, 36, 0, 0, 278, 74, 1, 0, 0, 0, 279, 280, 5, 47, 0, 0, 280, 281, 5, 42, 0, 0, 281, 285, 1, 0, 0, 0, 282, 284, 9, 0, 0, 0, 283, 282, 1, 0, 0, 0, 284, 287, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 285, 283, 1, 0, 0, 0, 286, 288, 1, 0, 0, 0, 287, 285, 1, 0, 0, 0, 288, 289, 5, 42, 0, 0, 289, 290, 5, 47, 0, 0, 290, 291, 1, 0, 0, 0, 291, 292, 6, 37, 0, 0, 292, 76, 1, 0, 0, 0, 293, 294, 7, 3, 0, 0, 294, 78, 1, 0, 0, 0, 295, 296, 7, 4, 0, 0, 296, 80, 1, 0, 0, 0, 297, 298, 7, 5, 0, 0, 298, 82, 1, 0, 0, 0, 299, 300, 7, 6, 0, 0, 300, 84, 1, 0, 0, 0, 301, 302, 7, 7, 0, 0, 302, 86, 1, 0, 0, 0, 303, 304, 7, 8, 0, 0, 304, 88, 1, 0, 0, 0, 305, 306, 7, 9, 0, 0, 306, 90, 1, 0, 0, 0, 307, 308, 7, 10, 0, 0, 308, 92, 1, 0, 0, 0, 309, 310, 7, 11, 0, 0, 310, 94, 1, 0, 0, 0, 311, 312, 7, 12, 0, 0, 312, 96, 1, 0, 0, 0, 313, 314, 7, 13, 0, 0, 314, 98, 1, 0, 0, 0, 315, 316, 7, 14, 0, 0, 316, 100, 1, 0, 0, 0, 317, 318, 7, 15, 0, 0, 318, 102, 1, 0, 0, 0, 319, 320, 7, 16, 0, 0, 320, 104, 1, 0, 0, 0, 321, 322, 7, 17, 0, 0, 322, 106, 1, 0, 0, 0, 323, 324, 7, 18, 0, 0, 324, 108, 1, 0, 0, 0, 325, 326, 7, 19, 0, 0, 326, 110, 1, 0, 0, 0, 327, 328, 7, 20, 0, 0, 328, 112, 1, 0, 0, 0, 329, 330, 7, 21, 0, 0, 330, 114, 1, 0, 0, 0, 331, 332, 7, 22, 0, 0, 332, 116, 1, 0, 0, 0, 333, 334, 7, 23, 0, 0, 334, 118, 1, 0, 0, 0, 335, 336, 7, 24, 0, 0, 336, 120, 1, 0, 0, 0, 337, 338, 7, 25, 0, 0, 338, 122, 1, 0, 0, 0, 339, 340, 7, 26, 0, 0, 340, 124, 1, 0, 0, 0, 341, 342, 7, 27, 0, 0, 342, 126, 1, 0, 0, 0, 343, 344, 7, 28, 0, 0, 344, 128, 1, 0, 0, 0, 345, 346, 7, 29, 0, 0, 346, 130, 1, 0, 0, 0, 347, 348, 7, 30, 0, 0, 348, 132, 1, 0, 0, 0, 11, 0, 197, 199, 205, 211, 213, 219, 221, 264, 274, 285, 1, 6, 0, 0] \ No newline at end of file diff --git a/packages/formula/src/grammar/FormulaLexer.ts b/packages/formula/src/grammar/FormulaLexer.ts index 21703eae9..1bb9d0235 100644 --- a/packages/formula/src/grammar/FormulaLexer.ts +++ b/packages/formula/src/grammar/FormulaLexer.ts @@ -1,21 +1,17 @@ -// Generated from src/grammar/FormulaLexer.g4 by ANTLR 4.9.0-SNAPSHOT - - -import { ATN } from "antlr4ts/atn/ATN"; -import { ATNDeserializer } from "antlr4ts/atn/ATNDeserializer"; -import { CharStream } from "antlr4ts/CharStream"; -import { Lexer } from "antlr4ts/Lexer"; -import { LexerATNSimulator } from "antlr4ts/atn/LexerATNSimulator"; -import { NotNull } from "antlr4ts/Decorators"; -import { Override } from "antlr4ts/Decorators"; -import { RuleContext } from "antlr4ts/RuleContext"; -import { Vocabulary } from "antlr4ts/Vocabulary"; -import { VocabularyImpl } from "antlr4ts/VocabularyImpl"; - -import * as Utils from "antlr4ts/misc/Utils"; - - -export class FormulaLexer extends Lexer { +// Generated from src/grammar/FormulaLexer.g4 by ANTLR 4.13.2 +// noinspection ES6UnusedImports,JSUnusedGlobalSymbols,JSUnusedLocalSymbols +import { + ATN, + ATNDeserializer, + CharStream, + DecisionState, DFA, + Lexer, + LexerATNSimulator, + RuleContext, + PredictionContextCache, + Token +} from "antlr4"; +export default class FormulaLexer extends Lexer { public static readonly ADD = 1; public static readonly SUBTRACT = 2; public static readonly MULTIPLY = 3; @@ -54,16 +50,48 @@ export class FormulaLexer extends Lexer { public static readonly WS = 36; public static readonly COMMENT = 37; public static readonly MULTILINE_COMMENT = 38; - - // tslint:disable:no-trailing-whitespace - public static readonly channelNames: string[] = [ - "DEFAULT_TOKEN_CHANNEL", "HIDDEN", - ]; - - // tslint:disable:no-trailing-whitespace - public static readonly modeNames: string[] = [ - "DEFAULT_MODE", - ]; + public static readonly EOF = Token.EOF; + + public static readonly channelNames: string[] = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; + public static readonly literalNames: (string | null)[] = [ null, "'+'", + "'-'", "'*'", + "'/'", "'%'", + "'^'", "'='", + "'!='", "'<'", + "'<='", "'>'", + "'>='", null, + null, null, + "'('", "')'", + "'{'", "'}'", + "'['", "']'", + "','", "';'", + "':'", "'.'", + "'_'" ]; + public static readonly symbolicNames: (string | null)[] = [ null, "ADD", + "SUBTRACT", + "MULTIPLY", + "DIVIDE", "MODULO", + "POWER", "EQUAL", + "NOT_EQUAL", + "LESS", "LESS_EQUAL", + "GREATER", + "GREATER_EQUAL", + "AND", "OR", + "NOT", "LPAREN", + "RPAREN", "LBRACE", + "RBRACE", "LBRACKET", + "RBRACKET", + "COMMA", "SEMICOLON", + "COLON", "DOT", + "UNDERSCORE", + "IDENTIFIER", + "NUMBER", "STRING", + "TRUE", "FALSE", + "NULL", "DATE", + "TIME", "DATETIME", + "WS", "COMMENT", + "MULTILINE_COMMENT" ]; + public static readonly modeNames: string[] = [ "DEFAULT_MODE", ]; public static readonly ruleNames: string[] = [ "ADD", "SUBTRACT", "MULTIPLY", "DIVIDE", "MODULO", "POWER", "EQUAL", "NOT_EQUAL", @@ -76,211 +104,146 @@ export class FormulaLexer extends Lexer { "U", "V", "W", "X", "Y", "Z", ]; - private static readonly _LITERAL_NAMES: Array = [ - undefined, "'+'", "'-'", "'*'", "'/'", "'%'", "'^'", "'='", "'!='", "'<'", - "'<='", "'>'", "'>='", undefined, undefined, undefined, "'('", "')'", - "'{'", "'}'", "'['", "']'", "','", "';'", "':'", "'.'", "'_'", - ]; - private static readonly _SYMBOLIC_NAMES: Array = [ - undefined, "ADD", "SUBTRACT", "MULTIPLY", "DIVIDE", "MODULO", "POWER", - "EQUAL", "NOT_EQUAL", "LESS", "LESS_EQUAL", "GREATER", "GREATER_EQUAL", - "AND", "OR", "NOT", "LPAREN", "RPAREN", "LBRACE", "RBRACE", "LBRACKET", - "RBRACKET", "COMMA", "SEMICOLON", "COLON", "DOT", "UNDERSCORE", "IDENTIFIER", - "NUMBER", "STRING", "TRUE", "FALSE", "NULL", "DATE", "TIME", "DATETIME", - "WS", "COMMENT", "MULTILINE_COMMENT", - ]; - public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(FormulaLexer._LITERAL_NAMES, FormulaLexer._SYMBOLIC_NAMES, []); - - // @Override - // @NotNull - public get vocabulary(): Vocabulary { - return FormulaLexer.VOCABULARY; - } - // tslint:enable:no-trailing-whitespace - constructor(input: CharStream) { super(input); - this._interp = new LexerATNSimulator(FormulaLexer._ATN, this); + this._interp = new LexerATNSimulator(this, FormulaLexer._ATN, FormulaLexer.DecisionsToDFA, new PredictionContextCache()); } - // @Override public get grammarFileName(): string { return "FormulaLexer.g4"; } - // @Override + public get literalNames(): (string | null)[] { return FormulaLexer.literalNames; } + public get symbolicNames(): (string | null)[] { return FormulaLexer.symbolicNames; } public get ruleNames(): string[] { return FormulaLexer.ruleNames; } - // @Override - public get serializedATN(): string { return FormulaLexer._serializedATN; } + public get serializedATN(): number[] { return FormulaLexer._serializedATN; } - // @Override public get channelNames(): string[] { return FormulaLexer.channelNames; } - // @Override public get modeNames(): string[] { return FormulaLexer.modeNames; } - public static readonly _serializedATN: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02(\u015F\b\x01" + - "\x04\x02\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06" + - "\x04\x07\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r" + - "\t\r\x04\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t" + - "\x12\x04\x13\t\x13\x04\x14\t\x14\x04\x15\t\x15\x04\x16\t\x16\x04\x17\t" + - "\x17\x04\x18\t\x18\x04\x19\t\x19\x04\x1A\t\x1A\x04\x1B\t\x1B\x04\x1C\t" + - "\x1C\x04\x1D\t\x1D\x04\x1E\t\x1E\x04\x1F\t\x1F\x04 \t \x04!\t!\x04\"\t" + - "\"\x04#\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x04)\t)\x04*\t*\x04" + - "+\t+\x04,\t,\x04-\t-\x04.\t.\x04/\t/\x040\t0\x041\t1\x042\t2\x043\t3\x04" + - "4\t4\x045\t5\x046\t6\x047\t7\x048\t8\x049\t9\x04:\t:\x04;\t;\x04<\t<\x04" + - "=\t=\x04>\t>\x04?\t?\x04@\t@\x04A\tA\x04B\tB\x04C\tC\x03\x02\x03\x02\x03" + - "\x03\x03\x03\x03\x04\x03\x04\x03\x05\x03\x05\x03\x06\x03\x06\x03\x07\x03" + - "\x07\x03\b\x03\b\x03\t\x03\t\x03\t\x03\n\x03\n\x03\v\x03\v\x03\v\x03\f" + - "\x03\f\x03\r\x03\r\x03\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12" + - "\x03\x13\x03\x13\x03\x14\x03\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x17" + - "\x03\x17\x03\x18\x03\x18\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1B\x03\x1B" + - "\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x07\x1C\xC8\n\x1C\f\x1C\x0E\x1C\xCB\v" + - "\x1C\x03\x1D\x06\x1D\xCE\n\x1D\r\x1D\x0E\x1D\xCF\x03\x1D\x03\x1D\x06\x1D" + - "\xD4\n\x1D\r\x1D\x0E\x1D\xD5\x05\x1D\xD8\n\x1D\x03\x1E\x03\x1E\x03\x1E" + - "\x03\x1E\x07\x1E\xDE\n\x1E\f\x1E\x0E\x1E\xE1\v\x1E\x03\x1E\x03\x1E\x03" + - "\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x03 \x03 \x03 \x03 \x03" + - "!\x03!\x03!\x03!\x03!\x03\"\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x03#\x03" + - "#\x03#\x03$\x03$\x03$\x03$\x03$\x03$\x03$\x03$\x03$\x03%\x06%\u0109\n" + - "%\r%\x0E%\u010A\x03%\x03%\x03&\x03&\x03&\x03&\x07&\u0113\n&\f&\x0E&\u0116" + - "\v&\x03&\x03&\x03\'\x03\'\x03\'\x03\'\x07\'\u011E\n\'\f\'\x0E\'\u0121" + - "\v\'\x03\'\x03\'\x03\'\x03\'\x03\'\x03(\x03(\x03)\x03)\x03*\x03*\x03+" + - "\x03+\x03,\x03,\x03-\x03-\x03.\x03.\x03/\x03/\x030\x030\x031\x031\x03" + - "2\x032\x033\x033\x034\x034\x035\x035\x036\x036\x037\x037\x038\x038\x03" + - "9\x039\x03:\x03:\x03;\x03;\x03<\x03<\x03=\x03=\x03>\x03>\x03?\x03?\x03" + - "@\x03@\x03A\x03A\x03B\x03B\x03C\x03C\x03\u011F\x02\x02D\x03\x02\x03\x05" + - "\x02\x04\x07\x02\x05\t\x02\x06\v\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13" + - "\x02\v\x15\x02\f\x17\x02\r\x19\x02\x0E\x1B\x02\x0F\x1D\x02\x10\x1F\x02" + - "\x11!\x02\x12#\x02\x13%\x02\x14\'\x02\x15)\x02\x16+\x02\x17-\x02\x18/" + - "\x02\x191\x02\x1A3\x02\x1B5\x02\x1C7\x02\x1D9\x02\x1E;\x02\x1F=\x02 ?" + - "\x02!A\x02\"C\x02#E\x02$G\x02%I\x02&K\x02\'M\x02(O\x02\x02Q\x02\x02S\x02" + - "\x02U\x02\x02W\x02\x02Y\x02\x02[\x02\x02]\x02\x02_\x02\x02a\x02\x02c\x02" + - "\x02e\x02\x02g\x02\x02i\x02\x02k\x02\x02m\x02\x02o\x02\x02q\x02\x02s\x02" + - "\x02u\x02\x02w\x02\x02y\x02\x02{\x02\x02}\x02\x02\x7F\x02\x02\x81\x02" + - "\x02\x83\x02\x02\x85\x02\x02\x03\x02!\x03\x02))\x05\x02\v\f\x0F\x0F\"" + - "\"\x04\x02\f\f\x0F\x0F\x03\x022;\x04\x02C\\c|\x04\x02CCcc\x04\x02DDdd" + - "\x04\x02EEee\x04\x02FFff\x04\x02GGgg\x04\x02HHhh\x04\x02IIii\x04\x02J" + - "Jjj\x04\x02KKkk\x04\x02LLll\x04\x02MMmm\x04\x02NNnn\x04\x02OOoo\x04\x02" + - "PPpp\x04\x02QQqq\x04\x02RRrr\x04\x02SSss\x04\x02TTtt\x04\x02UUuu\x04\x02" + - "VVvv\x04\x02WWww\x04\x02XXxx\x04\x02YYyy\x04\x02ZZzz\x04\x02[[{{\x04\x02" + - "\\\\||\x02\u014D\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02\x02\x07" + - "\x03\x02\x02\x02\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03" + - "\x02\x02\x02\x02\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03" + - "\x02\x02\x02\x02\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03" + - "\x02\x02\x02\x02\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03" + - "\x02\x02\x02\x02!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02" + - "\x02\x02\'\x03\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x02" + - "-\x03\x02\x02\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x023\x03\x02" + - "\x02\x02\x025\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02\x02\x02" + - "\x02;\x03\x02\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02\x02A\x03" + - "\x02\x02\x02\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03\x02\x02" + - "\x02\x02I\x03\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02\x02\x03" + - "\x87\x03\x02\x02\x02\x05\x89\x03\x02\x02\x02\x07\x8B\x03\x02\x02\x02\t" + - "\x8D\x03\x02\x02\x02\v\x8F\x03\x02\x02\x02\r\x91\x03\x02\x02\x02\x0F\x93" + - "\x03\x02\x02\x02\x11\x95\x03\x02\x02\x02\x13\x98\x03\x02\x02\x02\x15\x9A" + - "\x03\x02\x02\x02\x17\x9D\x03\x02\x02\x02\x19\x9F\x03\x02\x02\x02\x1B\xA2" + - "\x03\x02\x02\x02\x1D\xA6\x03\x02\x02\x02\x1F\xA9\x03\x02\x02\x02!\xAD" + - "\x03\x02\x02\x02#\xAF\x03\x02\x02\x02%\xB1\x03\x02\x02\x02\'\xB3\x03\x02" + - "\x02\x02)\xB5\x03\x02\x02\x02+\xB7\x03\x02\x02\x02-\xB9\x03\x02\x02\x02" + - "/\xBB\x03\x02\x02\x021\xBD\x03\x02\x02\x023\xBF\x03\x02\x02\x025\xC1\x03" + - "\x02\x02\x027\xC3\x03\x02\x02\x029\xCD\x03\x02\x02\x02;\xD9\x03\x02\x02" + - "\x02=\xE4\x03\x02\x02\x02?\xE9\x03\x02\x02\x02A\xEF\x03\x02\x02\x02C\xF4" + - "\x03\x02\x02\x02E\xF9\x03\x02\x02\x02G\xFE\x03\x02\x02\x02I\u0108\x03" + - "\x02\x02\x02K\u010E\x03\x02\x02\x02M\u0119\x03\x02\x02\x02O\u0127\x03" + - "\x02\x02\x02Q\u0129\x03\x02\x02\x02S\u012B\x03\x02\x02\x02U\u012D\x03" + - "\x02\x02\x02W\u012F\x03\x02\x02\x02Y\u0131\x03\x02\x02\x02[\u0133\x03" + - "\x02\x02\x02]\u0135\x03\x02\x02\x02_\u0137\x03\x02\x02\x02a\u0139\x03" + - "\x02\x02\x02c\u013B\x03\x02\x02\x02e\u013D\x03\x02\x02\x02g\u013F\x03" + - "\x02\x02\x02i\u0141\x03\x02\x02\x02k\u0143\x03\x02\x02\x02m\u0145\x03" + - "\x02\x02\x02o\u0147\x03\x02\x02\x02q\u0149\x03\x02\x02\x02s\u014B\x03" + - "\x02\x02\x02u\u014D\x03\x02\x02\x02w\u014F\x03\x02\x02\x02y\u0151\x03" + - "\x02\x02\x02{\u0153\x03\x02\x02\x02}\u0155\x03\x02\x02\x02\x7F\u0157\x03" + - "\x02\x02\x02\x81\u0159\x03\x02\x02\x02\x83\u015B\x03\x02\x02\x02\x85\u015D" + - "\x03\x02\x02\x02\x87\x88\x07-\x02\x02\x88\x04\x03\x02\x02\x02\x89\x8A" + - "\x07/\x02\x02\x8A\x06\x03\x02\x02\x02\x8B\x8C\x07,\x02\x02\x8C\b\x03\x02" + - "\x02\x02\x8D\x8E\x071\x02\x02\x8E\n\x03\x02\x02\x02\x8F\x90\x07\'\x02" + - "\x02\x90\f\x03\x02\x02\x02\x91\x92\x07`\x02\x02\x92\x0E\x03\x02\x02\x02" + - "\x93\x94\x07?\x02\x02\x94\x10\x03\x02\x02\x02\x95\x96\x07#\x02\x02\x96" + - "\x97\x07?\x02\x02\x97\x12\x03\x02\x02\x02\x98\x99\x07>\x02\x02\x99\x14" + - "\x03\x02\x02\x02\x9A\x9B\x07>\x02\x02\x9B\x9C\x07?\x02\x02\x9C\x16\x03" + - "\x02\x02\x02\x9D\x9E\x07@\x02\x02\x9E\x18\x03\x02\x02\x02\x9F\xA0\x07" + - "@\x02\x02\xA0\xA1\x07?\x02\x02\xA1\x1A\x03\x02\x02\x02\xA2\xA3\x05S*\x02" + - "\xA3\xA4\x05m7\x02\xA4\xA5\x05Y-\x02\xA5\x1C\x03\x02\x02\x02\xA6\xA7\x05" + - "o8\x02\xA7\xA8\x05u;\x02\xA8\x1E\x03\x02\x02\x02\xA9\xAA\x05m7\x02\xAA" + - "\xAB\x05o8\x02\xAB\xAC\x05y=\x02\xAC \x03\x02\x02\x02\xAD\xAE\x07*\x02" + - "\x02\xAE\"\x03\x02\x02\x02\xAF\xB0\x07+\x02\x02\xB0$\x03\x02\x02\x02\xB1" + - "\xB2\x07}\x02\x02\xB2&\x03\x02\x02\x02\xB3\xB4\x07\x7F\x02\x02\xB4(\x03" + - "\x02\x02\x02\xB5\xB6\x07]\x02\x02\xB6*\x03\x02\x02\x02\xB7\xB8\x07_\x02" + - "\x02\xB8,\x03\x02\x02\x02\xB9\xBA\x07.\x02\x02\xBA.\x03\x02\x02\x02\xBB" + - "\xBC\x07=\x02\x02\xBC0\x03\x02\x02\x02\xBD\xBE\x07<\x02\x02\xBE2\x03\x02" + - "\x02\x02\xBF\xC0\x070\x02\x02\xC04\x03\x02\x02\x02\xC1\xC2\x07a\x02\x02" + - "\xC26\x03\x02\x02\x02\xC3\xC9\x05Q)\x02\xC4\xC8\x05Q)\x02\xC5\xC8\x05" + - "O(\x02\xC6\xC8\x055\x1B\x02\xC7\xC4\x03\x02\x02\x02\xC7\xC5\x03\x02\x02" + - "\x02\xC7\xC6\x03\x02\x02\x02\xC8\xCB\x03\x02\x02\x02\xC9\xC7\x03\x02\x02" + - "\x02\xC9\xCA\x03\x02\x02\x02\xCA8\x03\x02\x02\x02\xCB\xC9\x03\x02\x02" + - "\x02\xCC\xCE\x05O(\x02\xCD\xCC\x03\x02\x02\x02\xCE\xCF\x03\x02\x02\x02" + - "\xCF\xCD\x03\x02\x02\x02\xCF\xD0\x03\x02\x02\x02\xD0\xD7\x03\x02\x02\x02" + - "\xD1\xD3\x070\x02\x02\xD2\xD4\x05O(\x02\xD3\xD2\x03\x02\x02\x02\xD4\xD5" + - "\x03\x02\x02\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6\x03\x02\x02\x02\xD6\xD8" + - "\x03\x02\x02\x02\xD7\xD1\x03\x02\x02\x02\xD7\xD8\x03\x02\x02\x02\xD8:" + - "\x03\x02\x02\x02\xD9\xDF\x07)\x02\x02\xDA\xDE\n\x02\x02\x02\xDB\xDC\x07" + - ")\x02\x02\xDC\xDE\x07)\x02\x02\xDD\xDA\x03\x02\x02\x02\xDD\xDB\x03\x02" + - "\x02\x02\xDE\xE1\x03\x02\x02\x02\xDF\xDD\x03\x02\x02\x02\xDF\xE0\x03\x02" + - "\x02\x02\xE0\xE2\x03\x02\x02\x02\xE1\xDF\x03\x02\x02\x02\xE2\xE3\x07)" + - "\x02\x02\xE3<\x03\x02\x02\x02\xE4\xE5\x05y=\x02\xE5\xE6\x05u;\x02\xE6" + - "\xE7\x05{>\x02\xE7\xE8\x05[.\x02\xE8>\x03\x02\x02\x02\xE9\xEA\x05]/\x02" + - "\xEA\xEB\x05S*\x02\xEB\xEC\x05i5\x02\xEC\xED\x05w<\x02\xED\xEE\x05[.\x02" + - "\xEE@\x03\x02\x02\x02\xEF\xF0\x05m7\x02\xF0\xF1\x05{>\x02\xF1\xF2\x05" + - "i5\x02\xF2\xF3\x05i5\x02\xF3B\x03\x02\x02\x02\xF4\xF5\x05Y-\x02\xF5\xF6" + - "\x05S*\x02\xF6\xF7\x05y=\x02\xF7\xF8\x05[.\x02\xF8D\x03\x02\x02\x02\xF9" + - "\xFA\x05y=\x02\xFA\xFB\x05c2\x02\xFB\xFC\x05k6\x02\xFC\xFD\x05[.\x02\xFD" + - "F\x03\x02\x02\x02\xFE\xFF\x05Y-\x02\xFF\u0100\x05S*\x02\u0100\u0101\x05" + - "y=\x02\u0101\u0102\x05[.\x02\u0102\u0103\x05y=\x02\u0103\u0104\x05c2\x02" + - "\u0104\u0105\x05k6\x02\u0105\u0106\x05[.\x02\u0106H\x03\x02\x02\x02\u0107" + - "\u0109\t\x03\x02\x02\u0108\u0107\x03\x02\x02\x02\u0109\u010A\x03\x02\x02" + - "\x02\u010A\u0108\x03\x02\x02\x02\u010A\u010B\x03\x02\x02\x02\u010B\u010C" + - "\x03\x02\x02\x02\u010C\u010D\b%\x02\x02\u010DJ\x03\x02\x02\x02\u010E\u010F" + - "\x071\x02\x02\u010F\u0110\x071\x02\x02\u0110\u0114\x03\x02\x02\x02\u0111" + - "\u0113\n\x04\x02\x02\u0112\u0111\x03\x02\x02\x02\u0113\u0116\x03\x02\x02" + - "\x02\u0114\u0112\x03\x02\x02\x02\u0114\u0115\x03\x02\x02\x02\u0115\u0117" + - "\x03\x02\x02\x02\u0116\u0114\x03\x02\x02\x02\u0117\u0118\b&\x02\x02\u0118" + - "L\x03\x02\x02\x02\u0119\u011A\x071\x02\x02\u011A\u011B\x07,\x02\x02\u011B" + - "\u011F\x03\x02\x02\x02\u011C\u011E\v\x02\x02\x02\u011D\u011C\x03\x02\x02" + - "\x02\u011E\u0121\x03\x02\x02\x02\u011F\u0120\x03\x02\x02\x02\u011F\u011D" + - "\x03\x02\x02\x02\u0120\u0122\x03\x02\x02\x02\u0121\u011F\x03\x02\x02\x02" + - "\u0122\u0123\x07,\x02\x02\u0123\u0124\x071\x02\x02\u0124\u0125\x03\x02" + - "\x02\x02\u0125\u0126\b\'\x02\x02\u0126N\x03\x02\x02\x02\u0127\u0128\t" + - "\x05\x02\x02\u0128P\x03\x02\x02\x02\u0129\u012A\t\x06\x02\x02\u012AR\x03" + - "\x02\x02\x02\u012B\u012C\t\x07\x02\x02\u012CT\x03\x02\x02\x02\u012D\u012E" + - "\t\b\x02\x02\u012EV\x03\x02\x02\x02\u012F\u0130\t\t\x02\x02\u0130X\x03" + - "\x02\x02\x02\u0131\u0132\t\n\x02\x02\u0132Z\x03\x02\x02\x02\u0133\u0134" + - "\t\v\x02\x02\u0134\\\x03\x02\x02\x02\u0135\u0136\t\f\x02\x02\u0136^\x03" + - "\x02\x02\x02\u0137\u0138\t\r\x02\x02\u0138`\x03\x02\x02\x02\u0139\u013A" + - "\t\x0E\x02\x02\u013Ab\x03\x02\x02\x02\u013B\u013C\t\x0F\x02\x02\u013C" + - "d\x03\x02\x02\x02\u013D\u013E\t\x10\x02\x02\u013Ef\x03\x02\x02\x02\u013F" + - "\u0140\t\x11\x02\x02\u0140h\x03\x02\x02\x02\u0141\u0142\t\x12\x02\x02" + - "\u0142j\x03\x02\x02\x02\u0143\u0144\t\x13\x02\x02\u0144l\x03\x02\x02\x02" + - "\u0145\u0146\t\x14\x02\x02\u0146n\x03\x02\x02\x02\u0147\u0148\t\x15\x02" + - "\x02\u0148p\x03\x02\x02\x02\u0149\u014A\t\x16\x02\x02\u014Ar\x03\x02\x02" + - "\x02\u014B\u014C\t\x17\x02\x02\u014Ct\x03\x02\x02\x02\u014D\u014E\t\x18" + - "\x02\x02\u014Ev\x03\x02\x02\x02\u014F\u0150\t\x19\x02\x02\u0150x\x03\x02" + - "\x02\x02\u0151\u0152\t\x1A\x02\x02\u0152z\x03\x02\x02\x02\u0153\u0154" + - "\t\x1B\x02\x02\u0154|\x03\x02\x02\x02\u0155\u0156\t\x1C\x02\x02\u0156" + - "~\x03\x02\x02\x02\u0157\u0158\t\x1D\x02\x02\u0158\x80\x03\x02\x02\x02" + - "\u0159\u015A\t\x1E\x02\x02\u015A\x82\x03\x02\x02\x02\u015B\u015C\t\x1F" + - "\x02\x02\u015C\x84\x03\x02\x02\x02\u015D\u015E\t \x02\x02\u015E\x86\x03" + - "\x02\x02\x02\r\x02\xC7\xC9\xCF\xD5\xD7\xDD\xDF\u010A\u0114\u011F\x03\b" + - "\x02\x02"; - public static __ATN: ATN; + public static readonly _serializedATN: number[] = [4,0,38,349,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,2,45,7, + 45,2,46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7,52, + 2,53,7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,2,59,7,59,2, + 60,7,60,2,61,7,61,2,62,7,62,2,63,7,63,2,64,7,64,2,65,7,65,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,7,1,8,1,8,1,9,1,9,1, + 9,1,10,1,10,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,14,1,14, + 1,14,1,14,1,15,1,15,1,16,1,16,1,17,1,17,1,18,1,18,1,19,1,19,1,20,1,20,1, + 21,1,21,1,22,1,22,1,23,1,23,1,24,1,24,1,25,1,25,1,26,1,26,1,26,1,26,5,26, + 198,8,26,10,26,12,26,201,9,26,1,27,4,27,204,8,27,11,27,12,27,205,1,27,1, + 27,4,27,210,8,27,11,27,12,27,211,3,27,214,8,27,1,28,1,28,1,28,1,28,5,28, + 220,8,28,10,28,12,28,223,9,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,30,1, + 30,1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32, + 1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1, + 35,4,35,263,8,35,11,35,12,35,264,1,35,1,35,1,36,1,36,1,36,1,36,5,36,273, + 8,36,10,36,12,36,276,9,36,1,36,1,36,1,37,1,37,1,37,1,37,5,37,284,8,37,10, + 37,12,37,287,9,37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,39,1,39,1,40,1,40, + 1,41,1,41,1,42,1,42,1,43,1,43,1,44,1,44,1,45,1,45,1,46,1,46,1,47,1,47,1, + 48,1,48,1,49,1,49,1,50,1,50,1,51,1,51,1,52,1,52,1,53,1,53,1,54,1,54,1,55, + 1,55,1,56,1,56,1,57,1,57,1,58,1,58,1,59,1,59,1,60,1,60,1,61,1,61,1,62,1, + 62,1,63,1,63,1,64,1,64,1,65,1,65,1,285,0,66,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,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31, + 63,32,65,33,67,34,69,35,71,36,73,37,75,38,77,0,79,0,81,0,83,0,85,0,87,0, + 89,0,91,0,93,0,95,0,97,0,99,0,101,0,103,0,105,0,107,0,109,0,111,0,113,0, + 115,0,117,0,119,0,121,0,123,0,125,0,127,0,129,0,131,0,1,0,31,1,0,39,39, + 3,0,9,10,13,13,32,32,2,0,10,10,13,13,1,0,48,57,2,0,65,90,97,122,2,0,65, + 65,97,97,2,0,66,66,98,98,2,0,67,67,99,99,2,0,68,68,100,100,2,0,69,69,101, + 101,2,0,70,70,102,102,2,0,71,71,103,103,2,0,72,72,104,104,2,0,73,73,105, + 105,2,0,74,74,106,106,2,0,75,75,107,107,2,0,76,76,108,108,2,0,77,77,109, + 109,2,0,78,78,110,110,2,0,79,79,111,111,2,0,80,80,112,112,2,0,81,81,113, + 113,2,0,82,82,114,114,2,0,83,83,115,115,2,0,84,84,116,116,2,0,85,85,117, + 117,2,0,86,86,118,118,2,0,87,87,119,119,2,0,88,88,120,120,2,0,89,89,121, + 121,2,0,90,90,122,122,331,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,47,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0, + 0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,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,0,73,1,0,0, + 0,0,75,1,0,0,0,1,133,1,0,0,0,3,135,1,0,0,0,5,137,1,0,0,0,7,139,1,0,0,0, + 9,141,1,0,0,0,11,143,1,0,0,0,13,145,1,0,0,0,15,147,1,0,0,0,17,150,1,0,0, + 0,19,152,1,0,0,0,21,155,1,0,0,0,23,157,1,0,0,0,25,160,1,0,0,0,27,164,1, + 0,0,0,29,167,1,0,0,0,31,171,1,0,0,0,33,173,1,0,0,0,35,175,1,0,0,0,37,177, + 1,0,0,0,39,179,1,0,0,0,41,181,1,0,0,0,43,183,1,0,0,0,45,185,1,0,0,0,47, + 187,1,0,0,0,49,189,1,0,0,0,51,191,1,0,0,0,53,193,1,0,0,0,55,203,1,0,0,0, + 57,215,1,0,0,0,59,226,1,0,0,0,61,231,1,0,0,0,63,237,1,0,0,0,65,242,1,0, + 0,0,67,247,1,0,0,0,69,252,1,0,0,0,71,262,1,0,0,0,73,268,1,0,0,0,75,279, + 1,0,0,0,77,293,1,0,0,0,79,295,1,0,0,0,81,297,1,0,0,0,83,299,1,0,0,0,85, + 301,1,0,0,0,87,303,1,0,0,0,89,305,1,0,0,0,91,307,1,0,0,0,93,309,1,0,0,0, + 95,311,1,0,0,0,97,313,1,0,0,0,99,315,1,0,0,0,101,317,1,0,0,0,103,319,1, + 0,0,0,105,321,1,0,0,0,107,323,1,0,0,0,109,325,1,0,0,0,111,327,1,0,0,0,113, + 329,1,0,0,0,115,331,1,0,0,0,117,333,1,0,0,0,119,335,1,0,0,0,121,337,1,0, + 0,0,123,339,1,0,0,0,125,341,1,0,0,0,127,343,1,0,0,0,129,345,1,0,0,0,131, + 347,1,0,0,0,133,134,5,43,0,0,134,2,1,0,0,0,135,136,5,45,0,0,136,4,1,0,0, + 0,137,138,5,42,0,0,138,6,1,0,0,0,139,140,5,47,0,0,140,8,1,0,0,0,141,142, + 5,37,0,0,142,10,1,0,0,0,143,144,5,94,0,0,144,12,1,0,0,0,145,146,5,61,0, + 0,146,14,1,0,0,0,147,148,5,33,0,0,148,149,5,61,0,0,149,16,1,0,0,0,150,151, + 5,60,0,0,151,18,1,0,0,0,152,153,5,60,0,0,153,154,5,61,0,0,154,20,1,0,0, + 0,155,156,5,62,0,0,156,22,1,0,0,0,157,158,5,62,0,0,158,159,5,61,0,0,159, + 24,1,0,0,0,160,161,3,81,40,0,161,162,3,107,53,0,162,163,3,87,43,0,163,26, + 1,0,0,0,164,165,3,109,54,0,165,166,3,115,57,0,166,28,1,0,0,0,167,168,3, + 107,53,0,168,169,3,109,54,0,169,170,3,119,59,0,170,30,1,0,0,0,171,172,5, + 40,0,0,172,32,1,0,0,0,173,174,5,41,0,0,174,34,1,0,0,0,175,176,5,123,0,0, + 176,36,1,0,0,0,177,178,5,125,0,0,178,38,1,0,0,0,179,180,5,91,0,0,180,40, + 1,0,0,0,181,182,5,93,0,0,182,42,1,0,0,0,183,184,5,44,0,0,184,44,1,0,0,0, + 185,186,5,59,0,0,186,46,1,0,0,0,187,188,5,58,0,0,188,48,1,0,0,0,189,190, + 5,46,0,0,190,50,1,0,0,0,191,192,5,95,0,0,192,52,1,0,0,0,193,199,3,79,39, + 0,194,198,3,79,39,0,195,198,3,77,38,0,196,198,3,51,25,0,197,194,1,0,0,0, + 197,195,1,0,0,0,197,196,1,0,0,0,198,201,1,0,0,0,199,197,1,0,0,0,199,200, + 1,0,0,0,200,54,1,0,0,0,201,199,1,0,0,0,202,204,3,77,38,0,203,202,1,0,0, + 0,204,205,1,0,0,0,205,203,1,0,0,0,205,206,1,0,0,0,206,213,1,0,0,0,207,209, + 5,46,0,0,208,210,3,77,38,0,209,208,1,0,0,0,210,211,1,0,0,0,211,209,1,0, + 0,0,211,212,1,0,0,0,212,214,1,0,0,0,213,207,1,0,0,0,213,214,1,0,0,0,214, + 56,1,0,0,0,215,221,5,39,0,0,216,220,8,0,0,0,217,218,5,39,0,0,218,220,5, + 39,0,0,219,216,1,0,0,0,219,217,1,0,0,0,220,223,1,0,0,0,221,219,1,0,0,0, + 221,222,1,0,0,0,222,224,1,0,0,0,223,221,1,0,0,0,224,225,5,39,0,0,225,58, + 1,0,0,0,226,227,3,119,59,0,227,228,3,115,57,0,228,229,3,121,60,0,229,230, + 3,89,44,0,230,60,1,0,0,0,231,232,3,91,45,0,232,233,3,81,40,0,233,234,3, + 103,51,0,234,235,3,117,58,0,235,236,3,89,44,0,236,62,1,0,0,0,237,238,3, + 107,53,0,238,239,3,121,60,0,239,240,3,103,51,0,240,241,3,103,51,0,241,64, + 1,0,0,0,242,243,3,87,43,0,243,244,3,81,40,0,244,245,3,119,59,0,245,246, + 3,89,44,0,246,66,1,0,0,0,247,248,3,119,59,0,248,249,3,97,48,0,249,250,3, + 105,52,0,250,251,3,89,44,0,251,68,1,0,0,0,252,253,3,87,43,0,253,254,3,81, + 40,0,254,255,3,119,59,0,255,256,3,89,44,0,256,257,3,119,59,0,257,258,3, + 97,48,0,258,259,3,105,52,0,259,260,3,89,44,0,260,70,1,0,0,0,261,263,7,1, + 0,0,262,261,1,0,0,0,263,264,1,0,0,0,264,262,1,0,0,0,264,265,1,0,0,0,265, + 266,1,0,0,0,266,267,6,35,0,0,267,72,1,0,0,0,268,269,5,47,0,0,269,270,5, + 47,0,0,270,274,1,0,0,0,271,273,8,2,0,0,272,271,1,0,0,0,273,276,1,0,0,0, + 274,272,1,0,0,0,274,275,1,0,0,0,275,277,1,0,0,0,276,274,1,0,0,0,277,278, + 6,36,0,0,278,74,1,0,0,0,279,280,5,47,0,0,280,281,5,42,0,0,281,285,1,0,0, + 0,282,284,9,0,0,0,283,282,1,0,0,0,284,287,1,0,0,0,285,286,1,0,0,0,285,283, + 1,0,0,0,286,288,1,0,0,0,287,285,1,0,0,0,288,289,5,42,0,0,289,290,5,47,0, + 0,290,291,1,0,0,0,291,292,6,37,0,0,292,76,1,0,0,0,293,294,7,3,0,0,294,78, + 1,0,0,0,295,296,7,4,0,0,296,80,1,0,0,0,297,298,7,5,0,0,298,82,1,0,0,0,299, + 300,7,6,0,0,300,84,1,0,0,0,301,302,7,7,0,0,302,86,1,0,0,0,303,304,7,8,0, + 0,304,88,1,0,0,0,305,306,7,9,0,0,306,90,1,0,0,0,307,308,7,10,0,0,308,92, + 1,0,0,0,309,310,7,11,0,0,310,94,1,0,0,0,311,312,7,12,0,0,312,96,1,0,0,0, + 313,314,7,13,0,0,314,98,1,0,0,0,315,316,7,14,0,0,316,100,1,0,0,0,317,318, + 7,15,0,0,318,102,1,0,0,0,319,320,7,16,0,0,320,104,1,0,0,0,321,322,7,17, + 0,0,322,106,1,0,0,0,323,324,7,18,0,0,324,108,1,0,0,0,325,326,7,19,0,0,326, + 110,1,0,0,0,327,328,7,20,0,0,328,112,1,0,0,0,329,330,7,21,0,0,330,114,1, + 0,0,0,331,332,7,22,0,0,332,116,1,0,0,0,333,334,7,23,0,0,334,118,1,0,0,0, + 335,336,7,24,0,0,336,120,1,0,0,0,337,338,7,25,0,0,338,122,1,0,0,0,339,340, + 7,26,0,0,340,124,1,0,0,0,341,342,7,27,0,0,342,126,1,0,0,0,343,344,7,28, + 0,0,344,128,1,0,0,0,345,346,7,29,0,0,346,130,1,0,0,0,347,348,7,30,0,0,348, + 132,1,0,0,0,11,0,197,199,205,211,213,219,221,264,274,285,1,6,0,0]; + + private static __ATN: ATN; public static get _ATN(): ATN { if (!FormulaLexer.__ATN) { - FormulaLexer.__ATN = new ATNDeserializer().deserialize(Utils.toCharArray(FormulaLexer._serializedATN)); + FormulaLexer.__ATN = new ATNDeserializer().deserialize(FormulaLexer._serializedATN); } return FormulaLexer.__ATN; } -} + static DecisionsToDFA = FormulaLexer._ATN.decisionToState.map( (ds: DecisionState, index: number) => new DFA(ds, index) ); +} \ No newline at end of file diff --git a/packages/formula/src/grammar/FormulaParser.interp b/packages/formula/src/grammar/FormulaParser.interp index 0c855ac47..5ac83ee1f 100644 --- a/packages/formula/src/grammar/FormulaParser.interp +++ b/packages/formula/src/grammar/FormulaParser.interp @@ -89,4 +89,4 @@ variable atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 40, 79, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 33, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 53, 10, 3, 12, 3, 14, 3, 56, 11, 3, 3, 4, 3, 4, 3, 4, 5, 4, 61, 10, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 7, 5, 68, 10, 5, 12, 5, 14, 5, 71, 11, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 2, 2, 3, 4, 7, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 2, 5, 3, 2, 5, 7, 3, 2, 3, 4, 3, 2, 9, 14, 2, 92, 2, 12, 3, 2, 2, 2, 4, 32, 3, 2, 2, 2, 6, 57, 3, 2, 2, 2, 8, 64, 3, 2, 2, 2, 10, 72, 3, 2, 2, 2, 12, 13, 5, 4, 3, 2, 13, 14, 7, 2, 2, 3, 14, 3, 3, 2, 2, 2, 15, 16, 8, 3, 1, 2, 16, 17, 7, 17, 2, 2, 17, 33, 5, 4, 3, 14, 18, 33, 5, 6, 4, 2, 19, 33, 5, 10, 6, 2, 20, 33, 7, 30, 2, 2, 21, 33, 7, 31, 2, 2, 22, 33, 7, 32, 2, 2, 23, 33, 7, 33, 2, 2, 24, 33, 7, 34, 2, 2, 25, 33, 7, 35, 2, 2, 26, 33, 7, 36, 2, 2, 27, 33, 7, 37, 2, 2, 28, 29, 7, 18, 2, 2, 29, 30, 5, 4, 3, 2, 30, 31, 7, 19, 2, 2, 31, 33, 3, 2, 2, 2, 32, 15, 3, 2, 2, 2, 32, 18, 3, 2, 2, 2, 32, 19, 3, 2, 2, 2, 32, 20, 3, 2, 2, 2, 32, 21, 3, 2, 2, 2, 32, 22, 3, 2, 2, 2, 32, 23, 3, 2, 2, 2, 32, 24, 3, 2, 2, 2, 32, 25, 3, 2, 2, 2, 32, 26, 3, 2, 2, 2, 32, 27, 3, 2, 2, 2, 32, 28, 3, 2, 2, 2, 33, 54, 3, 2, 2, 2, 34, 35, 12, 20, 2, 2, 35, 36, 9, 2, 2, 2, 36, 53, 5, 4, 3, 21, 37, 38, 12, 19, 2, 2, 38, 39, 9, 3, 2, 2, 39, 53, 5, 4, 3, 20, 40, 41, 12, 18, 2, 2, 41, 42, 7, 8, 2, 2, 42, 53, 5, 4, 3, 19, 43, 44, 12, 17, 2, 2, 44, 45, 9, 4, 2, 2, 45, 53, 5, 4, 3, 18, 46, 47, 12, 16, 2, 2, 47, 48, 7, 15, 2, 2, 48, 53, 5, 4, 3, 17, 49, 50, 12, 15, 2, 2, 50, 51, 7, 16, 2, 2, 51, 53, 5, 4, 3, 16, 52, 34, 3, 2, 2, 2, 52, 37, 3, 2, 2, 2, 52, 40, 3, 2, 2, 2, 52, 43, 3, 2, 2, 2, 52, 46, 3, 2, 2, 2, 52, 49, 3, 2, 2, 2, 53, 56, 3, 2, 2, 2, 54, 52, 3, 2, 2, 2, 54, 55, 3, 2, 2, 2, 55, 5, 3, 2, 2, 2, 56, 54, 3, 2, 2, 2, 57, 58, 7, 29, 2, 2, 58, 60, 7, 18, 2, 2, 59, 61, 5, 8, 5, 2, 60, 59, 3, 2, 2, 2, 60, 61, 3, 2, 2, 2, 61, 62, 3, 2, 2, 2, 62, 63, 7, 19, 2, 2, 63, 7, 3, 2, 2, 2, 64, 69, 5, 4, 3, 2, 65, 66, 7, 24, 2, 2, 66, 68, 5, 4, 3, 2, 67, 65, 3, 2, 2, 2, 68, 71, 3, 2, 2, 2, 69, 67, 3, 2, 2, 2, 69, 70, 3, 2, 2, 2, 70, 9, 3, 2, 2, 2, 71, 69, 3, 2, 2, 2, 72, 73, 7, 20, 2, 2, 73, 74, 7, 20, 2, 2, 74, 75, 7, 29, 2, 2, 75, 76, 7, 21, 2, 2, 76, 77, 7, 21, 2, 2, 77, 11, 3, 2, 2, 2, 7, 32, 52, 54, 60, 69] \ No newline at end of file +[4, 1, 38, 77, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 31, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 51, 8, 1, 10, 1, 12, 1, 54, 9, 1, 1, 2, 1, 2, 1, 2, 3, 2, 59, 8, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 5, 3, 66, 8, 3, 10, 3, 12, 3, 69, 9, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 0, 1, 2, 5, 0, 2, 4, 6, 8, 0, 3, 1, 0, 3, 5, 1, 0, 1, 2, 1, 0, 7, 12, 90, 0, 10, 1, 0, 0, 0, 2, 30, 1, 0, 0, 0, 4, 55, 1, 0, 0, 0, 6, 62, 1, 0, 0, 0, 8, 70, 1, 0, 0, 0, 10, 11, 3, 2, 1, 0, 11, 12, 5, 0, 0, 1, 12, 1, 1, 0, 0, 0, 13, 14, 6, 1, -1, 0, 14, 15, 5, 15, 0, 0, 15, 31, 3, 2, 1, 12, 16, 31, 3, 4, 2, 0, 17, 31, 3, 8, 4, 0, 18, 31, 5, 28, 0, 0, 19, 31, 5, 29, 0, 0, 20, 31, 5, 30, 0, 0, 21, 31, 5, 31, 0, 0, 22, 31, 5, 32, 0, 0, 23, 31, 5, 33, 0, 0, 24, 31, 5, 34, 0, 0, 25, 31, 5, 35, 0, 0, 26, 27, 5, 16, 0, 0, 27, 28, 3, 2, 1, 0, 28, 29, 5, 17, 0, 0, 29, 31, 1, 0, 0, 0, 30, 13, 1, 0, 0, 0, 30, 16, 1, 0, 0, 0, 30, 17, 1, 0, 0, 0, 30, 18, 1, 0, 0, 0, 30, 19, 1, 0, 0, 0, 30, 20, 1, 0, 0, 0, 30, 21, 1, 0, 0, 0, 30, 22, 1, 0, 0, 0, 30, 23, 1, 0, 0, 0, 30, 24, 1, 0, 0, 0, 30, 25, 1, 0, 0, 0, 30, 26, 1, 0, 0, 0, 31, 52, 1, 0, 0, 0, 32, 33, 10, 18, 0, 0, 33, 34, 7, 0, 0, 0, 34, 51, 3, 2, 1, 19, 35, 36, 10, 17, 0, 0, 36, 37, 7, 1, 0, 0, 37, 51, 3, 2, 1, 18, 38, 39, 10, 16, 0, 0, 39, 40, 5, 6, 0, 0, 40, 51, 3, 2, 1, 17, 41, 42, 10, 15, 0, 0, 42, 43, 7, 2, 0, 0, 43, 51, 3, 2, 1, 16, 44, 45, 10, 14, 0, 0, 45, 46, 5, 13, 0, 0, 46, 51, 3, 2, 1, 15, 47, 48, 10, 13, 0, 0, 48, 49, 5, 14, 0, 0, 49, 51, 3, 2, 1, 14, 50, 32, 1, 0, 0, 0, 50, 35, 1, 0, 0, 0, 50, 38, 1, 0, 0, 0, 50, 41, 1, 0, 0, 0, 50, 44, 1, 0, 0, 0, 50, 47, 1, 0, 0, 0, 51, 54, 1, 0, 0, 0, 52, 50, 1, 0, 0, 0, 52, 53, 1, 0, 0, 0, 53, 3, 1, 0, 0, 0, 54, 52, 1, 0, 0, 0, 55, 56, 5, 27, 0, 0, 56, 58, 5, 16, 0, 0, 57, 59, 3, 6, 3, 0, 58, 57, 1, 0, 0, 0, 58, 59, 1, 0, 0, 0, 59, 60, 1, 0, 0, 0, 60, 61, 5, 17, 0, 0, 61, 5, 1, 0, 0, 0, 62, 67, 3, 2, 1, 0, 63, 64, 5, 22, 0, 0, 64, 66, 3, 2, 1, 0, 65, 63, 1, 0, 0, 0, 66, 69, 1, 0, 0, 0, 67, 65, 1, 0, 0, 0, 67, 68, 1, 0, 0, 0, 68, 7, 1, 0, 0, 0, 69, 67, 1, 0, 0, 0, 70, 71, 5, 18, 0, 0, 71, 72, 5, 18, 0, 0, 72, 73, 5, 27, 0, 0, 73, 74, 5, 19, 0, 0, 74, 75, 5, 19, 0, 0, 75, 9, 1, 0, 0, 0, 5, 30, 50, 52, 58, 67] \ No newline at end of file diff --git a/packages/formula/src/grammar/FormulaParser.ts b/packages/formula/src/grammar/FormulaParser.ts index 7ce7934a8..497fbcf72 100644 --- a/packages/formula/src/grammar/FormulaParser.ts +++ b/packages/formula/src/grammar/FormulaParser.ts @@ -1,32 +1,23 @@ -// Generated from src/grammar/FormulaParser.g4 by ANTLR 4.9.0-SNAPSHOT +// Generated from src/grammar/FormulaParser.g4 by ANTLR 4.13.2 +// noinspection ES6UnusedImports,JSUnusedGlobalSymbols,JSUnusedLocalSymbols +import { + ATN, + ATNDeserializer, DecisionState, DFA, FailedPredicateException, + RecognitionException, NoViableAltException, BailErrorStrategy, + Parser, ParserATNSimulator, + RuleContext, ParserRuleContext, PredictionMode, PredictionContextCache, + TerminalNode, RuleNode, + Token, TokenStream, + Interval, IntervalSet +} from 'antlr4'; +import FormulaParserVisitor from "./FormulaParserVisitor.js"; -import { ATN } from "antlr4ts/atn/ATN"; -import { ATNDeserializer } from "antlr4ts/atn/ATNDeserializer"; -import { FailedPredicateException } from "antlr4ts/FailedPredicateException"; -import { NotNull } from "antlr4ts/Decorators"; -import { NoViableAltException } from "antlr4ts/NoViableAltException"; -import { Override } from "antlr4ts/Decorators"; -import { Parser } from "antlr4ts/Parser"; -import { ParserRuleContext } from "antlr4ts/ParserRuleContext"; -import { ParserATNSimulator } from "antlr4ts/atn/ParserATNSimulator"; -import { ParseTreeListener } from "antlr4ts/tree/ParseTreeListener"; -import { ParseTreeVisitor } from "antlr4ts/tree/ParseTreeVisitor"; -import { RecognitionException } from "antlr4ts/RecognitionException"; -import { RuleContext } from "antlr4ts/RuleContext"; -//import { RuleVersion } from "antlr4ts/RuleVersion"; -import { TerminalNode } from "antlr4ts/tree/TerminalNode"; -import { Token } from "antlr4ts/Token"; -import { TokenStream } from "antlr4ts/TokenStream"; -import { Vocabulary } from "antlr4ts/Vocabulary"; -import { VocabularyImpl } from "antlr4ts/VocabularyImpl"; +// for running tests with parameters, TODO: discuss strategy for typed parameters in CI +// eslint-disable-next-line no-unused-vars +type int = number; -import * as Utils from "antlr4ts/misc/Utils"; - -import { FormulaParserVisitor } from "./FormulaParserVisitor"; - - -export class FormulaParser extends Parser { +export default class FormulaParser extends Parser { public static readonly ADD = 1; public static readonly SUBTRACT = 2; public static readonly MULTIPLY = 3; @@ -65,46 +56,59 @@ export class FormulaParser extends Parser { public static readonly WS = 36; public static readonly COMMENT = 37; public static readonly MULTILINE_COMMENT = 38; + public static override readonly EOF = Token.EOF; public static readonly RULE_formula = 0; public static readonly RULE_expression = 1; public static readonly RULE_functionCall = 2; public static readonly RULE_argumentList = 3; public static readonly RULE_variable = 4; + public static readonly literalNames: (string | null)[] = [ null, "'+'", + "'-'", "'*'", + "'/'", "'%'", + "'^'", "'='", + "'!='", "'<'", + "'<='", "'>'", + "'>='", null, + null, null, + "'('", "')'", + "'{'", "'}'", + "'['", "']'", + "','", "';'", + "':'", "'.'", + "'_'" ]; + public static readonly symbolicNames: (string | null)[] = [ null, "ADD", + "SUBTRACT", + "MULTIPLY", + "DIVIDE", "MODULO", + "POWER", "EQUAL", + "NOT_EQUAL", + "LESS", "LESS_EQUAL", + "GREATER", + "GREATER_EQUAL", + "AND", "OR", + "NOT", "LPAREN", + "RPAREN", "LBRACE", + "RBRACE", "LBRACKET", + "RBRACKET", + "COMMA", "SEMICOLON", + "COLON", "DOT", + "UNDERSCORE", + "IDENTIFIER", + "NUMBER", "STRING", + "TRUE", "FALSE", + "NULL", "DATE", + "TIME", "DATETIME", + "WS", "COMMENT", + "MULTILINE_COMMENT" ]; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "formula", "expression", "functionCall", "argumentList", "variable", ]; - - private static readonly _LITERAL_NAMES: Array = [ - undefined, "'+'", "'-'", "'*'", "'/'", "'%'", "'^'", "'='", "'!='", "'<'", - "'<='", "'>'", "'>='", undefined, undefined, undefined, "'('", "')'", - "'{'", "'}'", "'['", "']'", "','", "';'", "':'", "'.'", "'_'", - ]; - private static readonly _SYMBOLIC_NAMES: Array = [ - undefined, "ADD", "SUBTRACT", "MULTIPLY", "DIVIDE", "MODULO", "POWER", - "EQUAL", "NOT_EQUAL", "LESS", "LESS_EQUAL", "GREATER", "GREATER_EQUAL", - "AND", "OR", "NOT", "LPAREN", "RPAREN", "LBRACE", "RBRACE", "LBRACKET", - "RBRACKET", "COMMA", "SEMICOLON", "COLON", "DOT", "UNDERSCORE", "IDENTIFIER", - "NUMBER", "STRING", "TRUE", "FALSE", "NULL", "DATE", "TIME", "DATETIME", - "WS", "COMMENT", "MULTILINE_COMMENT", - ]; - public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(FormulaParser._LITERAL_NAMES, FormulaParser._SYMBOLIC_NAMES, []); - - // @Override - // @NotNull - public get vocabulary(): Vocabulary { - return FormulaParser.VOCABULARY; - } - // tslint:enable:no-trailing-whitespace - - // @Override public get grammarFileName(): string { return "FormulaParser.g4"; } - - // @Override + public get literalNames(): (string | null)[] { return FormulaParser.literalNames; } + public get symbolicNames(): (string | null)[] { return FormulaParser.symbolicNames; } public get ruleNames(): string[] { return FormulaParser.ruleNames; } - - // @Override - public get serializedATN(): string { return FormulaParser._serializedATN; } + public get serializedATN(): number[] { return FormulaParser._serializedATN; } protected createFailedPredicateException(predicate?: string, message?: string): FailedPredicateException { return new FailedPredicateException(this, predicate, message); @@ -112,14 +116,14 @@ export class FormulaParser extends Parser { constructor(input: TokenStream) { super(input); - this._interp = new ParserATNSimulator(FormulaParser._ATN, this); + this._interp = new ParserATNSimulator(this, FormulaParser._ATN, FormulaParser.DecisionsToDFA, new PredictionContextCache()); } // @RuleVersion(0) public formula(): FormulaContext { - let _localctx: FormulaContext = new FormulaContext(this._ctx, this.state); - this.enterRule(_localctx, 0, FormulaParser.RULE_formula); + let localctx: FormulaContext = new FormulaContext(this, this._ctx, this.state); + this.enterRule(localctx, 0, FormulaParser.RULE_formula); try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 10; this.expression(0); @@ -129,7 +133,7 @@ export class FormulaParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -139,7 +143,7 @@ export class FormulaParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } public expression(): ExpressionContext; @@ -152,23 +156,23 @@ export class FormulaParser extends Parser { let _parentctx: ParserRuleContext = this._ctx; let _parentState: number = this.state; - let _localctx: ExpressionContext = new ExpressionContext(this._ctx, _parentState); - let _prevctx: ExpressionContext = _localctx; + let localctx: ExpressionContext = new ExpressionContext(this, this._ctx, _parentState); + let _prevctx: ExpressionContext = localctx; let _startState: number = 2; - this.enterRecursionRule(_localctx, 2, FormulaParser.RULE_expression, _p); + this.enterRecursionRule(localctx, 2, FormulaParser.RULE_expression, _p); let _la: number; try { let _alt: number; - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 30; this._errHandler.sync(this); switch (this._input.LA(1)) { - case FormulaParser.NOT: + case 15: { - _localctx = new NotExprContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new NotExprContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 14; this.match(FormulaParser.NOT); @@ -176,101 +180,101 @@ export class FormulaParser extends Parser { this.expression(12); } break; - case FormulaParser.IDENTIFIER: + case 27: { - _localctx = new FunctionExprContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new FunctionExprContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 16; this.functionCall(); } break; - case FormulaParser.LBRACE: + case 18: { - _localctx = new VariableExprContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new VariableExprContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 17; this.variable(); } break; - case FormulaParser.NUMBER: + case 28: { - _localctx = new NumberExprContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new NumberExprContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 18; this.match(FormulaParser.NUMBER); } break; - case FormulaParser.STRING: + case 29: { - _localctx = new StringExprContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new StringExprContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 19; this.match(FormulaParser.STRING); } break; - case FormulaParser.TRUE: + case 30: { - _localctx = new TrueExprContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new TrueExprContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 20; this.match(FormulaParser.TRUE); } break; - case FormulaParser.FALSE: + case 31: { - _localctx = new FalseExprContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new FalseExprContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 21; this.match(FormulaParser.FALSE); } break; - case FormulaParser.NULL: + case 32: { - _localctx = new NullExprContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new NullExprContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 22; this.match(FormulaParser.NULL); } break; - case FormulaParser.DATE: + case 33: { - _localctx = new DateExprContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new DateExprContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 23; this.match(FormulaParser.DATE); } break; - case FormulaParser.TIME: + case 34: { - _localctx = new TimeExprContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new TimeExprContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 24; this.match(FormulaParser.TIME); } break; - case FormulaParser.DATETIME: + case 35: { - _localctx = new DateTimeExprContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new DateTimeExprContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 25; this.match(FormulaParser.DATETIME); } break; - case FormulaParser.LPAREN: + case 16: { - _localctx = new ParenExprContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new ParenExprContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 26; this.match(FormulaParser.LPAREN); this.state = 27; @@ -282,76 +286,68 @@ export class FormulaParser extends Parser { default: throw new NoViableAltException(this); } - this._ctx._stop = this._input.tryLT(-1); + this._ctx.stop = this._input.LT(-1); this.state = 52; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 2, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 2, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { this.triggerExitRuleEvent(); } - _prevctx = _localctx; + _prevctx = localctx; { this.state = 50; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 1, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 1, this._ctx) ) { case 1: { - _localctx = new MulDivModExprContext(new ExpressionContext(_parentctx, _parentState)); - this.pushNewRecursionContext(_localctx, _startState, FormulaParser.RULE_expression); + localctx = new MulDivModExprContext(this, new ExpressionContext(this, _parentctx, _parentState)); + this.pushNewRecursionContext(localctx, _startState, FormulaParser.RULE_expression); this.state = 32; if (!(this.precpred(this._ctx, 18))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } this.state = 33; - (_localctx as MulDivModExprContext)._op = this._input.LT(1); + (localctx as MulDivModExprContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << FormulaParser.MULTIPLY) | (1 << FormulaParser.DIVIDE) | (1 << FormulaParser.MODULO))) !== 0))) { - (_localctx as MulDivModExprContext)._op = this._errHandler.recoverInline(this); - } else { - if (this._input.LA(1) === Token.EOF) { - this.matchedEOF = true; - } - + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 56) !== 0))) { + (localctx as MulDivModExprContext)._op = this._errHandler.recoverInline(this); + } + else { this._errHandler.reportMatch(this); - this.consume(); + this.consume(); } this.state = 34; this.expression(19); } break; - case 2: { - _localctx = new AddSubExprContext(new ExpressionContext(_parentctx, _parentState)); - this.pushNewRecursionContext(_localctx, _startState, FormulaParser.RULE_expression); + localctx = new AddSubExprContext(this, new ExpressionContext(this, _parentctx, _parentState)); + this.pushNewRecursionContext(localctx, _startState, FormulaParser.RULE_expression); this.state = 35; if (!(this.precpred(this._ctx, 17))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 17)"); } this.state = 36; - (_localctx as AddSubExprContext)._op = this._input.LT(1); + (localctx as AddSubExprContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!(_la === FormulaParser.ADD || _la === FormulaParser.SUBTRACT)) { - (_localctx as AddSubExprContext)._op = this._errHandler.recoverInline(this); - } else { - if (this._input.LA(1) === Token.EOF) { - this.matchedEOF = true; - } - + if(!(_la===1 || _la===2)) { + (localctx as AddSubExprContext)._op = this._errHandler.recoverInline(this); + } + else { this._errHandler.reportMatch(this); - this.consume(); + this.consume(); } this.state = 37; this.expression(18); } break; - case 3: { - _localctx = new PowerExprContext(new ExpressionContext(_parentctx, _parentState)); - this.pushNewRecursionContext(_localctx, _startState, FormulaParser.RULE_expression); + localctx = new PowerExprContext(this, new ExpressionContext(this, _parentctx, _parentState)); + this.pushNewRecursionContext(localctx, _startState, FormulaParser.RULE_expression); this.state = 38; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); @@ -362,37 +358,32 @@ export class FormulaParser extends Parser { this.expression(17); } break; - case 4: { - _localctx = new ComparisonExprContext(new ExpressionContext(_parentctx, _parentState)); - this.pushNewRecursionContext(_localctx, _startState, FormulaParser.RULE_expression); + localctx = new ComparisonExprContext(this, new ExpressionContext(this, _parentctx, _parentState)); + this.pushNewRecursionContext(localctx, _startState, FormulaParser.RULE_expression); this.state = 41; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } this.state = 42; - (_localctx as ComparisonExprContext)._op = this._input.LT(1); + (localctx as ComparisonExprContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << FormulaParser.EQUAL) | (1 << FormulaParser.NOT_EQUAL) | (1 << FormulaParser.LESS) | (1 << FormulaParser.LESS_EQUAL) | (1 << FormulaParser.GREATER) | (1 << FormulaParser.GREATER_EQUAL))) !== 0))) { - (_localctx as ComparisonExprContext)._op = this._errHandler.recoverInline(this); - } else { - if (this._input.LA(1) === Token.EOF) { - this.matchedEOF = true; - } - + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 8064) !== 0))) { + (localctx as ComparisonExprContext)._op = this._errHandler.recoverInline(this); + } + else { this._errHandler.reportMatch(this); - this.consume(); + this.consume(); } this.state = 43; this.expression(16); } break; - case 5: { - _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); - this.pushNewRecursionContext(_localctx, _startState, FormulaParser.RULE_expression); + localctx = new AndExprContext(this, new ExpressionContext(this, _parentctx, _parentState)); + this.pushNewRecursionContext(localctx, _startState, FormulaParser.RULE_expression); this.state = 44; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); @@ -403,11 +394,10 @@ export class FormulaParser extends Parser { this.expression(15); } break; - case 6: { - _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); - this.pushNewRecursionContext(_localctx, _startState, FormulaParser.RULE_expression); + localctx = new OrExprContext(this, new ExpressionContext(this, _parentctx, _parentState)); + this.pushNewRecursionContext(localctx, _startState, FormulaParser.RULE_expression); this.state = 47; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); @@ -423,13 +413,13 @@ export class FormulaParser extends Parser { } this.state = 54; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 2, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 2, this._ctx); } } } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -439,15 +429,15 @@ export class FormulaParser extends Parser { finally { this.unrollRecursionContexts(_parentctx); } - return _localctx; + return localctx; } // @RuleVersion(0) public functionCall(): FunctionCallContext { - let _localctx: FunctionCallContext = new FunctionCallContext(this._ctx, this.state); - this.enterRule(_localctx, 4, FormulaParser.RULE_functionCall); + let localctx: FunctionCallContext = new FunctionCallContext(this, this._ctx, this.state); + this.enterRule(localctx, 4, FormulaParser.RULE_functionCall); let _la: number; try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 55; this.match(FormulaParser.IDENTIFIER); @@ -456,7 +446,7 @@ export class FormulaParser extends Parser { this.state = 58; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 15)) & ~0x1F) === 0 && ((1 << (_la - 15)) & ((1 << (FormulaParser.NOT - 15)) | (1 << (FormulaParser.LPAREN - 15)) | (1 << (FormulaParser.LBRACE - 15)) | (1 << (FormulaParser.IDENTIFIER - 15)) | (1 << (FormulaParser.NUMBER - 15)) | (1 << (FormulaParser.STRING - 15)) | (1 << (FormulaParser.TRUE - 15)) | (1 << (FormulaParser.FALSE - 15)) | (1 << (FormulaParser.NULL - 15)) | (1 << (FormulaParser.DATE - 15)) | (1 << (FormulaParser.TIME - 15)) | (1 << (FormulaParser.DATETIME - 15)))) !== 0)) { + if (((((_la - 15)) & ~0x1F) === 0 && ((1 << (_la - 15)) & 2093067) !== 0)) { { this.state = 57; this.argumentList(); @@ -469,7 +459,7 @@ export class FormulaParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -479,22 +469,22 @@ export class FormulaParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public argumentList(): ArgumentListContext { - let _localctx: ArgumentListContext = new ArgumentListContext(this._ctx, this.state); - this.enterRule(_localctx, 6, FormulaParser.RULE_argumentList); + let localctx: ArgumentListContext = new ArgumentListContext(this, this._ctx, this.state); + this.enterRule(localctx, 6, FormulaParser.RULE_argumentList); let _la: number; try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 62; this.expression(0); this.state = 67; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === FormulaParser.COMMA) { + while (_la===22) { { { this.state = 63; @@ -511,7 +501,7 @@ export class FormulaParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -521,14 +511,14 @@ export class FormulaParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public variable(): VariableContext { - let _localctx: VariableContext = new VariableContext(this._ctx, this.state); - this.enterRule(_localctx, 8, FormulaParser.RULE_variable); + let localctx: VariableContext = new VariableContext(this, this._ctx, this.state); + this.enterRule(localctx, 8, FormulaParser.RULE_variable); try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 70; this.match(FormulaParser.LBRACE); @@ -544,7 +534,7 @@ export class FormulaParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -554,97 +544,88 @@ export class FormulaParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } - public sempred(_localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { + public sempred(localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { switch (ruleIndex) { case 1: - return this.expression_sempred(_localctx as ExpressionContext, predIndex); + return this.expression_sempred(localctx as ExpressionContext, predIndex); } return true; } - private expression_sempred(_localctx: ExpressionContext, predIndex: number): boolean { + private expression_sempred(localctx: ExpressionContext, predIndex: number): boolean { switch (predIndex) { case 0: return this.precpred(this._ctx, 18); - case 1: return this.precpred(this._ctx, 17); - case 2: return this.precpred(this._ctx, 16); - case 3: return this.precpred(this._ctx, 15); - case 4: return this.precpred(this._ctx, 14); - case 5: return this.precpred(this._ctx, 13); } return true; } - public static readonly _serializedATN: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03(O\x04\x02\t\x02" + - "\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x03\x02\x03\x02" + - "\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" + - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" + - "\x05\x03!\n\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" + - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" + - "\x03\x03\x03\x03\x07\x035\n\x03\f\x03\x0E\x038\v\x03\x03\x04\x03\x04\x03" + - "\x04\x05\x04=\n\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x07\x05D\n" + - "\x05\f\x05\x0E\x05G\v\x05\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + - "\x06\x03\x06\x02\x02\x03\x04\x07\x02\x02\x04\x02\x06\x02\b\x02\n\x02\x02" + - "\x05\x03\x02\x05\x07\x03\x02\x03\x04\x03\x02\t\x0E\x02\\\x02\f\x03\x02" + - "\x02\x02\x04 \x03\x02\x02\x02\x069\x03\x02\x02\x02\b@\x03\x02\x02\x02" + - "\nH\x03\x02\x02\x02\f\r\x05\x04\x03\x02\r\x0E\x07\x02\x02\x03\x0E\x03" + - "\x03\x02\x02\x02\x0F\x10\b\x03\x01\x02\x10\x11\x07\x11\x02\x02\x11!\x05" + - "\x04\x03\x0E\x12!\x05\x06\x04\x02\x13!\x05\n\x06\x02\x14!\x07\x1E\x02" + - "\x02\x15!\x07\x1F\x02\x02\x16!\x07 \x02\x02\x17!\x07!\x02\x02\x18!\x07" + - "\"\x02\x02\x19!\x07#\x02\x02\x1A!\x07$\x02\x02\x1B!\x07%\x02\x02\x1C\x1D" + - "\x07\x12\x02\x02\x1D\x1E\x05\x04\x03\x02\x1E\x1F\x07\x13\x02\x02\x1F!" + - "\x03\x02\x02\x02 \x0F\x03\x02\x02\x02 \x12\x03\x02\x02\x02 \x13\x03\x02" + - "\x02\x02 \x14\x03\x02\x02\x02 \x15\x03\x02\x02\x02 \x16\x03\x02\x02\x02" + - " \x17\x03\x02\x02\x02 \x18\x03\x02\x02\x02 \x19\x03\x02\x02\x02 \x1A\x03" + - "\x02\x02\x02 \x1B\x03\x02\x02\x02 \x1C\x03\x02\x02\x02!6\x03\x02\x02\x02" + - "\"#\f\x14\x02\x02#$\t\x02\x02\x02$5\x05\x04\x03\x15%&\f\x13\x02\x02&\'" + - "\t\x03\x02\x02\'5\x05\x04\x03\x14()\f\x12\x02\x02)*\x07\b\x02\x02*5\x05" + - "\x04\x03\x13+,\f\x11\x02\x02,-\t\x04\x02\x02-5\x05\x04\x03\x12./\f\x10" + - "\x02\x02/0\x07\x0F\x02\x0205\x05\x04\x03\x1112\f\x0F\x02\x0223\x07\x10" + - "\x02\x0235\x05\x04\x03\x104\"\x03\x02\x02\x024%\x03\x02\x02\x024(\x03" + - "\x02\x02\x024+\x03\x02\x02\x024.\x03\x02\x02\x0241\x03\x02\x02\x0258\x03" + - "\x02\x02\x0264\x03\x02\x02\x0267\x03\x02\x02\x027\x05\x03\x02\x02\x02" + - "86\x03\x02\x02\x029:\x07\x1D\x02\x02:<\x07\x12\x02\x02;=\x05\b\x05\x02" + - "<;\x03\x02\x02\x02<=\x03\x02\x02\x02=>\x03\x02\x02\x02>?\x07\x13\x02\x02" + - "?\x07\x03\x02\x02\x02@E\x05\x04\x03\x02AB\x07\x18\x02\x02BD\x05\x04\x03" + - "\x02CA\x03\x02\x02\x02DG\x03\x02\x02\x02EC\x03\x02\x02\x02EF\x03\x02\x02" + - "\x02F\t\x03\x02\x02\x02GE\x03\x02\x02\x02HI\x07\x14\x02\x02IJ\x07\x14" + - "\x02\x02JK\x07\x1D\x02\x02KL\x07\x15\x02\x02LM\x07\x15\x02\x02M\v\x03" + - "\x02\x02\x02\x07 46 new DFA(ds, index) ); + } export class FormulaContext extends ParserRuleContext { + constructor(parser?: FormulaParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } public expression(): ExpressionContext { - return this.getRuleContext(0, ExpressionContext); + return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; } - public EOF(): TerminalNode { return this.getToken(FormulaParser.EOF, 0); } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public EOF(): TerminalNode { + return this.getToken(FormulaParser.EOF, 0); + } + public get ruleIndex(): number { + return FormulaParser.RULE_formula; } - // @Override - public get ruleIndex(): number { return FormulaParser.RULE_formula; } // @Override public accept(visitor: FormulaParserVisitor): Result { if (visitor.visitFormula) { @@ -657,356 +638,390 @@ export class FormulaContext extends ParserRuleContext { export class ExpressionContext extends ParserRuleContext { - constructor(parent: ParserRuleContext | undefined, invokingState: number) { + constructor(parser?: FormulaParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); + this.parser = parser; } - // @Override - public get ruleIndex(): number { return FormulaParser.RULE_expression; } - public copyFrom(ctx: ExpressionContext): void { + public get ruleIndex(): number { + return FormulaParser.RULE_expression; + } + public override copyFrom(ctx: ExpressionContext): void { super.copyFrom(ctx); } } -export class MulDivModExprContext extends ExpressionContext { - public _op!: Token; - public expression(): ExpressionContext[]; - public expression(i: number): ExpressionContext; - public expression(i?: number): ExpressionContext | ExpressionContext[] { - if (i === undefined) { - return this.getRuleContexts(ExpressionContext); - } else { - return this.getRuleContext(i, ExpressionContext); - } +export class AndExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public expression_list(): ExpressionContext[] { + return this.getTypedRuleContexts(ExpressionContext) as ExpressionContext[]; } - public MULTIPLY(): TerminalNode | undefined { return this.tryGetToken(FormulaParser.MULTIPLY, 0); } - public DIVIDE(): TerminalNode | undefined { return this.tryGetToken(FormulaParser.DIVIDE, 0); } - public MODULO(): TerminalNode | undefined { return this.tryGetToken(FormulaParser.MODULO, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public expression(i: number): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, i) as ExpressionContext; + } + public AND(): TerminalNode { + return this.getToken(FormulaParser.AND, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitMulDivModExpr) { - return visitor.visitMulDivModExpr(this); + if (visitor.visitAndExpr) { + return visitor.visitAndExpr(this); } else { return visitor.visitChildren(this); } } } -export class AddSubExprContext extends ExpressionContext { - public _op!: Token; - public expression(): ExpressionContext[]; - public expression(i: number): ExpressionContext; - public expression(i?: number): ExpressionContext | ExpressionContext[] { - if (i === undefined) { - return this.getRuleContexts(ExpressionContext); - } else { - return this.getRuleContext(i, ExpressionContext); - } +export class StringExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); } - public ADD(): TerminalNode | undefined { return this.tryGetToken(FormulaParser.ADD, 0); } - public SUBTRACT(): TerminalNode | undefined { return this.tryGetToken(FormulaParser.SUBTRACT, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public STRING(): TerminalNode { + return this.getToken(FormulaParser.STRING, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitAddSubExpr) { - return visitor.visitAddSubExpr(this); + if (visitor.visitStringExpr) { + return visitor.visitStringExpr(this); } else { return visitor.visitChildren(this); } } } -export class PowerExprContext extends ExpressionContext { - public expression(): ExpressionContext[]; - public expression(i: number): ExpressionContext; - public expression(i?: number): ExpressionContext | ExpressionContext[] { - if (i === undefined) { - return this.getRuleContexts(ExpressionContext); - } else { - return this.getRuleContext(i, ExpressionContext); - } +export class FunctionExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); } - public POWER(): TerminalNode { return this.getToken(FormulaParser.POWER, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public functionCall(): FunctionCallContext { + return this.getTypedRuleContext(FunctionCallContext, 0) as FunctionCallContext; } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitPowerExpr) { - return visitor.visitPowerExpr(this); + if (visitor.visitFunctionExpr) { + return visitor.visitFunctionExpr(this); } else { return visitor.visitChildren(this); } } } -export class ComparisonExprContext extends ExpressionContext { - public _op!: Token; - public expression(): ExpressionContext[]; - public expression(i: number): ExpressionContext; - public expression(i?: number): ExpressionContext | ExpressionContext[] { - if (i === undefined) { - return this.getRuleContexts(ExpressionContext); - } else { - return this.getRuleContext(i, ExpressionContext); - } +export class TrueExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); } - public EQUAL(): TerminalNode | undefined { return this.tryGetToken(FormulaParser.EQUAL, 0); } - public NOT_EQUAL(): TerminalNode | undefined { return this.tryGetToken(FormulaParser.NOT_EQUAL, 0); } - public LESS(): TerminalNode | undefined { return this.tryGetToken(FormulaParser.LESS, 0); } - public LESS_EQUAL(): TerminalNode | undefined { return this.tryGetToken(FormulaParser.LESS_EQUAL, 0); } - public GREATER(): TerminalNode | undefined { return this.tryGetToken(FormulaParser.GREATER, 0); } - public GREATER_EQUAL(): TerminalNode | undefined { return this.tryGetToken(FormulaParser.GREATER_EQUAL, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public TRUE(): TerminalNode { + return this.getToken(FormulaParser.TRUE, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitComparisonExpr) { - return visitor.visitComparisonExpr(this); + if (visitor.visitTrueExpr) { + return visitor.visitTrueExpr(this); } else { return visitor.visitChildren(this); } } } -export class AndExprContext extends ExpressionContext { - public expression(): ExpressionContext[]; - public expression(i: number): ExpressionContext; - public expression(i?: number): ExpressionContext | ExpressionContext[] { - if (i === undefined) { - return this.getRuleContexts(ExpressionContext); - } else { - return this.getRuleContext(i, ExpressionContext); - } +export class TimeExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); } - public AND(): TerminalNode { return this.getToken(FormulaParser.AND, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public TIME(): TerminalNode { + return this.getToken(FormulaParser.TIME, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitAndExpr) { - return visitor.visitAndExpr(this); + if (visitor.visitTimeExpr) { + return visitor.visitTimeExpr(this); } else { return visitor.visitChildren(this); } } } -export class OrExprContext extends ExpressionContext { - public expression(): ExpressionContext[]; - public expression(i: number): ExpressionContext; - public expression(i?: number): ExpressionContext | ExpressionContext[] { - if (i === undefined) { - return this.getRuleContexts(ExpressionContext); - } else { - return this.getRuleContext(i, ExpressionContext); - } +export class ComparisonExprContext extends ExpressionContext { + public _op!: Token; + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public expression_list(): ExpressionContext[] { + return this.getTypedRuleContexts(ExpressionContext) as ExpressionContext[]; + } + public expression(i: number): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, i) as ExpressionContext; + } + public EQUAL(): TerminalNode { + return this.getToken(FormulaParser.EQUAL, 0); + } + public NOT_EQUAL(): TerminalNode { + return this.getToken(FormulaParser.NOT_EQUAL, 0); + } + public LESS(): TerminalNode { + return this.getToken(FormulaParser.LESS, 0); + } + public LESS_EQUAL(): TerminalNode { + return this.getToken(FormulaParser.LESS_EQUAL, 0); } - public OR(): TerminalNode { return this.getToken(FormulaParser.OR, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public GREATER(): TerminalNode { + return this.getToken(FormulaParser.GREATER, 0); + } + public GREATER_EQUAL(): TerminalNode { + return this.getToken(FormulaParser.GREATER_EQUAL, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitOrExpr) { - return visitor.visitOrExpr(this); + if (visitor.visitComparisonExpr) { + return visitor.visitComparisonExpr(this); } else { return visitor.visitChildren(this); } } } -export class NotExprContext extends ExpressionContext { - public NOT(): TerminalNode { return this.getToken(FormulaParser.NOT, 0); } - public expression(): ExpressionContext { - return this.getRuleContext(0, ExpressionContext); +export class DateExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public DATE(): TerminalNode { + return this.getToken(FormulaParser.DATE, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitNotExpr) { - return visitor.visitNotExpr(this); + if (visitor.visitDateExpr) { + return visitor.visitDateExpr(this); } else { return visitor.visitChildren(this); } } } -export class FunctionExprContext extends ExpressionContext { - public functionCall(): FunctionCallContext { - return this.getRuleContext(0, FunctionCallContext); +export class OrExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public expression_list(): ExpressionContext[] { + return this.getTypedRuleContexts(ExpressionContext) as ExpressionContext[]; } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public expression(i: number): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, i) as ExpressionContext; + } + public OR(): TerminalNode { + return this.getToken(FormulaParser.OR, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitFunctionExpr) { - return visitor.visitFunctionExpr(this); + if (visitor.visitOrExpr) { + return visitor.visitOrExpr(this); } else { return visitor.visitChildren(this); } } } -export class VariableExprContext extends ExpressionContext { - public variable(): VariableContext { - return this.getRuleContext(0, VariableContext); +export class FalseExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public FALSE(): TerminalNode { + return this.getToken(FormulaParser.FALSE, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitVariableExpr) { - return visitor.visitVariableExpr(this); + if (visitor.visitFalseExpr) { + return visitor.visitFalseExpr(this); } else { return visitor.visitChildren(this); } } } -export class NumberExprContext extends ExpressionContext { - public NUMBER(): TerminalNode { return this.getToken(FormulaParser.NUMBER, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); +export class NullExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public NULL(): TerminalNode { + return this.getToken(FormulaParser.NULL, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitNumberExpr) { - return visitor.visitNumberExpr(this); + if (visitor.visitNullExpr) { + return visitor.visitNullExpr(this); } else { return visitor.visitChildren(this); } } } -export class StringExprContext extends ExpressionContext { - public STRING(): TerminalNode { return this.getToken(FormulaParser.STRING, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); +export class DateTimeExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public DATETIME(): TerminalNode { + return this.getToken(FormulaParser.DATETIME, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitStringExpr) { - return visitor.visitStringExpr(this); + if (visitor.visitDateTimeExpr) { + return visitor.visitDateTimeExpr(this); } else { return visitor.visitChildren(this); } } } -export class TrueExprContext extends ExpressionContext { - public TRUE(): TerminalNode { return this.getToken(FormulaParser.TRUE, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); +export class PowerExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public expression_list(): ExpressionContext[] { + return this.getTypedRuleContexts(ExpressionContext) as ExpressionContext[]; + } + public expression(i: number): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, i) as ExpressionContext; + } + public POWER(): TerminalNode { + return this.getToken(FormulaParser.POWER, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitTrueExpr) { - return visitor.visitTrueExpr(this); + if (visitor.visitPowerExpr) { + return visitor.visitPowerExpr(this); } else { return visitor.visitChildren(this); } } } -export class FalseExprContext extends ExpressionContext { - public FALSE(): TerminalNode { return this.getToken(FormulaParser.FALSE, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); +export class NumberExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public NUMBER(): TerminalNode { + return this.getToken(FormulaParser.NUMBER, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitFalseExpr) { - return visitor.visitFalseExpr(this); + if (visitor.visitNumberExpr) { + return visitor.visitNumberExpr(this); } else { return visitor.visitChildren(this); } } } -export class NullExprContext extends ExpressionContext { - public NULL(): TerminalNode { return this.getToken(FormulaParser.NULL, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); +export class MulDivModExprContext extends ExpressionContext { + public _op!: Token; + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public expression_list(): ExpressionContext[] { + return this.getTypedRuleContexts(ExpressionContext) as ExpressionContext[]; + } + public expression(i: number): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, i) as ExpressionContext; + } + public MULTIPLY(): TerminalNode { + return this.getToken(FormulaParser.MULTIPLY, 0); + } + public DIVIDE(): TerminalNode { + return this.getToken(FormulaParser.DIVIDE, 0); + } + public MODULO(): TerminalNode { + return this.getToken(FormulaParser.MODULO, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitNullExpr) { - return visitor.visitNullExpr(this); + if (visitor.visitMulDivModExpr) { + return visitor.visitMulDivModExpr(this); } else { return visitor.visitChildren(this); } } } -export class DateExprContext extends ExpressionContext { - public DATE(): TerminalNode { return this.getToken(FormulaParser.DATE, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); +export class VariableExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public variable(): VariableContext { + return this.getTypedRuleContext(VariableContext, 0) as VariableContext; } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitDateExpr) { - return visitor.visitDateExpr(this); + if (visitor.visitVariableExpr) { + return visitor.visitVariableExpr(this); } else { return visitor.visitChildren(this); } } } -export class TimeExprContext extends ExpressionContext { - public TIME(): TerminalNode { return this.getToken(FormulaParser.TIME, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); +export class NotExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public NOT(): TerminalNode { + return this.getToken(FormulaParser.NOT, 0); + } + public expression(): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitTimeExpr) { - return visitor.visitTimeExpr(this); + if (visitor.visitNotExpr) { + return visitor.visitNotExpr(this); } else { return visitor.visitChildren(this); } } } -export class DateTimeExprContext extends ExpressionContext { - public DATETIME(): TerminalNode { return this.getToken(FormulaParser.DATETIME, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); +export class ParenExprContext extends ExpressionContext { + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public LPAREN(): TerminalNode { + return this.getToken(FormulaParser.LPAREN, 0); + } + public expression(): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; + } + public RPAREN(): TerminalNode { + return this.getToken(FormulaParser.RPAREN, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitDateTimeExpr) { - return visitor.visitDateTimeExpr(this); + if (visitor.visitParenExpr) { + return visitor.visitParenExpr(this); } else { return visitor.visitChildren(this); } } } -export class ParenExprContext extends ExpressionContext { - public LPAREN(): TerminalNode { return this.getToken(FormulaParser.LPAREN, 0); } - public expression(): ExpressionContext { - return this.getRuleContext(0, ExpressionContext); +export class AddSubExprContext extends ExpressionContext { + public _op!: Token; + constructor(parser: FormulaParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public expression_list(): ExpressionContext[] { + return this.getTypedRuleContexts(ExpressionContext) as ExpressionContext[]; + } + public expression(i: number): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, i) as ExpressionContext; + } + public ADD(): TerminalNode { + return this.getToken(FormulaParser.ADD, 0); } - public RPAREN(): TerminalNode { return this.getToken(FormulaParser.RPAREN, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public SUBTRACT(): TerminalNode { + return this.getToken(FormulaParser.SUBTRACT, 0); } // @Override public accept(visitor: FormulaParserVisitor): Result { - if (visitor.visitParenExpr) { - return visitor.visitParenExpr(this); + if (visitor.visitAddSubExpr) { + return visitor.visitAddSubExpr(this); } else { return visitor.visitChildren(this); } @@ -1015,17 +1030,25 @@ export class ParenExprContext extends ExpressionContext { export class FunctionCallContext extends ParserRuleContext { - public IDENTIFIER(): TerminalNode { return this.getToken(FormulaParser.IDENTIFIER, 0); } - public LPAREN(): TerminalNode { return this.getToken(FormulaParser.LPAREN, 0); } - public RPAREN(): TerminalNode { return this.getToken(FormulaParser.RPAREN, 0); } - public argumentList(): ArgumentListContext | undefined { - return this.tryGetRuleContext(0, ArgumentListContext); - } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { + constructor(parser?: FormulaParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); + this.parser = parser; + } + public IDENTIFIER(): TerminalNode { + return this.getToken(FormulaParser.IDENTIFIER, 0); + } + public LPAREN(): TerminalNode { + return this.getToken(FormulaParser.LPAREN, 0); + } + public RPAREN(): TerminalNode { + return this.getToken(FormulaParser.RPAREN, 0); + } + public argumentList(): ArgumentListContext { + return this.getTypedRuleContext(ArgumentListContext, 0) as ArgumentListContext; + } + public get ruleIndex(): number { + return FormulaParser.RULE_functionCall; } - // @Override - public get ruleIndex(): number { return FormulaParser.RULE_functionCall; } // @Override public accept(visitor: FormulaParserVisitor): Result { if (visitor.visitFunctionCall) { @@ -1038,29 +1061,25 @@ export class FunctionCallContext extends ParserRuleContext { export class ArgumentListContext extends ParserRuleContext { - public expression(): ExpressionContext[]; - public expression(i: number): ExpressionContext; - public expression(i?: number): ExpressionContext | ExpressionContext[] { - if (i === undefined) { - return this.getRuleContexts(ExpressionContext); - } else { - return this.getRuleContext(i, ExpressionContext); - } + constructor(parser?: FormulaParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; } - public COMMA(): TerminalNode[]; - public COMMA(i: number): TerminalNode; - public COMMA(i?: number): TerminalNode | TerminalNode[] { - if (i === undefined) { - return this.getTokens(FormulaParser.COMMA); - } else { - return this.getToken(FormulaParser.COMMA, i); - } + public expression_list(): ExpressionContext[] { + return this.getTypedRuleContexts(ExpressionContext) as ExpressionContext[]; } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public expression(i: number): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, i) as ExpressionContext; + } + public COMMA_list(): TerminalNode[] { + return this.getTokens(FormulaParser.COMMA); + } + public COMMA(i: number): TerminalNode { + return this.getToken(FormulaParser.COMMA, i); + } + public get ruleIndex(): number { + return FormulaParser.RULE_argumentList; } - // @Override - public get ruleIndex(): number { return FormulaParser.RULE_argumentList; } // @Override public accept(visitor: FormulaParserVisitor): Result { if (visitor.visitArgumentList) { @@ -1073,30 +1092,28 @@ export class ArgumentListContext extends ParserRuleContext { export class VariableContext extends ParserRuleContext { - public LBRACE(): TerminalNode[]; - public LBRACE(i: number): TerminalNode; - public LBRACE(i?: number): TerminalNode | TerminalNode[] { - if (i === undefined) { - return this.getTokens(FormulaParser.LBRACE); - } else { - return this.getToken(FormulaParser.LBRACE, i); - } + constructor(parser?: FormulaParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; } - public IDENTIFIER(): TerminalNode { return this.getToken(FormulaParser.IDENTIFIER, 0); } - public RBRACE(): TerminalNode[]; - public RBRACE(i: number): TerminalNode; - public RBRACE(i?: number): TerminalNode | TerminalNode[] { - if (i === undefined) { - return this.getTokens(FormulaParser.RBRACE); - } else { - return this.getToken(FormulaParser.RBRACE, i); - } + public LBRACE_list(): TerminalNode[] { + return this.getTokens(FormulaParser.LBRACE); } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public LBRACE(i: number): TerminalNode { + return this.getToken(FormulaParser.LBRACE, i); + } + public IDENTIFIER(): TerminalNode { + return this.getToken(FormulaParser.IDENTIFIER, 0); + } + public RBRACE_list(): TerminalNode[] { + return this.getTokens(FormulaParser.RBRACE); + } + public RBRACE(i: number): TerminalNode { + return this.getToken(FormulaParser.RBRACE, i); + } + public get ruleIndex(): number { + return FormulaParser.RULE_variable; } - // @Override - public get ruleIndex(): number { return FormulaParser.RULE_variable; } // @Override public accept(visitor: FormulaParserVisitor): Result { if (visitor.visitVariable) { @@ -1106,5 +1123,3 @@ export class VariableContext extends ParserRuleContext { } } } - - diff --git a/packages/formula/src/grammar/FormulaParserVisitor.ts b/packages/formula/src/grammar/FormulaParserVisitor.ts index 31cb9c694..232b7227b 100644 --- a/packages/formula/src/grammar/FormulaParserVisitor.ts +++ b/packages/formula/src/grammar/FormulaParserVisitor.ts @@ -1,31 +1,30 @@ -// Generated from src/grammar/FormulaParser.g4 by ANTLR 4.9.0-SNAPSHOT - - -import { ParseTreeVisitor } from "antlr4ts/tree/ParseTreeVisitor"; - -import { MulDivModExprContext } from "./FormulaParser"; -import { AddSubExprContext } from "./FormulaParser"; -import { PowerExprContext } from "./FormulaParser"; -import { ComparisonExprContext } from "./FormulaParser"; -import { AndExprContext } from "./FormulaParser"; -import { OrExprContext } from "./FormulaParser"; -import { NotExprContext } from "./FormulaParser"; -import { FunctionExprContext } from "./FormulaParser"; -import { VariableExprContext } from "./FormulaParser"; -import { NumberExprContext } from "./FormulaParser"; -import { StringExprContext } from "./FormulaParser"; -import { TrueExprContext } from "./FormulaParser"; -import { FalseExprContext } from "./FormulaParser"; -import { NullExprContext } from "./FormulaParser"; -import { DateExprContext } from "./FormulaParser"; -import { TimeExprContext } from "./FormulaParser"; -import { DateTimeExprContext } from "./FormulaParser"; -import { ParenExprContext } from "./FormulaParser"; -import { FormulaContext } from "./FormulaParser"; -import { ExpressionContext } from "./FormulaParser"; -import { FunctionCallContext } from "./FormulaParser"; -import { ArgumentListContext } from "./FormulaParser"; -import { VariableContext } from "./FormulaParser"; +// Generated from src/grammar/FormulaParser.g4 by ANTLR 4.13.2 + +import {ParseTreeVisitor} from 'antlr4'; + + +import { FormulaContext } from "./FormulaParser.js"; +import { AndExprContext } from "./FormulaParser.js"; +import { StringExprContext } from "./FormulaParser.js"; +import { FunctionExprContext } from "./FormulaParser.js"; +import { TrueExprContext } from "./FormulaParser.js"; +import { TimeExprContext } from "./FormulaParser.js"; +import { ComparisonExprContext } from "./FormulaParser.js"; +import { DateExprContext } from "./FormulaParser.js"; +import { OrExprContext } from "./FormulaParser.js"; +import { FalseExprContext } from "./FormulaParser.js"; +import { NullExprContext } from "./FormulaParser.js"; +import { DateTimeExprContext } from "./FormulaParser.js"; +import { PowerExprContext } from "./FormulaParser.js"; +import { NumberExprContext } from "./FormulaParser.js"; +import { MulDivModExprContext } from "./FormulaParser.js"; +import { VariableExprContext } from "./FormulaParser.js"; +import { NotExprContext } from "./FormulaParser.js"; +import { ParenExprContext } from "./FormulaParser.js"; +import { AddSubExprContext } from "./FormulaParser.js"; +import { FunctionCallContext } from "./FormulaParser.js"; +import { ArgumentListContext } from "./FormulaParser.js"; +import { VariableContext } from "./FormulaParser.js"; /** @@ -35,143 +34,125 @@ import { VariableContext } from "./FormulaParser"; * @param The return type of the visit operation. Use `void` for * operations with no return type. */ -export interface FormulaParserVisitor extends ParseTreeVisitor { +export default class FormulaParserVisitor extends ParseTreeVisitor { /** - * Visit a parse tree produced by the `MulDivModExpr` - * labeled alternative in `FormulaParser.expression`. + * Visit a parse tree produced by `FormulaParser.formula`. * @param ctx the parse tree * @return the visitor result */ - visitMulDivModExpr?: (ctx: MulDivModExprContext) => Result; - + visitFormula?: (ctx: FormulaContext) => Result; /** - * Visit a parse tree produced by the `AddSubExpr` + * Visit a parse tree produced by the `AndExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitAddSubExpr?: (ctx: AddSubExprContext) => Result; - + visitAndExpr?: (ctx: AndExprContext) => Result; /** - * Visit a parse tree produced by the `PowerExpr` + * Visit a parse tree produced by the `StringExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitPowerExpr?: (ctx: PowerExprContext) => Result; - + visitStringExpr?: (ctx: StringExprContext) => Result; /** - * Visit a parse tree produced by the `ComparisonExpr` + * Visit a parse tree produced by the `FunctionExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitComparisonExpr?: (ctx: ComparisonExprContext) => Result; - + visitFunctionExpr?: (ctx: FunctionExprContext) => Result; /** - * Visit a parse tree produced by the `AndExpr` + * Visit a parse tree produced by the `TrueExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitAndExpr?: (ctx: AndExprContext) => Result; - + visitTrueExpr?: (ctx: TrueExprContext) => Result; /** - * Visit a parse tree produced by the `OrExpr` + * Visit a parse tree produced by the `TimeExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitOrExpr?: (ctx: OrExprContext) => Result; - + visitTimeExpr?: (ctx: TimeExprContext) => Result; /** - * Visit a parse tree produced by the `NotExpr` + * Visit a parse tree produced by the `ComparisonExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitNotExpr?: (ctx: NotExprContext) => Result; - + visitComparisonExpr?: (ctx: ComparisonExprContext) => Result; /** - * Visit a parse tree produced by the `FunctionExpr` + * Visit a parse tree produced by the `DateExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitFunctionExpr?: (ctx: FunctionExprContext) => Result; - + visitDateExpr?: (ctx: DateExprContext) => Result; /** - * Visit a parse tree produced by the `VariableExpr` + * Visit a parse tree produced by the `OrExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitVariableExpr?: (ctx: VariableExprContext) => Result; - + visitOrExpr?: (ctx: OrExprContext) => Result; /** - * Visit a parse tree produced by the `NumberExpr` + * Visit a parse tree produced by the `FalseExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitNumberExpr?: (ctx: NumberExprContext) => Result; - + visitFalseExpr?: (ctx: FalseExprContext) => Result; /** - * Visit a parse tree produced by the `StringExpr` + * Visit a parse tree produced by the `NullExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitStringExpr?: (ctx: StringExprContext) => Result; - + visitNullExpr?: (ctx: NullExprContext) => Result; /** - * Visit a parse tree produced by the `TrueExpr` + * Visit a parse tree produced by the `DateTimeExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitTrueExpr?: (ctx: TrueExprContext) => Result; - + visitDateTimeExpr?: (ctx: DateTimeExprContext) => Result; /** - * Visit a parse tree produced by the `FalseExpr` + * Visit a parse tree produced by the `PowerExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitFalseExpr?: (ctx: FalseExprContext) => Result; - + visitPowerExpr?: (ctx: PowerExprContext) => Result; /** - * Visit a parse tree produced by the `NullExpr` + * Visit a parse tree produced by the `NumberExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitNullExpr?: (ctx: NullExprContext) => Result; - + visitNumberExpr?: (ctx: NumberExprContext) => Result; /** - * Visit a parse tree produced by the `DateExpr` + * Visit a parse tree produced by the `MulDivModExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitDateExpr?: (ctx: DateExprContext) => Result; - + visitMulDivModExpr?: (ctx: MulDivModExprContext) => Result; /** - * Visit a parse tree produced by the `TimeExpr` + * Visit a parse tree produced by the `VariableExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitTimeExpr?: (ctx: TimeExprContext) => Result; - + visitVariableExpr?: (ctx: VariableExprContext) => Result; /** - * Visit a parse tree produced by the `DateTimeExpr` + * Visit a parse tree produced by the `NotExpr` * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitDateTimeExpr?: (ctx: DateTimeExprContext) => Result; - + visitNotExpr?: (ctx: NotExprContext) => Result; /** * Visit a parse tree produced by the `ParenExpr` * labeled alternative in `FormulaParser.expression`. @@ -179,35 +160,25 @@ export interface FormulaParserVisitor extends ParseTreeVisitor { * @return the visitor result */ visitParenExpr?: (ctx: ParenExprContext) => Result; - /** - * Visit a parse tree produced by `FormulaParser.formula`. - * @param ctx the parse tree - * @return the visitor result - */ - visitFormula?: (ctx: FormulaContext) => Result; - - /** - * Visit a parse tree produced by `FormulaParser.expression`. + * Visit a parse tree produced by the `AddSubExpr` + * labeled alternative in `FormulaParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitExpression?: (ctx: ExpressionContext) => Result; - + visitAddSubExpr?: (ctx: AddSubExprContext) => Result; /** * Visit a parse tree produced by `FormulaParser.functionCall`. * @param ctx the parse tree * @return the visitor result */ visitFunctionCall?: (ctx: FunctionCallContext) => Result; - /** * Visit a parse tree produced by `FormulaParser.argumentList`. * @param ctx the parse tree * @return the visitor result */ visitArgumentList?: (ctx: ArgumentListContext) => Result; - /** * Visit a parse tree produced by `FormulaParser.variable`. * @param ctx the parse tree diff --git a/packages/formula/src/index.ts b/packages/formula/src/index.ts index 4befc2ca9..96bd91161 100644 --- a/packages/formula/src/index.ts +++ b/packages/formula/src/index.ts @@ -1,10 +1,9 @@ -export { AbstractParseTreeVisitor } from "antlr4ts/tree/AbstractParseTreeVisitor" -export { type ParseTree } from "antlr4ts/tree/ParseTree" +export * from "antlr4" export * from "./formula.constants" export * from "./formula.visitor" export * from "./formula/formula.type" export * from "./grammar/FormulaLexer" export * from "./grammar/FormulaParser" -export * from "./grammar/FormulaParserVisitor" +export { default as FormulaParserVisitor } from "./grammar/FormulaParserVisitor" export * from "./types" export * from "./util" diff --git a/packages/formula/src/util.ts b/packages/formula/src/util.ts index 6d1c5326a..1c0802d50 100644 --- a/packages/formula/src/util.ts +++ b/packages/formula/src/util.ts @@ -1,10 +1,10 @@ -import { CharStreams, CommonTokenStream } from "antlr4ts" +import { CharStream, CommonTokenStream } from "antlr4" import { FormulaVisitor } from "./formula.visitor" -import { FormulaLexer } from "./grammar/FormulaLexer" -import { FormulaParser } from "./grammar/FormulaParser" +import FormulaLexer from "./grammar/FormulaLexer" +import FormulaParser from "./grammar/FormulaParser" export function createParser(input: string) { - const inputStream = CharStreams.fromString(input) + const inputStream = new CharStream(input) const lexer = new FormulaLexer(inputStream) const tokenStream = new CommonTokenStream(lexer) return new FormulaParser(tokenStream) diff --git a/packages/persistence/src/underlying/underlying-formula.visitor.ts b/packages/persistence/src/underlying/underlying-formula.visitor.ts index e88837483..27184e0ce 100644 --- a/packages/persistence/src/underlying/underlying-formula.visitor.ts +++ b/packages/persistence/src/underlying/underlying-formula.visitor.ts @@ -1,10 +1,10 @@ import { - AbstractParseTreeVisitor, AddSubExprContext, AndExprContext, ArgumentListContext, ComparisonExprContext, FormulaContext, + FormulaParserVisitor, FunctionCallContext, FunctionExprContext, MulDivModExprContext, @@ -16,12 +16,11 @@ import { VariableContext, VariableExprContext, type FormulaFunction, - type FormulaParserVisitor, } from "@undb/formula" import { AUTO_INCREMENT_TYPE, FieldIdVo, ID_TYPE, type TableDo } from "@undb/table" import { match } from "ts-pattern" -export class UnderlyingFormulaVisitor extends AbstractParseTreeVisitor implements FormulaParserVisitor { +export class UnderlyingFormulaVisitor extends FormulaParserVisitor { constructor(private readonly table: TableDo) { super() } @@ -30,40 +29,40 @@ export class UnderlyingFormulaVisitor extends AbstractParseTreeVisitor i return "" } - visitNumberExpr(ctx: NumberExprContext): string { - return ctx.NUMBER().text + visitNumberExpr = (ctx: NumberExprContext): string => { + return ctx.NUMBER().getText() } - visitStringExpr(ctx: StringExprContext): string { - return ctx.STRING().text + visitStringExpr = (ctx: StringExprContext): string => { + return ctx.STRING().getText() } - visitComparisonExpr(ctx: ComparisonExprContext): string { + visitComparisonExpr = (ctx: ComparisonExprContext): string => { return this.visit(ctx.expression(0)) + ctx._op.text + this.visit(ctx.expression(1)) } - visitAndExpr(ctx: AndExprContext): string { + visitAndExpr = (ctx: AndExprContext): string => { return this.visit(ctx.expression(0)) + " AND " + this.visit(ctx.expression(1)) } - visitOrExpr(ctx: OrExprContext): string { + visitOrExpr = (ctx: OrExprContext): string => { return this.visit(ctx.expression(0)) + " OR " + this.visit(ctx.expression(1)) } - visitNotExpr(ctx: NotExprContext): string { + visitNotExpr = (ctx: NotExprContext): string => { return "NOT " + this.visit(ctx.expression()) } - visitAddSubExpr(ctx: AddSubExprContext): string { + visitAddSubExpr = (ctx: AddSubExprContext): string => { return this.visit(ctx.expression(0)) + ctx._op.text + this.visit(ctx.expression(1)) } - visitMulDivModExpr(ctx: MulDivModExprContext): string { + visitMulDivModExpr = (ctx: MulDivModExprContext): string => { return this.visit(ctx.expression(0)) + ctx._op.text + this.visit(ctx.expression(1)) } - visitVariable(ctx: VariableContext): string { - const fieldId = ctx.IDENTIFIER().text + visitVariable = (ctx: VariableContext): string => { + const fieldId = ctx.IDENTIFIER().getText() const field = this.table.schema .getFieldById(new FieldIdVo(fieldId)) .expect(`variable ${fieldId} not found in table ${this.table.name.value}`) @@ -75,31 +74,31 @@ export class UnderlyingFormulaVisitor extends AbstractParseTreeVisitor i return fieldId } - visitFormula(ctx: FormulaContext): string { + visitFormula = (ctx: FormulaContext): string => { const expr = ctx.expression() return this.visit(expr) } - visitFunctionExpr(ctx: FunctionExprContext): string { + visitFunctionExpr = (ctx: FunctionExprContext): string => { return this.visit(ctx.functionCall()) } - visitVariableExpr(ctx: VariableExprContext): string { + visitVariableExpr = (ctx: VariableExprContext): string => { return this.visit(ctx.variable()) } - visitParenExpr(ctx: ParenExprContext): string { + visitParenExpr = (ctx: ParenExprContext): string => { return this.visit(ctx.expression()) } private arguments(ctx: FunctionCallContext): string[] { return ctx .argumentList()! - .expression() + .expression_list() .map((expr) => this.visit(expr)) } - visitFunctionCall(ctx: FunctionCallContext): string { - const functionName = ctx.IDENTIFIER().text as FormulaFunction + visitFunctionCall = (ctx: FunctionCallContext): string => { + const functionName = ctx.IDENTIFIER().getText() as FormulaFunction return match(functionName) .with("ADD", "SUM", () => { const fn = this.arguments(ctx).join(" + ") @@ -182,9 +181,9 @@ export class UnderlyingFormulaVisitor extends AbstractParseTreeVisitor i }) } - visitArgumentList(ctx: ArgumentListContext): string { + visitArgumentList = (ctx: ArgumentListContext): string => { return ctx - .expression() + .expression_list() .map((expr) => this.visit(expr)) .join(", ") } diff --git a/packages/table/src/modules/schema/fields/variants/formula-field/formula-field.visitor.ts b/packages/table/src/modules/schema/fields/variants/formula-field/formula-field.visitor.ts deleted file mode 100644 index 8c2aa0dad..000000000 --- a/packages/table/src/modules/schema/fields/variants/formula-field/formula-field.visitor.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { - AbstractParseTreeVisitor, - FormulaContext, - FunctionCallContext, - type FormulaFunction, - type FormulaParserVisitor, -} from "@undb/formula" -import { globalFunctionRegistry } from "@undb/formula/src/formula/registry" -import type { TableDo } from "../../../../../table.do" - -export class FormulaFieldVisitor extends AbstractParseTreeVisitor implements FormulaParserVisitor { - constructor(private readonly table: TableDo) { - super() - } - protected defaultResult(): void { - return undefined - } - - visitFormula(ctx: FormulaContext): void { - this.visit(ctx.expression()) - } - - visitFunctionCall(ctx: FunctionCallContext): void { - const name = ctx.IDENTIFIER().text as FormulaFunction - // const fields = ctx - // .argumentList() - // ?.expression() - // .filter((exp) => exp instanceof VariableExprContext) - // .map((exp) => exp.variable().IDENTIFIER().text) - // .map((fieldId) => this.table.schema.getFieldByIdOrName(fieldId).into(null)) - // .filter((f) => !!f) - - const fn = globalFunctionRegistry.get(name) - if (!fn) { - throw new Error(`Function ${name} not found`) - } - } -}