From 78ab388de0a1897cc7458ff4863e451b9441ab09 Mon Sep 17 00:00:00 2001 From: Shuai Wang Date: Mon, 16 Mar 2020 11:01:25 +0800 Subject: [PATCH 01/10] remove array function, support multiline expr --- .../src/expressionFunctions.ts | 5 - .../src/expressionType.ts | 1 - .../src/parser/ExpressionAntlrParser.g4 | 2 +- .../parser/generated/ExpressionAntlrParser.ts | 200 ++++++++++-------- .../tests/expressionParser.test.js | 13 +- 5 files changed, 114 insertions(+), 107 deletions(-) diff --git a/libraries/adaptive-expressions/src/expressionFunctions.ts b/libraries/adaptive-expressions/src/expressionFunctions.ts index 998d8ef2e1..e81d56207a 100644 --- a/libraries/adaptive-expressions/src/expressionFunctions.ts +++ b/libraries/adaptive-expressions/src/expressionFunctions.ts @@ -2818,11 +2818,6 @@ export class ExpressionFunctions { ReturnType.Number, ExpressionFunctions.validateBinaryNumber), new ExpressionEvaluator(ExpressionType.CreateArray, ExpressionFunctions.apply((args: any []): any[] => Array.from(args)), ReturnType.Object), - new ExpressionEvaluator( - ExpressionType.Array, - ExpressionFunctions.apply((args: any []): any[] => [args[0]], ExpressionFunctions.verifyString), - ReturnType.Object, - ExpressionFunctions.validateUnary), new ExpressionEvaluator( ExpressionType.Binary, ExpressionFunctions.apply((args: any []): string => this.toBinary(args[0]), ExpressionFunctions.verifyString), diff --git a/libraries/adaptive-expressions/src/expressionType.ts b/libraries/adaptive-expressions/src/expressionType.ts index 233f1b2bc5..33f8995d75 100644 --- a/libraries/adaptive-expressions/src/expressionType.ts +++ b/libraries/adaptive-expressions/src/expressionType.ts @@ -90,7 +90,6 @@ export class ExpressionType { public static readonly Int: string = 'int'; public static readonly String: string = 'string'; public static readonly Bool: string = 'bool'; - public static readonly Array: string = 'array'; public static readonly Binary: string = 'binary'; public static readonly DataUri: string = 'dataUri'; public static readonly DataUriToBinary: string = 'dataUriToBinary'; diff --git a/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 b/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 index c0e17d62b9..375640ad77 100644 --- a/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 +++ b/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 @@ -13,7 +13,7 @@ expression | expression (SINGLE_AND) expression #binaryOpExp | expression (LESS_THAN|LESS_OR_EQUAl|MORE_THAN|MORE_OR_EQUAL) expression #binaryOpExp | expression DOUBLE_AND expression #binaryOpExp - | expression DOUBLE_VERTICAL_CYLINDER expression #binaryOpExp + | expression DOUBLE_VERTICAL_CYLINDER NEWLINE? expression #binaryOpExp | primaryExpression #primaryExp ; diff --git a/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts b/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts index 7d055e60d3..7d5bb52e2c 100644 --- a/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts +++ b/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts @@ -201,9 +201,9 @@ export class ExpressionAntlrParser extends Parser { throw new NoViableAltException(this); } this._ctx._stop = this._input.tryLT(-1); - this.state = 47; + this.state = 50; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 2, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 3, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -211,9 +211,9 @@ export class ExpressionAntlrParser extends Parser { } _prevctx = _localctx; { - this.state = 45; + this.state = 48; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 1, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 2, this._ctx) ) { case 1: { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); @@ -371,16 +371,26 @@ export class ExpressionAntlrParser extends Parser { } this.state = 43; this.match(ExpressionAntlrParser.DOUBLE_VERTICAL_CYLINDER); - this.state = 44; + this.state = 45; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === ExpressionAntlrParser.EOF) { + { + this.state = 44; + this.match(ExpressionAntlrParser.EOF); + } + } + + this.state = 47; this.expression(3); } break; } } } - this.state = 49; + this.state = 52; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 2, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 3, this._ctx); } } } @@ -418,7 +428,7 @@ export class ExpressionAntlrParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 60; + this.state = 63; this._errHandler.sync(this); switch (this._input.LA(1)) { case ExpressionAntlrParser.OPEN_BRACKET: @@ -427,11 +437,11 @@ export class ExpressionAntlrParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 51; + this.state = 54; this.match(ExpressionAntlrParser.OPEN_BRACKET); - this.state = 52; + this.state = 55; this.expression(0); - this.state = 53; + this.state = 56; this.match(ExpressionAntlrParser.CLOSE_BRACKET); } break; @@ -440,7 +450,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new ConstantAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 55; + this.state = 58; this.match(ExpressionAntlrParser.CONSTANT); } break; @@ -449,7 +459,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new NumericAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 56; + this.state = 59; this.match(ExpressionAntlrParser.NUMBER); } break; @@ -458,7 +468,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new StringAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 57; + this.state = 60; this.match(ExpressionAntlrParser.STRING); } break; @@ -467,7 +477,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new IdAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 58; + this.state = 61; this.match(ExpressionAntlrParser.IDENTIFIER); } break; @@ -476,7 +486,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new StringInterpolationAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 59; + this.state = 62; this.stringInterpolation(); } break; @@ -484,9 +494,9 @@ export class ExpressionAntlrParser extends Parser { throw new NoViableAltException(this); } this._ctx._stop = this._input.tryLT(-1); - this.state = 78; + this.state = 81; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 6, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 7, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -494,20 +504,20 @@ export class ExpressionAntlrParser extends Parser { } _prevctx = _localctx; { - this.state = 76; + this.state = 79; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 5, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 6, this._ctx) ) { case 1: { _localctx = new MemberAccessExpContext(new PrimaryExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_primaryExpression); - this.state = 62; + this.state = 65; if (!(this.precpred(this._ctx, 3))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 63; + this.state = 66; this.match(ExpressionAntlrParser.DOT); - this.state = 64; + this.state = 67; this.match(ExpressionAntlrParser.IDENTIFIER); } break; @@ -516,23 +526,23 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new FuncInvokeExpContext(new PrimaryExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_primaryExpression); - this.state = 65; + this.state = 68; if (!(this.precpred(this._ctx, 2))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 66; + this.state = 69; this.match(ExpressionAntlrParser.OPEN_BRACKET); - this.state = 68; + this.state = 71; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ExpressionAntlrParser.STRING_INTERPOLATION_START) | (1 << ExpressionAntlrParser.PLUS) | (1 << ExpressionAntlrParser.SUBSTRACT) | (1 << ExpressionAntlrParser.NON) | (1 << ExpressionAntlrParser.OPEN_BRACKET) | (1 << ExpressionAntlrParser.NUMBER) | (1 << ExpressionAntlrParser.IDENTIFIER) | (1 << ExpressionAntlrParser.STRING) | (1 << ExpressionAntlrParser.CONSTANT))) !== 0)) { { - this.state = 67; + this.state = 70; this.argsList(); } } - this.state = 70; + this.state = 73; this.match(ExpressionAntlrParser.CLOSE_BRACKET); } break; @@ -541,24 +551,24 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new IndexAccessExpContext(new PrimaryExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_primaryExpression); - this.state = 71; + this.state = 74; if (!(this.precpred(this._ctx, 1))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 72; + this.state = 75; this.match(ExpressionAntlrParser.OPEN_SQUARE_BRACKET); - this.state = 73; + this.state = 76; this.expression(0); - this.state = 74; + this.state = 77; this.match(ExpressionAntlrParser.CLOSE_SQUARE_BRACKET); } break; } } } - this.state = 80; + this.state = 83; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 6, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 7, this._ctx); } } } @@ -584,31 +594,31 @@ export class ExpressionAntlrParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 81; + this.state = 84; this.match(ExpressionAntlrParser.STRING_INTERPOLATION_START); - this.state = 85; + this.state = 88; this._errHandler.sync(this); _la = this._input.LA(1); do { { - this.state = 85; + this.state = 88; this._errHandler.sync(this); switch (this._input.LA(1)) { case ExpressionAntlrParser.ESCAPE_CHARACTER: { - this.state = 82; + this.state = 85; this.match(ExpressionAntlrParser.ESCAPE_CHARACTER); } break; case ExpressionAntlrParser.TEMPLATE: { - this.state = 83; + this.state = 86; this.match(ExpressionAntlrParser.TEMPLATE); } break; case ExpressionAntlrParser.TEXT_CONTENT: { - this.state = 84; + this.state = 87; this.textContent(); } break; @@ -616,11 +626,11 @@ export class ExpressionAntlrParser extends Parser { throw new NoViableAltException(this); } } - this.state = 87; + this.state = 90; this._errHandler.sync(this); _la = this._input.LA(1); } while (((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (ExpressionAntlrParser.TEMPLATE - 31)) | (1 << (ExpressionAntlrParser.ESCAPE_CHARACTER - 31)) | (1 << (ExpressionAntlrParser.TEXT_CONTENT - 31)))) !== 0)); - this.state = 89; + this.state = 92; this.match(ExpressionAntlrParser.STRING_INTERPOLATION_START); } } @@ -646,7 +656,7 @@ export class ExpressionAntlrParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 92; + this.state = 95; this._errHandler.sync(this); _alt = 1; do { @@ -654,7 +664,7 @@ export class ExpressionAntlrParser extends Parser { case 1: { { - this.state = 91; + this.state = 94; this.match(ExpressionAntlrParser.TEXT_CONTENT); } } @@ -662,9 +672,9 @@ export class ExpressionAntlrParser extends Parser { default: throw new NoViableAltException(this); } - this.state = 94; + this.state = 97; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 9, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 10, this._ctx); } while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER); } } @@ -690,21 +700,21 @@ export class ExpressionAntlrParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 96; + this.state = 99; this.expression(0); - this.state = 101; + this.state = 104; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === ExpressionAntlrParser.COMMA) { { { - this.state = 97; + this.state = 100; this.match(ExpressionAntlrParser.COMMA); - this.state = 98; + this.state = 101; this.expression(0); } } - this.state = 103; + this.state = 106; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -778,53 +788,54 @@ export class ExpressionAntlrParser extends Parser { } public static readonly _serializedATN: string = - "\x03\uAF6F\u8320\u479D\uB75C\u4880\u1605\u191C\uAB37\x03#k\x04\x02\t\x02" + + "\x03\uAF6F\u8320\u479D\uB75C\u4880\u1605\u191C\uAB37\x03#n\x04\x02\t\x02" + "\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07\t\x07" + "\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x05\x03\x16\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\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x030\n\x03\f" + - "\x03\x0E\x033\v\x03\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" + - "\x04\x03\x04\x03\x04\x03\x04\x05\x04?\n\x04\x03\x04\x03\x04\x03\x04\x03" + - "\x04\x03\x04\x03\x04\x05\x04G\n\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" + - "\x04\x03\x04\x07\x04O\n\x04\f\x04\x0E\x04R\v\x04\x03\x05\x03\x05\x03\x05" + - "\x03\x05\x06\x05X\n\x05\r\x05\x0E\x05Y\x03\x05\x03\x05\x03\x06\x06\x06" + - "_\n\x06\r\x06\x0E\x06`\x03\x07\x03\x07\x03\x07\x07\x07f\n\x07\f\x07\x0E" + - "\x07i\v\x07\x03\x07\x02\x02\x04\x04\x06\b\x02\x02\x04\x02\x06\x02\b\x02" + - "\n\x02\f\x02\x02\x07\x03\x02\x04\x06\x03\x02\b\n\x03\x02\x04\x05\x03\x02" + - "\v\f\x03\x02\x10\x13{\x02\x0E\x03\x02\x02\x02\x04\x15\x03\x02\x02\x02" + - "\x06>\x03\x02\x02\x02\bS\x03\x02\x02\x02\n^\x03\x02\x02\x02\fb\x03\x02" + - "\x02\x02\x0E\x0F\x05\x04\x03\x02\x0F\x10\x07\x02\x02\x03\x10\x03\x03\x02" + - "\x02\x02\x11\x12\b\x03\x01\x02\x12\x13\t\x02\x02\x02\x13\x16\x05\x04\x03" + - "\f\x14\x16\x05\x06\x04\x02\x15\x11\x03\x02\x02\x02\x15\x14\x03\x02\x02" + - "\x02\x161\x03\x02\x02\x02\x17\x18\f\v\x02\x02\x18\x19\x07\x07\x02\x02" + - "\x190\x05\x04\x03\v\x1A\x1B\f\n\x02\x02\x1B\x1C\t\x03\x02\x02\x1C0\x05" + - "\x04\x03\v\x1D\x1E\f\t\x02\x02\x1E\x1F\t\x04\x02\x02\x1F0\x05\x04\x03" + - "\n !\f\b\x02\x02!\"\t\x05\x02\x02\"0\x05\x04\x03\t#$\f\x07\x02\x02$%\x07" + - "\r\x02\x02%0\x05\x04\x03\b&\'\f\x06\x02\x02\'(\t\x06\x02\x02(0\x05\x04" + - "\x03\x07)*\f\x05\x02\x02*+\x07\x0E\x02\x02+0\x05\x04\x03\x06,-\f\x04\x02" + - "\x02-.\x07\x0F\x02\x02.0\x05\x04\x03\x05/\x17\x03\x02\x02\x02/\x1A\x03" + - "\x02\x02\x02/\x1D\x03\x02\x02\x02/ \x03\x02\x02\x02/#\x03\x02\x02\x02" + - "/&\x03\x02\x02\x02/)\x03\x02\x02\x02/,\x03\x02\x02\x0203\x03\x02\x02\x02" + - "1/\x03\x02\x02\x0212\x03\x02\x02\x022\x05\x03\x02\x02\x0231\x03\x02\x02" + - "\x0245\b\x04\x01\x0256\x07\x14\x02\x0267\x05\x04\x03\x0278\x07\x15\x02" + - "\x028?\x03\x02\x02\x029?\x07\x1F\x02\x02:?\x07\x1A\x02\x02;?\x07\x1E\x02" + - "\x024\x03\x02\x02\x02>9\x03\x02\x02" + - "\x02>:\x03\x02\x02\x02>;\x03\x02\x02\x02><\x03\x02\x02\x02>=\x03\x02\x02" + - "\x02?P\x03\x02\x02\x02@A\f\x05\x02\x02AB\x07\x16\x02\x02BO\x07\x1C\x02" + - "\x02CD\f\x04\x02\x02DF\x07\x14\x02\x02EG\x05\f\x07\x02FE\x03\x02\x02\x02" + - "FG\x03\x02\x02\x02GH\x03\x02\x02\x02HO\x07\x15\x02\x02IJ\f\x03\x02\x02" + - "JK\x07\x17\x02\x02KL\x05\x04\x03\x02LM\x07\x18\x02\x02MO\x03\x02\x02\x02" + - "N@\x03\x02\x02\x02NC\x03\x02\x02\x02NI\x03\x02\x02\x02OR\x03\x02\x02\x02" + - "PN\x03\x02\x02\x02PQ\x03\x02\x02\x02Q\x07\x03\x02\x02\x02RP\x03\x02\x02" + - "\x02SW\x07\x03\x02\x02TX\x07\"\x02\x02UX\x07!\x02\x02VX\x05\n\x06\x02" + - "WT\x03\x02\x02\x02WU\x03\x02\x02\x02WV\x03\x02\x02\x02XY\x03\x02\x02\x02" + - "YW\x03\x02\x02\x02YZ\x03\x02\x02\x02Z[\x03\x02\x02\x02[\\\x07\x03\x02" + - "\x02\\\t\x03\x02\x02\x02]_\x07#\x02\x02^]\x03\x02\x02\x02_`\x03\x02\x02" + - "\x02`^\x03\x02\x02\x02`a\x03\x02\x02\x02a\v\x03\x02\x02\x02bg\x05\x04" + - "\x03\x02cd\x07\x19\x02\x02df\x05\x04\x03\x02ec\x03\x02\x02\x02fi\x03\x02" + - "\x02\x02ge\x03\x02\x02\x02gh\x03\x02\x02\x02h\r\x03\x02\x02\x02ig\x03" + - "\x02\x02\x02\r\x15/1>FNPWY`g"; + "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x05\x030\n\x03\x03" + + "\x03\x07\x033\n\x03\f\x03\x0E\x036\v\x03\x03\x04\x03\x04\x03\x04\x03\x04" + + "\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x05\x04B\n\x04\x03\x04" + + "\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x05\x04J\n\x04\x03\x04\x03\x04" + + "\x03\x04\x03\x04\x03\x04\x03\x04\x07\x04R\n\x04\f\x04\x0E\x04U\v\x04\x03" + + "\x05\x03\x05\x03\x05\x03\x05\x06\x05[\n\x05\r\x05\x0E\x05\\\x03\x05\x03" + + "\x05\x03\x06\x06\x06b\n\x06\r\x06\x0E\x06c\x03\x07\x03\x07\x03\x07\x07" + + "\x07i\n\x07\f\x07\x0E\x07l\v\x07\x03\x07\x02\x02\x04\x04\x06\b\x02\x02" + + "\x04\x02\x06\x02\b\x02\n\x02\f\x02\x02\x07\x03\x02\x04\x06\x03\x02\b\n" + + "\x03\x02\x04\x05\x03\x02\v\f\x03\x02\x10\x13\x7F\x02\x0E\x03\x02\x02\x02" + + "\x04\x15\x03\x02\x02\x02\x06A\x03\x02\x02\x02\bV\x03\x02\x02\x02\na\x03" + + "\x02\x02\x02\fe\x03\x02\x02\x02\x0E\x0F\x05\x04\x03\x02\x0F\x10\x07\x02" + + "\x02\x03\x10\x03\x03\x02\x02\x02\x11\x12\b\x03\x01\x02\x12\x13\t\x02\x02" + + "\x02\x13\x16\x05\x04\x03\f\x14\x16\x05\x06\x04\x02\x15\x11\x03\x02\x02" + + "\x02\x15\x14\x03\x02\x02\x02\x164\x03\x02\x02\x02\x17\x18\f\v\x02\x02" + + "\x18\x19\x07\x07\x02\x02\x193\x05\x04\x03\v\x1A\x1B\f\n\x02\x02\x1B\x1C" + + "\t\x03\x02\x02\x1C3\x05\x04\x03\v\x1D\x1E\f\t\x02\x02\x1E\x1F\t\x04\x02" + + "\x02\x1F3\x05\x04\x03\n !\f\b\x02\x02!\"\t\x05\x02\x02\"3\x05\x04\x03" + + "\t#$\f\x07\x02\x02$%\x07\r\x02\x02%3\x05\x04\x03\b&\'\f\x06\x02\x02\'" + + "(\t\x06\x02\x02(3\x05\x04\x03\x07)*\f\x05\x02\x02*+\x07\x0E\x02\x02+3" + + "\x05\x04\x03\x06,-\f\x04\x02\x02-/\x07\x0F\x02\x02.0\x07\x02\x02\x03/" + + ".\x03\x02\x02\x02/0\x03\x02\x02\x0201\x03\x02\x02\x0213\x05\x04\x03\x05" + + "2\x17\x03\x02\x02\x022\x1A\x03\x02\x02\x022\x1D\x03\x02\x02\x022 \x03" + + "\x02\x02\x022#\x03\x02\x02\x022&\x03\x02\x02\x022)\x03\x02\x02\x022,\x03" + + "\x02\x02\x0236\x03\x02\x02\x0242\x03\x02\x02\x0245\x03\x02\x02\x025\x05" + + "\x03\x02\x02\x0264\x03\x02\x02\x0278\b\x04\x01\x0289\x07\x14\x02\x029" + + ":\x05\x04\x03\x02:;\x07\x15\x02\x02;B\x03\x02\x02\x02B\x07\x1E\x02\x02?B\x07\x1C\x02\x02@B\x05\b\x05\x02" + + "A7\x03\x02\x02\x02A<\x03\x02\x02\x02A=\x03\x02\x02\x02A>\x03\x02\x02\x02" + + "A?\x03\x02\x02\x02A@\x03\x02\x02\x02BS\x03\x02\x02\x02CD\f\x05\x02\x02" + + "DE\x07\x16\x02\x02ER\x07\x1C\x02\x02FG\f\x04\x02\x02GI\x07\x14\x02\x02" + + "HJ\x05\f\x07\x02IH\x03\x02\x02\x02IJ\x03\x02\x02\x02JK\x03\x02\x02\x02" + + "KR\x07\x15\x02\x02LM\f\x03\x02\x02MN\x07\x17\x02\x02NO\x05\x04\x03\x02" + + "OP\x07\x18\x02\x02PR\x03\x02\x02\x02QC\x03\x02\x02\x02QF\x03\x02\x02\x02" + + "QL\x03\x02\x02\x02RU\x03\x02\x02\x02SQ\x03\x02\x02\x02ST\x03\x02\x02\x02" + + "T\x07\x03\x02\x02\x02US\x03\x02\x02\x02VZ\x07\x03\x02\x02W[\x07\"\x02" + + "\x02X[\x07!\x02\x02Y[\x05\n\x06\x02ZW\x03\x02\x02\x02ZX\x03\x02\x02\x02" + + "ZY\x03\x02\x02\x02[\\\x03\x02\x02\x02\\Z\x03\x02\x02\x02\\]\x03\x02\x02" + + "\x02]^\x03\x02\x02\x02^_\x07\x03\x02\x02_\t\x03\x02\x02\x02`b\x07#\x02" + + "\x02a`\x03\x02\x02\x02bc\x03\x02\x02\x02ca\x03\x02\x02\x02cd\x03\x02\x02" + + "\x02d\v\x03\x02\x02\x02ej\x05\x04\x03\x02fg\x07\x19\x02\x02gi\x05\x04" + + "\x03\x02hf\x03\x02\x02\x02il\x03\x02\x02\x02jh\x03\x02\x02\x02jk\x03\x02" + + "\x02\x02k\r\x03\x02\x02\x02lj\x03\x02\x02\x02\x0E\x15/24AIQSZ\\cj"; public static __ATN: ATN; public static get _ATN(): ATN { if (!ExpressionAntlrParser.__ATN) { @@ -936,6 +947,7 @@ export class BinaryOpExpContext extends ExpressionContext { public MORE_OR_EQUAL(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.MORE_OR_EQUAL, 0); } public DOUBLE_AND(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.DOUBLE_AND, 0); } public DOUBLE_VERTICAL_CYLINDER(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.DOUBLE_VERTICAL_CYLINDER, 0); } + public EOF(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.EOF, 0); } constructor(ctx: ExpressionContext) { super(ctx.parent, ctx.invokingState); this.copyFrom(ctx); diff --git a/libraries/adaptive-expressions/tests/expressionParser.test.js b/libraries/adaptive-expressions/tests/expressionParser.test.js index f38fe2e8db..7364e7d7c5 100644 --- a/libraries/adaptive-expressions/tests/expressionParser.test.js +++ b/libraries/adaptive-expressions/tests/expressionParser.test.js @@ -80,6 +80,8 @@ const dataSource = [ ['hello && "hello"', true], ['items || ((2 + 2) <= (4 - 1))', true], // true || false ['0 || false', true], // true || false + ['0 ||\n false', true], // true || false + ['0 ||\r\n false', true], // true || false ['!(hello)', false], // false ['!(10)', false], ['!(0)', false], @@ -276,7 +278,6 @@ const dataSource = [ ['bool(\'hi\')', true], ['createArray(\'h\', \'e\', \'l\', \'l\', \'o\')', ['h', 'e', 'l', 'l', 'o']], ['createArray(1, bool(0), string(bool(1)), float(\'10\'))', [1, true, 'true', 10.0]], - ['array(hello)', ['hello']], ['binary(hello)', '0110100001100101011011000110110001101111'], ['dataUri(hello)', 'data:text/plain;charset=utf-8;base64,aGVsbG8='], ['dataUriToBinary(dataUri(hello))', '011001000110000101110100011000010011101001110100011001010111100001110100001011110111000001101100011000010110100101101110001110110110001101101000011000010111001001110011011001010111010000111101011101010111010001100110001011010011100000111011011000100110000101110011011001010011011000110100001011000110000101000111010101100111001101100010010001110011100000111101'], @@ -342,8 +343,8 @@ const dataSource = [ ['formatDateTime(notISOTimestamp, \'ddd\')', 'Thu'], ['formatDateTime(notISOTimestamp, \'dddd\')', 'Thursday'], ['formatDateTime(\'2018-03-15T00:00:00.000Z\', \'yyyy\')', '2018'], -// ['formatDateTime(\'2018-03-15T00:00:00.000Z\', \'yyyy-MM-dd-\\\\d\')', '2018-03-15-4'], -// - Fails in the US + // ['formatDateTime(\'2018-03-15T00:00:00.000Z\', \'yyyy-MM-dd-\\\\d\')', '2018-03-15-4'], + // - Fails in the US ['formatDateTime(\'2018-03-15T00:00:00.010Z\', \'FFFF\')', '0100'], ['formatDateTime(\'2018-03-15T00:00:00.010Z\', \'FFFFFF\')', '010000'], ['formatDateTime(\'2018-03-15T00:00:00.010Z\', \'FFF\')', '010'], @@ -366,9 +367,9 @@ const dataSource = [ ['subtractFromTime(timestamp, 1, \'Hour\')', '2018-03-15T12:00:00.111Z'], ['subtractFromTime(timestamp, 1, \'Minute\')', '2018-03-15T12:59:00.111Z'], ['subtractFromTime(timestamp, 1, \'Second\')', '2018-03-15T12:59:59.111Z'], -// ['dateReadBack(timestamp, addDays(timestamp, 1))', 'tomorrow'], -// ['dateReadBack(addDays(timestamp, 1),timestamp)', 'yesterday'], -// - Fails in the US + // ['dateReadBack(timestamp, addDays(timestamp, 1))', 'tomorrow'], + // ['dateReadBack(addDays(timestamp, 1),timestamp)', 'yesterday'], + // - Fails in the US ['getTimeOfDay(\'2018-03-15T00:00:00.000Z\')', 'midnight'], ['getTimeOfDay(\'2018-03-15T08:00:00.000Z\')', 'morning'], ['getTimeOfDay(\'2018-03-15T12:00:00.000Z\')', 'noon'], From 94318af1cd29647005dad1d8c6cb71986df1d608 Mon Sep 17 00:00:00 2001 From: Shuai Wang Date: Mon, 16 Mar 2020 14:29:27 +0800 Subject: [PATCH 02/10] adding type checking related functions --- .../src/expressionFunctions.ts | 32 ++- .../src/expressionType.ts | 9 + .../src/parser/ExpressionAntlrParser.g4 | 4 +- .../parser/generated/ExpressionAntlrParser.ts | 241 +++++++++-------- .../tests/badExpression.test.js | 11 +- .../tests/expressionParser.test.js | 22 ++ libraries/botbuilder-lg/src/LGFileLexer.g4 | 2 +- .../src/generated/LGFileLexer.ts | 252 +++++++++--------- .../src/generated/LGFileParser.ts | 2 +- .../src/generated/LGFileParserListener.ts | 2 +- .../src/generated/LGFileParserVisitor.ts | 2 +- libraries/botbuilder-lg/tests/lg.test.js | 3 + .../tests/testData/examples/5.lg | 9 +- 13 files changed, 347 insertions(+), 244 deletions(-) diff --git a/libraries/adaptive-expressions/src/expressionFunctions.ts b/libraries/adaptive-expressions/src/expressionFunctions.ts index e81d56207a..d38d6b495b 100644 --- a/libraries/adaptive-expressions/src/expressionFunctions.ts +++ b/libraries/adaptive-expressions/src/expressionFunctions.ts @@ -2983,7 +2983,37 @@ export class ExpressionFunctions { return {value, error}; }), ReturnType.Boolean, - ExpressionFunctions.validateIsMatch) + ExpressionFunctions.validateIsMatch), + + // Type Checking Functions + new ExpressionEvaluator(ExpressionType.isString, ExpressionFunctions.apply( + (args: any[]): boolean => typeof args[0] === 'string'), + ReturnType.Boolean, + ExpressionFunctions.validateUnary), + new ExpressionEvaluator(ExpressionType.isInteger, ExpressionFunctions.apply( + (args: any[]): boolean => typeof args[0] === 'number' && args[0] % 1 === 0), + ReturnType.Boolean, + ExpressionFunctions.validateUnary), + new ExpressionEvaluator(ExpressionType.isFloat, ExpressionFunctions.apply( + (args: any[]): boolean => typeof args[0] === 'number' && args[0] % 1 !== 0), + ReturnType.Boolean, + ExpressionFunctions.validateUnary), + new ExpressionEvaluator(ExpressionType.isArray, ExpressionFunctions.apply( + (args: any[]): boolean => Array.isArray(args[0])), + ReturnType.Boolean, + ExpressionFunctions.validateUnary), + new ExpressionEvaluator(ExpressionType.isObject, ExpressionFunctions.apply( + (args: any[]): boolean => typeof args[0] === 'object'), + ReturnType.Boolean, + ExpressionFunctions.validateUnary), + new ExpressionEvaluator(ExpressionType.isBoolean, ExpressionFunctions.apply( + (args: any[]): boolean => typeof args[0] === 'boolean'), + ReturnType.Boolean, + ExpressionFunctions.validateUnary), + new ExpressionEvaluator(ExpressionType.isDateTime, ExpressionFunctions.apply( + (args: any[]): boolean => typeof args[0] === 'string' && this.verifyISOTimestamp(args[0]) === undefined), + ReturnType.Boolean, + ExpressionFunctions.validateUnary) ]; const lookup: Map = new Map(); diff --git a/libraries/adaptive-expressions/src/expressionType.ts b/libraries/adaptive-expressions/src/expressionType.ts index 33f8995d75..b2433cdcc2 100644 --- a/libraries/adaptive-expressions/src/expressionType.ts +++ b/libraries/adaptive-expressions/src/expressionType.ts @@ -153,4 +153,13 @@ export class ExpressionType { // Regar expression public static readonly IsMatch: string = 'isMatch'; + + //Type Checking + public static readonly isString: string = 'isString'; + public static readonly isInteger: string = 'isInteger'; + public static readonly isArray: string = 'isArray'; + public static readonly isObject: string = 'isObject'; + public static readonly isFloat: string = 'isFloat'; + public static readonly isDateTime: string = 'isDateTime'; + public static readonly isBoolean: string = 'isBoolean'; } diff --git a/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 b/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 index 375640ad77..0534372bee 100644 --- a/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 +++ b/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 @@ -10,9 +10,9 @@ expression | expression (ASTERISK|SLASH|PERCENT) expression #binaryOpExp | expression (PLUS|SUBSTRACT) expression #binaryOpExp | expression (DOUBLE_EQUAL|NOT_EQUAL) expression #binaryOpExp - | expression (SINGLE_AND) expression #binaryOpExp + | expression (SINGLE_AND) NEWLINE? expression #binaryOpExp | expression (LESS_THAN|LESS_OR_EQUAl|MORE_THAN|MORE_OR_EQUAL) expression #binaryOpExp - | expression DOUBLE_AND expression #binaryOpExp + | expression DOUBLE_AND NEWLINE? expression #binaryOpExp | expression DOUBLE_VERTICAL_CYLINDER NEWLINE? expression #binaryOpExp | primaryExpression #primaryExp ; diff --git a/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts b/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts index 7d5bb52e2c..7d473edb40 100644 --- a/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts +++ b/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts @@ -201,9 +201,9 @@ export class ExpressionAntlrParser extends Parser { throw new NoViableAltException(this); } this._ctx._stop = this._input.tryLT(-1); - this.state = 50; + this.state = 56; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 3, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 5, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -211,9 +211,9 @@ export class ExpressionAntlrParser extends Parser { } _prevctx = _localctx; { - this.state = 48; + this.state = 54; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 2, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 4, this._ctx) ) { case 1: { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); @@ -316,7 +316,17 @@ export class ExpressionAntlrParser extends Parser { this.state = 34; this.match(ExpressionAntlrParser.SINGLE_AND); } - this.state = 35; + this.state = 36; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === ExpressionAntlrParser.NEWLINE) { + { + this.state = 35; + this.match(ExpressionAntlrParser.NEWLINE); + } + } + + this.state = 38; this.expression(6); } break; @@ -325,11 +335,11 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 36; + this.state = 39; if (!(this.precpred(this._ctx, 4))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 37; + this.state = 40; _la = this._input.LA(1); if (!((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ExpressionAntlrParser.LESS_THAN) | (1 << ExpressionAntlrParser.MORE_THAN) | (1 << ExpressionAntlrParser.LESS_OR_EQUAl) | (1 << ExpressionAntlrParser.MORE_OR_EQUAL))) !== 0))) { this._errHandler.recoverInline(this); @@ -341,7 +351,7 @@ export class ExpressionAntlrParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 38; + this.state = 41; this.expression(5); } break; @@ -350,13 +360,23 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 39; + this.state = 42; if (!(this.precpred(this._ctx, 3))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 40; + this.state = 43; this.match(ExpressionAntlrParser.DOUBLE_AND); - this.state = 41; + this.state = 45; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === ExpressionAntlrParser.NEWLINE) { + { + this.state = 44; + this.match(ExpressionAntlrParser.NEWLINE); + } + } + + this.state = 47; this.expression(4); } break; @@ -365,32 +385,32 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 42; + this.state = 48; if (!(this.precpred(this._ctx, 2))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 43; + this.state = 49; this.match(ExpressionAntlrParser.DOUBLE_VERTICAL_CYLINDER); - this.state = 45; + this.state = 51; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === ExpressionAntlrParser.EOF) { + if (_la === ExpressionAntlrParser.NEWLINE) { { - this.state = 44; - this.match(ExpressionAntlrParser.EOF); + this.state = 50; + this.match(ExpressionAntlrParser.NEWLINE); } } - this.state = 47; + this.state = 53; this.expression(3); } break; } } } - this.state = 52; + this.state = 58; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 3, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 5, this._ctx); } } } @@ -428,7 +448,7 @@ export class ExpressionAntlrParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 63; + this.state = 69; this._errHandler.sync(this); switch (this._input.LA(1)) { case ExpressionAntlrParser.OPEN_BRACKET: @@ -437,11 +457,11 @@ export class ExpressionAntlrParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 54; + this.state = 60; this.match(ExpressionAntlrParser.OPEN_BRACKET); - this.state = 55; + this.state = 61; this.expression(0); - this.state = 56; + this.state = 62; this.match(ExpressionAntlrParser.CLOSE_BRACKET); } break; @@ -450,7 +470,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new ConstantAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 58; + this.state = 64; this.match(ExpressionAntlrParser.CONSTANT); } break; @@ -459,7 +479,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new NumericAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 59; + this.state = 65; this.match(ExpressionAntlrParser.NUMBER); } break; @@ -468,7 +488,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new StringAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 60; + this.state = 66; this.match(ExpressionAntlrParser.STRING); } break; @@ -477,7 +497,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new IdAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 61; + this.state = 67; this.match(ExpressionAntlrParser.IDENTIFIER); } break; @@ -486,7 +506,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new StringInterpolationAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 62; + this.state = 68; this.stringInterpolation(); } break; @@ -494,9 +514,9 @@ export class ExpressionAntlrParser extends Parser { throw new NoViableAltException(this); } this._ctx._stop = this._input.tryLT(-1); - this.state = 81; + this.state = 87; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 7, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 9, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -504,20 +524,20 @@ export class ExpressionAntlrParser extends Parser { } _prevctx = _localctx; { - this.state = 79; + this.state = 85; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 6, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 8, this._ctx) ) { case 1: { _localctx = new MemberAccessExpContext(new PrimaryExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_primaryExpression); - this.state = 65; + this.state = 71; if (!(this.precpred(this._ctx, 3))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 66; + this.state = 72; this.match(ExpressionAntlrParser.DOT); - this.state = 67; + this.state = 73; this.match(ExpressionAntlrParser.IDENTIFIER); } break; @@ -526,23 +546,23 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new FuncInvokeExpContext(new PrimaryExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_primaryExpression); - this.state = 68; + this.state = 74; if (!(this.precpred(this._ctx, 2))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 69; + this.state = 75; this.match(ExpressionAntlrParser.OPEN_BRACKET); - this.state = 71; + this.state = 77; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ExpressionAntlrParser.STRING_INTERPOLATION_START) | (1 << ExpressionAntlrParser.PLUS) | (1 << ExpressionAntlrParser.SUBSTRACT) | (1 << ExpressionAntlrParser.NON) | (1 << ExpressionAntlrParser.OPEN_BRACKET) | (1 << ExpressionAntlrParser.NUMBER) | (1 << ExpressionAntlrParser.IDENTIFIER) | (1 << ExpressionAntlrParser.STRING) | (1 << ExpressionAntlrParser.CONSTANT))) !== 0)) { { - this.state = 70; + this.state = 76; this.argsList(); } } - this.state = 73; + this.state = 79; this.match(ExpressionAntlrParser.CLOSE_BRACKET); } break; @@ -551,24 +571,24 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new IndexAccessExpContext(new PrimaryExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_primaryExpression); - this.state = 74; + this.state = 80; if (!(this.precpred(this._ctx, 1))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 75; + this.state = 81; this.match(ExpressionAntlrParser.OPEN_SQUARE_BRACKET); - this.state = 76; + this.state = 82; this.expression(0); - this.state = 77; + this.state = 83; this.match(ExpressionAntlrParser.CLOSE_SQUARE_BRACKET); } break; } } } - this.state = 83; + this.state = 89; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 7, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 9, this._ctx); } } } @@ -594,31 +614,31 @@ export class ExpressionAntlrParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 84; + this.state = 90; this.match(ExpressionAntlrParser.STRING_INTERPOLATION_START); - this.state = 88; + this.state = 94; this._errHandler.sync(this); _la = this._input.LA(1); do { { - this.state = 88; + this.state = 94; this._errHandler.sync(this); switch (this._input.LA(1)) { case ExpressionAntlrParser.ESCAPE_CHARACTER: { - this.state = 85; + this.state = 91; this.match(ExpressionAntlrParser.ESCAPE_CHARACTER); } break; case ExpressionAntlrParser.TEMPLATE: { - this.state = 86; + this.state = 92; this.match(ExpressionAntlrParser.TEMPLATE); } break; case ExpressionAntlrParser.TEXT_CONTENT: { - this.state = 87; + this.state = 93; this.textContent(); } break; @@ -626,11 +646,11 @@ export class ExpressionAntlrParser extends Parser { throw new NoViableAltException(this); } } - this.state = 90; + this.state = 96; this._errHandler.sync(this); _la = this._input.LA(1); } while (((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (ExpressionAntlrParser.TEMPLATE - 31)) | (1 << (ExpressionAntlrParser.ESCAPE_CHARACTER - 31)) | (1 << (ExpressionAntlrParser.TEXT_CONTENT - 31)))) !== 0)); - this.state = 92; + this.state = 98; this.match(ExpressionAntlrParser.STRING_INTERPOLATION_START); } } @@ -656,7 +676,7 @@ export class ExpressionAntlrParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 95; + this.state = 101; this._errHandler.sync(this); _alt = 1; do { @@ -664,7 +684,7 @@ export class ExpressionAntlrParser extends Parser { case 1: { { - this.state = 94; + this.state = 100; this.match(ExpressionAntlrParser.TEXT_CONTENT); } } @@ -672,9 +692,9 @@ export class ExpressionAntlrParser extends Parser { default: throw new NoViableAltException(this); } - this.state = 97; + this.state = 103; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 10, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 12, this._ctx); } while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER); } } @@ -700,21 +720,21 @@ export class ExpressionAntlrParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 99; + this.state = 105; this.expression(0); - this.state = 104; + this.state = 110; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === ExpressionAntlrParser.COMMA) { { { - this.state = 100; + this.state = 106; this.match(ExpressionAntlrParser.COMMA); - this.state = 101; + this.state = 107; this.expression(0); } } - this.state = 106; + this.state = 112; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -788,54 +808,57 @@ export class ExpressionAntlrParser extends Parser { } public static readonly _serializedATN: string = - "\x03\uAF6F\u8320\u479D\uB75C\u4880\u1605\u191C\uAB37\x03#n\x04\x02\t\x02" + + "\x03\uAF6F\u8320\u479D\uB75C\u4880\u1605\u191C\uAB37\x03#t\x04\x02\t\x02" + "\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07\t\x07" + "\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x05\x03\x16\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\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\x05\x030\n\x03\x03" + - "\x03\x07\x033\n\x03\f\x03\x0E\x036\v\x03\x03\x04\x03\x04\x03\x04\x03\x04" + - "\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x05\x04B\n\x04\x03\x04" + - "\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x05\x04J\n\x04\x03\x04\x03\x04" + - "\x03\x04\x03\x04\x03\x04\x03\x04\x07\x04R\n\x04\f\x04\x0E\x04U\v\x04\x03" + - "\x05\x03\x05\x03\x05\x03\x05\x06\x05[\n\x05\r\x05\x0E\x05\\\x03\x05\x03" + - "\x05\x03\x06\x06\x06b\n\x06\r\x06\x0E\x06c\x03\x07\x03\x07\x03\x07\x07" + - "\x07i\n\x07\f\x07\x0E\x07l\v\x07\x03\x07\x02\x02\x04\x04\x06\b\x02\x02" + - "\x04\x02\x06\x02\b\x02\n\x02\f\x02\x02\x07\x03\x02\x04\x06\x03\x02\b\n" + - "\x03\x02\x04\x05\x03\x02\v\f\x03\x02\x10\x13\x7F\x02\x0E\x03\x02\x02\x02" + - "\x04\x15\x03\x02\x02\x02\x06A\x03\x02\x02\x02\bV\x03\x02\x02\x02\na\x03" + - "\x02\x02\x02\fe\x03\x02\x02\x02\x0E\x0F\x05\x04\x03\x02\x0F\x10\x07\x02" + - "\x02\x03\x10\x03\x03\x02\x02\x02\x11\x12\b\x03\x01\x02\x12\x13\t\x02\x02" + - "\x02\x13\x16\x05\x04\x03\f\x14\x16\x05\x06\x04\x02\x15\x11\x03\x02\x02" + - "\x02\x15\x14\x03\x02\x02\x02\x164\x03\x02\x02\x02\x17\x18\f\v\x02\x02" + - "\x18\x19\x07\x07\x02\x02\x193\x05\x04\x03\v\x1A\x1B\f\n\x02\x02\x1B\x1C" + - "\t\x03\x02\x02\x1C3\x05\x04\x03\v\x1D\x1E\f\t\x02\x02\x1E\x1F\t\x04\x02" + - "\x02\x1F3\x05\x04\x03\n !\f\b\x02\x02!\"\t\x05\x02\x02\"3\x05\x04\x03" + - "\t#$\f\x07\x02\x02$%\x07\r\x02\x02%3\x05\x04\x03\b&\'\f\x06\x02\x02\'" + - "(\t\x06\x02\x02(3\x05\x04\x03\x07)*\f\x05\x02\x02*+\x07\x0E\x02\x02+3" + - "\x05\x04\x03\x06,-\f\x04\x02\x02-/\x07\x0F\x02\x02.0\x07\x02\x02\x03/" + - ".\x03\x02\x02\x02/0\x03\x02\x02\x0201\x03\x02\x02\x0213\x05\x04\x03\x05" + - "2\x17\x03\x02\x02\x022\x1A\x03\x02\x02\x022\x1D\x03\x02\x02\x022 \x03" + - "\x02\x02\x022#\x03\x02\x02\x022&\x03\x02\x02\x022)\x03\x02\x02\x022,\x03" + - "\x02\x02\x0236\x03\x02\x02\x0242\x03\x02\x02\x0245\x03\x02\x02\x025\x05" + - "\x03\x02\x02\x0264\x03\x02\x02\x0278\b\x04\x01\x0289\x07\x14\x02\x029" + - ":\x05\x04\x03\x02:;\x07\x15\x02\x02;B\x03\x02\x02\x02B\x07\x1E\x02\x02?B\x07\x1C\x02\x02@B\x05\b\x05\x02" + - "A7\x03\x02\x02\x02A<\x03\x02\x02\x02A=\x03\x02\x02\x02A>\x03\x02\x02\x02" + - "A?\x03\x02\x02\x02A@\x03\x02\x02\x02BS\x03\x02\x02\x02CD\f\x05\x02\x02" + - "DE\x07\x16\x02\x02ER\x07\x1C\x02\x02FG\f\x04\x02\x02GI\x07\x14\x02\x02" + - "HJ\x05\f\x07\x02IH\x03\x02\x02\x02IJ\x03\x02\x02\x02JK\x03\x02\x02\x02" + - "KR\x07\x15\x02\x02LM\f\x03\x02\x02MN\x07\x17\x02\x02NO\x05\x04\x03\x02" + - "OP\x07\x18\x02\x02PR\x03\x02\x02\x02QC\x03\x02\x02\x02QF\x03\x02\x02\x02" + - "QL\x03\x02\x02\x02RU\x03\x02\x02\x02SQ\x03\x02\x02\x02ST\x03\x02\x02\x02" + - "T\x07\x03\x02\x02\x02US\x03\x02\x02\x02VZ\x07\x03\x02\x02W[\x07\"\x02" + - "\x02X[\x07!\x02\x02Y[\x05\n\x06\x02ZW\x03\x02\x02\x02ZX\x03\x02\x02\x02" + - "ZY\x03\x02\x02\x02[\\\x03\x02\x02\x02\\Z\x03\x02\x02\x02\\]\x03\x02\x02" + - "\x02]^\x03\x02\x02\x02^_\x07\x03\x02\x02_\t\x03\x02\x02\x02`b\x07#\x02" + - "\x02a`\x03\x02\x02\x02bc\x03\x02\x02\x02ca\x03\x02\x02\x02cd\x03\x02\x02" + - "\x02d\v\x03\x02\x02\x02ej\x05\x04\x03\x02fg\x07\x19\x02\x02gi\x05\x04" + - "\x03\x02hf\x03\x02\x02\x02il\x03\x02\x02\x02jh\x03\x02\x02\x02jk\x03\x02" + - "\x02\x02k\r\x03\x02\x02\x02lj\x03\x02\x02\x02\x0E\x15/24AIQSZ\\cj"; + "\x03\x03\x03\x03\x03\x03\x03\x05\x036\n\x03\x03\x03\x07\x039\n\x03\f\x03" + + "\x0E\x03<\v\x03\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" + + "\x03\x04\x03\x04\x03\x04\x05\x04H\n\x04\x03\x04\x03\x04\x03\x04\x03\x04" + + "\x03\x04\x03\x04\x05\x04P\n\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" + + "\x03\x04\x07\x04X\n\x04\f\x04\x0E\x04[\v\x04\x03\x05\x03\x05\x03\x05\x03" + + "\x05\x06\x05a\n\x05\r\x05\x0E\x05b\x03\x05\x03\x05\x03\x06\x06\x06h\n" + + "\x06\r\x06\x0E\x06i\x03\x07\x03\x07\x03\x07\x07\x07o\n\x07\f\x07\x0E\x07" + + "r\v\x07\x03\x07\x02\x02\x04\x04\x06\b\x02\x02\x04\x02\x06\x02\b\x02\n" + + "\x02\f\x02\x02\x07\x03\x02\x04\x06\x03\x02\b\n\x03\x02\x04\x05\x03\x02" + + "\v\f\x03\x02\x10\x13\x87\x02\x0E\x03\x02\x02\x02\x04\x15\x03\x02\x02\x02" + + "\x06G\x03\x02\x02\x02\b\\\x03\x02\x02\x02\ng\x03\x02\x02\x02\fk\x03\x02" + + "\x02\x02\x0E\x0F\x05\x04\x03\x02\x0F\x10\x07\x02\x02\x03\x10\x03\x03\x02" + + "\x02\x02\x11\x12\b\x03\x01\x02\x12\x13\t\x02\x02\x02\x13\x16\x05\x04\x03" + + "\f\x14\x16\x05\x06\x04\x02\x15\x11\x03\x02\x02\x02\x15\x14\x03\x02\x02" + + "\x02\x16:\x03\x02\x02\x02\x17\x18\f\v\x02\x02\x18\x19\x07\x07\x02\x02" + + "\x199\x05\x04\x03\v\x1A\x1B\f\n\x02\x02\x1B\x1C\t\x03\x02\x02\x1C9\x05" + + "\x04\x03\v\x1D\x1E\f\t\x02\x02\x1E\x1F\t\x04\x02\x02\x1F9\x05\x04\x03" + + "\n !\f\b\x02\x02!\"\t\x05\x02\x02\"9\x05\x04\x03\t#$\f\x07\x02\x02$&\x07" + + "\r\x02\x02%\'\x07\x1D\x02\x02&%\x03\x02\x02\x02&\'\x03\x02\x02\x02\'(" + + "\x03\x02\x02\x02(9\x05\x04\x03\b)*\f\x06\x02\x02*+\t\x06\x02\x02+9\x05" + + "\x04\x03\x07,-\f\x05\x02\x02-/\x07\x0E\x02\x02.0\x07\x1D\x02\x02/.\x03" + + "\x02\x02\x02/0\x03\x02\x02\x0201\x03\x02\x02\x0219\x05\x04\x03\x0623\f" + + "\x04\x02\x0235\x07\x0F\x02\x0246\x07\x1D\x02\x0254\x03\x02\x02\x0256\x03" + + "\x02\x02\x0267\x03\x02\x02\x0279\x05\x04\x03\x058\x17\x03\x02\x02\x02" + + "8\x1A\x03\x02\x02\x028\x1D\x03\x02\x02\x028 \x03\x02\x02\x028#\x03\x02" + + "\x02\x028)\x03\x02\x02\x028,\x03\x02\x02\x0282\x03\x02\x02\x029<\x03\x02" + + "\x02\x02:8\x03\x02\x02\x02:;\x03\x02\x02\x02;\x05\x03\x02\x02\x02<:\x03" + + "\x02\x02\x02=>\b\x04\x01\x02>?\x07\x14\x02\x02?@\x05\x04\x03\x02@A\x07" + + "\x15\x02\x02AH\x03\x02\x02\x02BH\x07\x1F\x02\x02CH\x07\x1A\x02\x02DH\x07" + + "\x1E\x02\x02EH\x07\x1C\x02\x02FH\x05\b\x05\x02G=\x03\x02\x02\x02GB\x03" + + "\x02\x02\x02GC\x03\x02\x02\x02GD\x03\x02\x02\x02GE\x03\x02\x02\x02GF\x03" + + "\x02\x02\x02HY\x03\x02\x02\x02IJ\f\x05\x02\x02JK\x07\x16\x02\x02KX\x07" + + "\x1C\x02\x02LM\f\x04\x02\x02MO\x07\x14\x02\x02NP\x05\f\x07\x02ON\x03\x02" + + "\x02\x02OP\x03\x02\x02\x02PQ\x03\x02\x02\x02QX\x07\x15\x02\x02RS\f\x03" + + "\x02\x02ST\x07\x17\x02\x02TU\x05\x04\x03\x02UV\x07\x18\x02\x02VX\x03\x02" + + "\x02\x02WI\x03\x02\x02\x02WL\x03\x02\x02\x02WR\x03\x02\x02\x02X[\x03\x02" + + "\x02\x02YW\x03\x02\x02\x02YZ\x03\x02\x02\x02Z\x07\x03\x02\x02\x02[Y\x03" + + "\x02\x02\x02\\`\x07\x03\x02\x02]a\x07\"\x02\x02^a\x07!\x02\x02_a\x05\n" + + "\x06\x02`]\x03\x02\x02\x02`^\x03\x02\x02\x02`_\x03\x02\x02\x02ab\x03\x02" + + "\x02\x02b`\x03\x02\x02\x02bc\x03\x02\x02\x02cd\x03\x02\x02\x02de\x07\x03" + + "\x02\x02e\t\x03\x02\x02\x02fh\x07#\x02\x02gf\x03\x02\x02\x02hi\x03\x02" + + "\x02\x02ig\x03\x02\x02\x02ij\x03\x02\x02\x02j\v\x03\x02\x02\x02kp\x05" + + "\x04\x03\x02lm\x07\x19\x02\x02mo\x05\x04\x03\x02nl\x03\x02\x02\x02or\x03" + + "\x02\x02\x02pn\x03\x02\x02\x02pq\x03\x02\x02\x02q\r\x03\x02\x02\x02rp" + + "\x03\x02\x02\x02\x10\x15&/58:GOWY`bip"; public static __ATN: ATN; public static get _ATN(): ATN { if (!ExpressionAntlrParser.__ATN) { @@ -941,13 +964,13 @@ export class BinaryOpExpContext extends ExpressionContext { public DOUBLE_EQUAL(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.DOUBLE_EQUAL, 0); } public NOT_EQUAL(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.NOT_EQUAL, 0); } public SINGLE_AND(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.SINGLE_AND, 0); } + public NEWLINE(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.NEWLINE, 0); } public LESS_THAN(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.LESS_THAN, 0); } public LESS_OR_EQUAl(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.LESS_OR_EQUAl, 0); } public MORE_THAN(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.MORE_THAN, 0); } public MORE_OR_EQUAL(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.MORE_OR_EQUAL, 0); } public DOUBLE_AND(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.DOUBLE_AND, 0); } public DOUBLE_VERTICAL_CYLINDER(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.DOUBLE_VERTICAL_CYLINDER, 0); } - public EOF(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.EOF, 0); } constructor(ctx: ExpressionContext) { super(ctx.parent, ctx.invokingState); this.copyFrom(ctx); diff --git a/libraries/adaptive-expressions/tests/badExpression.test.js b/libraries/adaptive-expressions/tests/badExpression.test.js index 073ae20da5..40480c8961 100644 --- a/libraries/adaptive-expressions/tests/badExpression.test.js +++ b/libraries/adaptive-expressions/tests/badExpression.test.js @@ -343,7 +343,16 @@ const badExpressions = // SetPathToValue tests 'setPathToValue(2+3, 4)', // Not a real path - 'setPathToValue(a)' // Missing value + 'setPathToValue(a)', // Missing value + + //Type Checking + 'isString(hello, hello)', // should have one parameter + 'isInteger(one, hello)', // should have one parameter + 'isFloat(1.324, hello)', // should have one parameter + 'isArray(createArrat(1,2,3), hello)', // should have one parameter + 'isBoolean(true, false)', // should have one parameter + 'isDateTime("2018-03-15T13:00:00.111Z", hello)', // should have one parameter + 'isObject({}, false)', // should have one parameter ]; const scope = { diff --git a/libraries/adaptive-expressions/tests/expressionParser.test.js b/libraries/adaptive-expressions/tests/expressionParser.test.js index 7364e7d7c5..1cfe2a389c 100644 --- a/libraries/adaptive-expressions/tests/expressionParser.test.js +++ b/libraries/adaptive-expressions/tests/expressionParser.test.js @@ -74,10 +74,14 @@ const dataSource = [ ['float(5.5) <= float(4 - 1)', false], ['\'string\'&\'builder\'', 'stringbuilder'], ['"string"&"builder"', 'stringbuilder'], + ['"string"&\n"builder"', 'stringbuilder'], + ['"string"&\r\n"builder"', 'stringbuilder'], ['one > 0.5 && two < 2.5', true, oneTwo], ['notThere > 4', false], ['float(5.5) && float(0.0)', true], ['hello && "hello"', true], + ['hello &&\n "hello"', true], + ['hello &&\r\n "hello"', true], ['items || ((2 + 2) <= (4 - 1))', true], // true || false ['0 || false', true], // true || false ['0 ||\n false', true], // true || false @@ -515,6 +519,24 @@ const dataSource = [ ['isMatch("a", "\\\\w{1}")', true], // "\w" (match [a-zA-Z0-9_]) ['isMatch("1", "\\\\d{1}")', true], // "\d" (match [0-9]) + //Type Checking Tests + ['isString(hello)', true], + ['isString("Monday")', true], + ['isString(one)', false], + ['isInteger(one)', true], + ['isInteger(1)', true], + ['isInteger(1.23)', false], + ['isFloat(one)', false], + ['isFloat(1)', false], + ['isFloat(1.23)', true], + ['isArray(hello)', false], + ['isArray(createArray(1,2,3))', true], + ['isObject(hello)', false], + ['isObject(dialog)', true], + ['isBoolean(hello)', false], + ['isBoolean(1 == one)', true], + ['isDateTime(hello)', false], + ['isDateTime(timestamp)', true], // Empty expression ['', ''], diff --git a/libraries/botbuilder-lg/src/LGFileLexer.g4 b/libraries/botbuilder-lg/src/LGFileLexer.g4 index 0e9608f22f..f7901b9904 100644 --- a/libraries/botbuilder-lg/src/LGFileLexer.g4 +++ b/libraries/botbuilder-lg/src/LGFileLexer.g4 @@ -46,7 +46,7 @@ fragment STRING_LITERAL : ('\'' (~['\r\n])* '\'') | ('"' (~["\r\n])* '"'); fragment STRING_INTERPOLATION : '`' ('\\`' | ~'`')* '`'; -fragment EXPRESSION_FRAGMENT : '$' '{' (STRING_LITERAL | STRING_INTERPOLATION | EMPTY_OBJECT | ~[\r\n{}'"`] )+ '}'?; +fragment EXPRESSION_FRAGMENT : '$' '{' (STRING_LITERAL | STRING_INTERPOLATION | EMPTY_OBJECT | ~[{}'"`] )+ '}'?; fragment ESCAPE_CHARACTER_FRAGMENT : '\\' ~[\r\n]?; diff --git a/libraries/botbuilder-lg/src/generated/LGFileLexer.ts b/libraries/botbuilder-lg/src/generated/LGFileLexer.ts index eedb60a114..c87fbb693e 100644 --- a/libraries/botbuilder-lg/src/generated/LGFileLexer.ts +++ b/libraries/botbuilder-lg/src/generated/LGFileLexer.ts @@ -1,4 +1,4 @@ -// Generated from ../LGFileLexer.g4 by ANTLR 4.6-SNAPSHOT +// Generated from LGFileLexer.g4 by ANTLR 4.6-SNAPSHOT import { ATN } from "antlr4ts/atn/ATN"; @@ -662,87 +662,87 @@ export class LGFileLexer extends Lexer { ".\b\x02\x03\x04\x05\x06\x07\x19\x04\x02CCcc\x04\x02EEee\x04\x02FFff\x04" + "\x02GGgg\x04\x02HHhh\x04\x02JJjj\x04\x02KKkk\x04\x02NNnn\x04\x02UUuu\x04" + "\x02VVvv\x04\x02WWww\x04\x02YYyy\x04\x02C\\c|\x06\x02\v\v\"\"\xA2\xA2" + - "\uFF01\uFF01\x05\x02\f\f\x0F\x0F))\x05\x02\f\f\x0F\x0F$$\x03\x02bb\t\x02" + - "\f\f\x0F\x0F$$))bb}}\x7F\x7F\x04\x02\f\f\x0F\x0F\x06\x02\f\f\x0F\x0F]" + - "]__\x05\x02\f\f\x0F\x0F*+\x04\x02//aa\x04\x02/0aa\u0286\x020\x03\x02\x02" + - "\x02\x022\x03\x02\x02\x02\x024\x03\x02\x02\x02\x026\x03\x02\x02\x02\x02" + - "8\x03\x02\x02\x02\x02:\x03\x02\x02\x02\x02<\x03\x02\x02\x02\x02>\x03\x02" + - "\x02\x02\x02@\x03\x02\x02\x02\x03B\x03\x02\x02\x02\x03D\x03\x02\x02\x02" + - "\x03F\x03\x02\x02\x02\x03H\x03\x02\x02\x02\x03J\x03\x02\x02\x02\x03L\x03" + - "\x02\x02\x02\x03N\x03\x02\x02\x02\x03P\x03\x02\x02\x02\x04R\x03\x02\x02" + - "\x02\x04T\x03\x02\x02\x02\x04V\x03\x02\x02\x02\x04X\x03\x02\x02\x02\x04" + - "Z\x03\x02\x02\x02\x04\\\x03\x02\x02\x02\x04^\x03\x02\x02\x02\x04`\x03" + - "\x02\x02\x02\x04b\x03\x02\x02\x02\x04d\x03\x02\x02\x02\x04f\x03\x02\x02" + - "\x02\x04h\x03\x02\x02\x02\x05j\x03\x02\x02\x02\x05l\x03\x02\x02\x02\x05" + - "n\x03\x02\x02\x02\x05p\x03\x02\x02\x02\x06r\x03\x02\x02\x02\x06t\x03\x02" + - "\x02\x02\x06v\x03\x02\x02\x02\x06x\x03\x02\x02\x02\x07z\x03\x02\x02\x02" + - "\x07|\x03\x02\x02\x02\x07~\x03\x02\x02\x02\x07\x80\x03\x02\x02\x02\x07" + - "\x82\x03\x02\x02\x02\x07\x84\x03\x02\x02\x02\x07\x86\x03\x02\x02\x02\x07" + - "\x88\x03\x02\x02\x02\x07\x8A\x03\x02\x02\x02\x07\x8C\x03\x02\x02\x02\b" + - "\x8E\x03\x02\x02\x02\n\x90\x03\x02\x02\x02\f\x92\x03\x02\x02\x02\x0E\x94" + - "\x03\x02\x02\x02\x10\x96\x03\x02\x02\x02\x12\x98\x03\x02\x02\x02\x14\x9A" + - "\x03\x02\x02\x02\x16\x9C\x03\x02\x02\x02\x18\x9E\x03\x02\x02\x02\x1A\xA0" + - "\x03\x02\x02\x02\x1C\xA2\x03\x02\x02\x02\x1E\xA4\x03\x02\x02\x02 \xA6" + - "\x03\x02\x02\x02\"\xA8\x03\x02\x02\x02$\xAA\x03\x02\x02\x02&\xAC\x03\x02" + - "\x02\x02(\xC5\x03\x02\x02\x02*\xC7\x03\x02\x02\x02,\xD2\x03\x02\x02\x02" + - ".\xDF\x03\x02\x02\x020\xE3\x03\x02\x02\x022\xF2\x03\x02\x02\x024\xFC\x03" + - "\x02\x02\x026\u0103\x03\x02\x02\x028\u0109\x03\x02\x02\x02:\u010E\x03" + - "\x02\x02\x02<\u0114\x03\x02\x02\x02>\u0119\x03\x02\x02\x02@\u012B\x03" + - "\x02\x02\x02B\u012F\x03\x02\x02\x02D\u0136\x03\x02\x02\x02F\u0141\x03" + - "\x02\x02\x02H\u014B\x03\x02\x02\x02J\u014D\x03\x02\x02\x02L\u014F\x03" + - "\x02\x02\x02N\u0151\x03\x02\x02\x02P\u0154\x03\x02\x02\x02R\u0159\x03" + - "\x02\x02\x02T\u0161\x03\x02\x02\x02V\u016B\x03\x02\x02\x02X\u0173\x03" + - "\x02\x02\x02Z\u017F\x03\x02\x02\x02\\\u0195\x03\x02\x02\x02^\u01A3\x03" + - "\x02\x02\x02`\u01B3\x03\x02\x02\x02b\u01C1\x03\x02\x02\x02d\u01D2\x03" + - "\x02\x02\x02f\u01D5\x03\x02\x02\x02h\u01D9\x03\x02\x02\x02j\u01DF\x03" + - "\x02\x02\x02l\u01E7\x03\x02\x02\x02n\u01EB\x03\x02\x02\x02p\u01F4\x03" + - "\x02\x02\x02r\u01FB\x03\x02\x02\x02t\u0202\x03\x02\x02\x02v\u020E\x03" + - "\x02\x02\x02x\u0219\x03\x02\x02\x02z\u021D\x03\x02\x02\x02|\u022D\x03" + - "\x02\x02\x02~\u0236\x03\x02\x02\x02\x80\u023B\x03\x02\x02\x02\x82\u0245" + - "\x03\x02\x02\x02\x84\u0252\x03\x02\x02\x02\x86\u0256\x03\x02\x02\x02\x88" + - "\u0259\x03\x02\x02\x02\x8A\u025C\x03\x02\x02\x02\x8C\u0260\x03\x02\x02" + - "\x02\x8E\x8F\t\x02\x02\x02\x8F\t\x03\x02\x02\x02\x90\x91\t\x03\x02\x02" + - "\x91\v\x03\x02\x02\x02\x92\x93\t\x04\x02\x02\x93\r\x03\x02\x02\x02\x94" + - "\x95\t\x05\x02\x02\x95\x0F\x03\x02\x02\x02\x96\x97\t\x06\x02\x02\x97\x11" + - "\x03\x02\x02\x02\x98\x99\t\x07\x02\x02\x99\x13\x03\x02\x02\x02\x9A\x9B" + - "\t\b\x02\x02\x9B\x15\x03\x02\x02\x02\x9C\x9D\t\t\x02\x02\x9D\x17\x03\x02" + - "\x02\x02\x9E\x9F\t\n\x02\x02\x9F\x19\x03\x02\x02\x02\xA0\xA1\t\v\x02\x02" + - "\xA1\x1B\x03\x02\x02\x02\xA2\xA3\t\f\x02\x02\xA3\x1D\x03\x02\x02\x02\xA4" + - "\xA5\t\r\x02\x02\xA5\x1F\x03\x02\x02\x02\xA6\xA7\t\x0E\x02\x02\xA7!\x03" + - "\x02\x02\x02\xA8\xA9\x042;\x02\xA9#\x03\x02\x02\x02\xAA\xAB\t\x0F\x02" + - "\x02\xAB%\x03\x02\x02\x02\xAC\xB0\x07}\x02\x02\xAD\xAF\x05$\x10\x02\xAE" + - "\xAD\x03\x02\x02\x02\xAF\xB2\x03\x02\x02\x02\xB0\xAE\x03\x02\x02\x02\xB0" + - "\xB1\x03\x02\x02\x02\xB1\xB3\x03\x02\x02\x02\xB2\xB0\x03\x02\x02\x02\xB3" + - "\xB4\x07\x7F\x02\x02\xB4\'\x03\x02\x02\x02\xB5\xB9\x07)\x02\x02\xB6\xB8" + - "\n\x10\x02\x02\xB7\xB6\x03\x02\x02\x02\xB8\xBB\x03\x02\x02\x02\xB9\xB7" + - "\x03\x02\x02\x02\xB9\xBA\x03\x02\x02\x02\xBA\xBC\x03\x02\x02\x02\xBB\xB9" + - "\x03\x02\x02\x02\xBC\xC6\x07)\x02\x02\xBD\xC1\x07$\x02\x02\xBE\xC0\n\x11" + - "\x02\x02\xBF\xBE\x03\x02\x02\x02\xC0\xC3\x03\x02\x02\x02\xC1\xBF\x03\x02" + - "\x02\x02\xC1\xC2\x03\x02\x02\x02\xC2\xC4\x03\x02\x02\x02\xC3\xC1\x03\x02" + - "\x02\x02\xC4\xC6\x07$\x02\x02\xC5\xB5\x03\x02\x02\x02\xC5\xBD\x03\x02" + - "\x02\x02\xC6)\x03\x02\x02\x02\xC7\xCD\x07b\x02\x02\xC8\xC9\x07^\x02\x02" + - "\xC9\xCC\x07b\x02\x02\xCA\xCC\n\x12\x02\x02\xCB\xC8\x03\x02\x02\x02\xCB" + - "\xCA\x03\x02\x02\x02\xCC\xCF\x03\x02\x02\x02\xCD\xCB\x03\x02\x02\x02\xCD" + - "\xCE\x03\x02\x02\x02\xCE\xD0\x03\x02\x02\x02\xCF\xCD\x03\x02\x02\x02\xD0" + - "\xD1\x07b\x02\x02\xD1+\x03\x02\x02\x02\xD2\xD3\x07&\x02\x02\xD3\xD8\x07" + - "}\x02\x02\xD4\xD9\x05(\x12\x02\xD5\xD9\x05*\x13\x02\xD6\xD9\x05&\x11\x02" + - "\xD7\xD9\n\x13\x02\x02\xD8\xD4\x03\x02\x02\x02\xD8\xD5\x03\x02\x02\x02" + - "\xD8\xD6\x03\x02\x02\x02\xD8\xD7\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02" + - "\xDA\xD8\x03\x02\x02\x02\xDA\xDB\x03\x02\x02\x02\xDB\xDD\x03\x02\x02\x02" + - "\xDC\xDE\x07\x7F\x02\x02\xDD\xDC\x03\x02\x02\x02\xDD\xDE\x03\x02\x02\x02" + - "\xDE-\x03\x02\x02\x02\xDF\xE1\x07^\x02\x02\xE0\xE2\n\x14\x02\x02\xE1\xE0" + - "\x03\x02\x02\x02\xE1\xE2\x03\x02\x02\x02\xE2/\x03\x02\x02\x02\xE3\xE7" + - "\x07@\x02\x02\xE4\xE6\x05$\x10\x02\xE5\xE4\x03\x02\x02\x02\xE6\xE9\x03" + - "\x02\x02\x02\xE7\xE5\x03\x02\x02\x02\xE7\xE8\x03\x02\x02\x02\xE8\xEA\x03" + - "\x02\x02\x02\xE9\xE7\x03\x02\x02\x02\xEA\xEB\x07#\x02\x02\xEB\xEC\x07" + - "%\x02\x02\xEC\xEE\x03\x02\x02\x02\xED\xEF\n\x14\x02\x02\xEE\xED\x03\x02" + - "\x02\x02\xEF\xF0\x03\x02\x02\x02\xF0\xEE\x03\x02\x02\x02\xF0\xF1\x03\x02" + - "\x02\x02\xF11\x03\x02\x02\x02\xF2\xF6\x07@\x02\x02\xF3\xF5\n\x14\x02\x02" + - "\xF4\xF3\x03\x02\x02\x02\xF5\xF8\x03\x02\x02\x02\xF6\xF4\x03\x02\x02\x02" + - "\xF6\xF7\x03\x02\x02\x02\xF7\xF9\x03\x02\x02\x02\xF8\xF6\x03\x02\x02\x02" + - "\xF9\xFA\b\x17\x02\x02\xFA3\x03\x02\x02\x02\xFB\xFD\x05$\x10\x02\xFC\xFB" + - "\x03\x02\x02\x02\xFD\xFE\x03\x02\x02\x02\xFE\xFC\x03\x02\x02\x02\xFE\xFF" + - "\x03\x02\x02\x02\xFF\u0100\x03\x02\x02\x02\u0100\u0101\b\x18\x02\x02\u0101" + + "\uFF01\uFF01\x05\x02\f\f\x0F\x0F))\x05\x02\f\f\x0F\x0F$$\x03\x02bb\x07" + + "\x02$$))bb}}\x7F\x7F\x04\x02\f\f\x0F\x0F\x06\x02\f\f\x0F\x0F]]__\x05\x02" + + "\f\f\x0F\x0F*+\x04\x02//aa\x04\x02/0aa\u0286\x020\x03\x02\x02\x02\x02" + + "2\x03\x02\x02\x02\x024\x03\x02\x02\x02\x026\x03\x02\x02\x02\x028\x03\x02" + + "\x02\x02\x02:\x03\x02\x02\x02\x02<\x03\x02\x02\x02\x02>\x03\x02\x02\x02" + + "\x02@\x03\x02\x02\x02\x03B\x03\x02\x02\x02\x03D\x03\x02\x02\x02\x03F\x03" + + "\x02\x02\x02\x03H\x03\x02\x02\x02\x03J\x03\x02\x02\x02\x03L\x03\x02\x02" + + "\x02\x03N\x03\x02\x02\x02\x03P\x03\x02\x02\x02\x04R\x03\x02\x02\x02\x04" + + "T\x03\x02\x02\x02\x04V\x03\x02\x02\x02\x04X\x03\x02\x02\x02\x04Z\x03\x02" + + "\x02\x02\x04\\\x03\x02\x02\x02\x04^\x03\x02\x02\x02\x04`\x03\x02\x02\x02" + + "\x04b\x03\x02\x02\x02\x04d\x03\x02\x02\x02\x04f\x03\x02\x02\x02\x04h\x03" + + "\x02\x02\x02\x05j\x03\x02\x02\x02\x05l\x03\x02\x02\x02\x05n\x03\x02\x02" + + "\x02\x05p\x03\x02\x02\x02\x06r\x03\x02\x02\x02\x06t\x03\x02\x02\x02\x06" + + "v\x03\x02\x02\x02\x06x\x03\x02\x02\x02\x07z\x03\x02\x02\x02\x07|\x03\x02" + + "\x02\x02\x07~\x03\x02\x02\x02\x07\x80\x03\x02\x02\x02\x07\x82\x03\x02" + + "\x02\x02\x07\x84\x03\x02\x02\x02\x07\x86\x03\x02\x02\x02\x07\x88\x03\x02" + + "\x02\x02\x07\x8A\x03\x02\x02\x02\x07\x8C\x03\x02\x02\x02\b\x8E\x03\x02" + + "\x02\x02\n\x90\x03\x02\x02\x02\f\x92\x03\x02\x02\x02\x0E\x94\x03\x02\x02" + + "\x02\x10\x96\x03\x02\x02\x02\x12\x98\x03\x02\x02\x02\x14\x9A\x03\x02\x02" + + "\x02\x16\x9C\x03\x02\x02\x02\x18\x9E\x03\x02\x02\x02\x1A\xA0\x03\x02\x02" + + "\x02\x1C\xA2\x03\x02\x02\x02\x1E\xA4\x03\x02\x02\x02 \xA6\x03\x02\x02" + + "\x02\"\xA8\x03\x02\x02\x02$\xAA\x03\x02\x02\x02&\xAC\x03\x02\x02\x02(" + + "\xC5\x03\x02\x02\x02*\xC7\x03\x02\x02\x02,\xD2\x03\x02\x02\x02.\xDF\x03" + + "\x02\x02\x020\xE3\x03\x02\x02\x022\xF2\x03\x02\x02\x024\xFC\x03\x02\x02" + + "\x026\u0103\x03\x02\x02\x028\u0109\x03\x02\x02\x02:\u010E\x03\x02\x02" + + "\x02<\u0114\x03\x02\x02\x02>\u0119\x03\x02\x02\x02@\u012B\x03\x02\x02" + + "\x02B\u012F\x03\x02\x02\x02D\u0136\x03\x02\x02\x02F\u0141\x03\x02\x02" + + "\x02H\u014B\x03\x02\x02\x02J\u014D\x03\x02\x02\x02L\u014F\x03\x02\x02" + + "\x02N\u0151\x03\x02\x02\x02P\u0154\x03\x02\x02\x02R\u0159\x03\x02\x02" + + "\x02T\u0161\x03\x02\x02\x02V\u016B\x03\x02\x02\x02X\u0173\x03\x02\x02" + + "\x02Z\u017F\x03\x02\x02\x02\\\u0195\x03\x02\x02\x02^\u01A3\x03\x02\x02" + + "\x02`\u01B3\x03\x02\x02\x02b\u01C1\x03\x02\x02\x02d\u01D2\x03\x02\x02" + + "\x02f\u01D5\x03\x02\x02\x02h\u01D9\x03\x02\x02\x02j\u01DF\x03\x02\x02" + + "\x02l\u01E7\x03\x02\x02\x02n\u01EB\x03\x02\x02\x02p\u01F4\x03\x02\x02" + + "\x02r\u01FB\x03\x02\x02\x02t\u0202\x03\x02\x02\x02v\u020E\x03\x02\x02" + + "\x02x\u0219\x03\x02\x02\x02z\u021D\x03\x02\x02\x02|\u022D\x03\x02\x02" + + "\x02~\u0236\x03\x02\x02\x02\x80\u023B\x03\x02\x02\x02\x82\u0245\x03\x02" + + "\x02\x02\x84\u0252\x03\x02\x02\x02\x86\u0256\x03\x02\x02\x02\x88\u0259" + + "\x03\x02\x02\x02\x8A\u025C\x03\x02\x02\x02\x8C\u0260\x03\x02\x02\x02\x8E" + + "\x8F\t\x02\x02\x02\x8F\t\x03\x02\x02\x02\x90\x91\t\x03\x02\x02\x91\v\x03" + + "\x02\x02\x02\x92\x93\t\x04\x02\x02\x93\r\x03\x02\x02\x02\x94\x95\t\x05" + + "\x02\x02\x95\x0F\x03\x02\x02\x02\x96\x97\t\x06\x02\x02\x97\x11\x03\x02" + + "\x02\x02\x98\x99\t\x07\x02\x02\x99\x13\x03\x02\x02\x02\x9A\x9B\t\b\x02" + + "\x02\x9B\x15\x03\x02\x02\x02\x9C\x9D\t\t\x02\x02\x9D\x17\x03\x02\x02\x02" + + "\x9E\x9F\t\n\x02\x02\x9F\x19\x03\x02\x02\x02\xA0\xA1\t\v\x02\x02\xA1\x1B" + + "\x03\x02\x02\x02\xA2\xA3\t\f\x02\x02\xA3\x1D\x03\x02\x02\x02\xA4\xA5\t" + + "\r\x02\x02\xA5\x1F\x03\x02\x02\x02\xA6\xA7\t\x0E\x02\x02\xA7!\x03\x02" + + "\x02\x02\xA8\xA9\x042;\x02\xA9#\x03\x02\x02\x02\xAA\xAB\t\x0F\x02\x02" + + "\xAB%\x03\x02\x02\x02\xAC\xB0\x07}\x02\x02\xAD\xAF\x05$\x10\x02\xAE\xAD" + + "\x03\x02\x02\x02\xAF\xB2\x03\x02\x02\x02\xB0\xAE\x03\x02\x02\x02\xB0\xB1" + + "\x03\x02\x02\x02\xB1\xB3\x03\x02\x02\x02\xB2\xB0\x03\x02\x02\x02\xB3\xB4" + + "\x07\x7F\x02\x02\xB4\'\x03\x02\x02\x02\xB5\xB9\x07)\x02\x02\xB6\xB8\n" + + "\x10\x02\x02\xB7\xB6\x03\x02\x02\x02\xB8\xBB\x03\x02\x02\x02\xB9\xB7\x03" + + "\x02\x02\x02\xB9\xBA\x03\x02\x02\x02\xBA\xBC\x03\x02\x02\x02\xBB\xB9\x03" + + "\x02\x02\x02\xBC\xC6\x07)\x02\x02\xBD\xC1\x07$\x02\x02\xBE\xC0\n\x11\x02" + + "\x02\xBF\xBE\x03\x02\x02\x02\xC0\xC3\x03\x02\x02\x02\xC1\xBF\x03\x02\x02" + + "\x02\xC1\xC2\x03\x02\x02\x02\xC2\xC4\x03\x02\x02\x02\xC3\xC1\x03\x02\x02" + + "\x02\xC4\xC6\x07$\x02\x02\xC5\xB5\x03\x02\x02\x02\xC5\xBD\x03\x02\x02" + + "\x02\xC6)\x03\x02\x02\x02\xC7\xCD\x07b\x02\x02\xC8\xC9\x07^\x02\x02\xC9" + + "\xCC\x07b\x02\x02\xCA\xCC\n\x12\x02\x02\xCB\xC8\x03\x02\x02\x02\xCB\xCA" + + "\x03\x02\x02\x02\xCC\xCF\x03\x02\x02\x02\xCD\xCB\x03\x02\x02\x02\xCD\xCE" + + "\x03\x02\x02\x02\xCE\xD0\x03\x02\x02\x02\xCF\xCD\x03\x02\x02\x02\xD0\xD1" + + "\x07b\x02\x02\xD1+\x03\x02\x02\x02\xD2\xD3\x07&\x02\x02\xD3\xD8\x07}\x02" + + "\x02\xD4\xD9\x05(\x12\x02\xD5\xD9\x05*\x13\x02\xD6\xD9\x05&\x11\x02\xD7" + + "\xD9\n\x13\x02\x02\xD8\xD4\x03\x02\x02\x02\xD8\xD5\x03\x02\x02\x02\xD8" + + "\xD6\x03\x02\x02\x02\xD8\xD7\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA" + + "\xD8\x03\x02\x02\x02\xDA\xDB\x03\x02\x02\x02\xDB\xDD\x03\x02\x02\x02\xDC" + + "\xDE\x07\x7F\x02\x02\xDD\xDC\x03\x02\x02\x02\xDD\xDE\x03\x02\x02\x02\xDE" + + "-\x03\x02\x02\x02\xDF\xE1\x07^\x02\x02\xE0\xE2\n\x14\x02\x02\xE1\xE0\x03" + + "\x02\x02\x02\xE1\xE2\x03\x02\x02\x02\xE2/\x03\x02\x02\x02\xE3\xE7\x07" + + "@\x02\x02\xE4\xE6\x05$\x10\x02\xE5\xE4\x03\x02\x02\x02\xE6\xE9\x03\x02" + + "\x02\x02\xE7\xE5\x03\x02\x02\x02\xE7\xE8\x03\x02\x02\x02\xE8\xEA\x03\x02" + + "\x02\x02\xE9\xE7\x03\x02\x02\x02\xEA\xEB\x07#\x02\x02\xEB\xEC\x07%\x02" + + "\x02\xEC\xEE\x03\x02\x02\x02\xED\xEF\n\x14\x02\x02\xEE\xED\x03\x02\x02" + + "\x02\xEF\xF0\x03\x02\x02\x02\xF0\xEE\x03\x02\x02\x02\xF0\xF1\x03\x02\x02" + + "\x02\xF11\x03\x02\x02\x02\xF2\xF6\x07@\x02\x02\xF3\xF5\n\x14\x02\x02\xF4" + + "\xF3\x03\x02\x02\x02\xF5\xF8\x03\x02\x02\x02\xF6\xF4\x03\x02\x02\x02\xF6" + + "\xF7\x03\x02\x02\x02\xF7\xF9\x03\x02\x02\x02\xF8\xF6\x03\x02\x02\x02\xF9" + + "\xFA\b\x17\x02\x02\xFA3\x03\x02\x02\x02\xFB\xFD\x05$\x10\x02\xFC\xFB\x03" + + "\x02\x02\x02\xFD\xFE\x03\x02\x02\x02\xFE\xFC\x03\x02\x02\x02\xFE\xFF\x03" + + "\x02\x02\x02\xFF\u0100\x03\x02\x02\x02\u0100\u0101\b\x18\x02\x02\u0101" + "5\x03\x02\x02\x02\u0102\u0104\x07\x0F\x02\x02\u0103\u0102\x03\x02\x02" + "\x02\u0103\u0104\x03\x02\x02\x02\u0104\u0105\x03\x02\x02\x02\u0105\u0106" + "\x07\f\x02\x02\u0106\u0107\x03\x02\x02\x02\u0107\u0108\b\x19\x02\x02\u0108" + @@ -855,51 +855,51 @@ export class LGFileLexer extends Lexer { "\u020D\x03\x02\x02\x02\u020F\u0215\x03\x02\x02\x02\u0210\u0214\x05 \x0E" + "\x02\u0211\u0214\x05\"\x0F\x02\u0212\u0214\t\x18\x02\x02\u0213\u0210\x03" + "\x02\x02\x02\u0213\u0211\x03\x02\x02\x02\u0213\u0212\x03\x02\x02\x02\u0214" + - "\u0217\x03\x02\x02\x02\u0215\u0213"; + "\u0217\x03\x02\x02\x02\u0215\u0213\x03\x02\x02\x02"; private static readonly _serializedATNSegment1: string = - "\x03\x02\x02\x02\u0215\u0216\x03\x02\x02\x02\u0216w\x03\x02\x02\x02\u0217" + - "\u0215\x03\x02\x02\x02\u0218\u021A\n\x14\x02\x02\u0219\u0218\x03\x02\x02" + - "\x02\u021A\u021B\x03\x02\x02\x02\u021B\u021C\x03\x02\x02\x02\u021B\u0219" + - "\x03\x02\x02\x02\u021Cy\x03\x02\x02\x02\u021D\u0221\x07@\x02\x02\u021E" + - "\u0220\n\x14\x02\x02\u021F\u021E\x03\x02\x02\x02\u0220\u0223\x03\x02\x02" + - "\x02\u0221\u021F\x03\x02\x02\x02\u0221\u0222\x03\x02\x02\x02\u0222\u0225" + - "\x03\x02\x02\x02\u0223\u0221\x03\x02\x02\x02\u0224\u0226\x07\x0F\x02\x02" + - "\u0225\u0224\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226\u0227\x03" + - "\x02\x02\x02\u0227\u0228\x07\f\x02\x02\u0228\u0229\x06;\f\x02\u0229\u022A" + - "\x03\x02\x02\x02\u022A\u022B\b;\x02\x02\u022B{\x03\x02\x02\x02\u022C\u022E" + - "\x05$\x10\x02\u022D\u022C\x03\x02\x02\x02\u022E\u022F\x03\x02\x02\x02" + - "\u022F\u022D\x03\x02\x02\x02\u022F\u0230\x03\x02\x02\x02\u0230\u0231\x03" + - "\x02\x02\x02\u0231\u0232\x06<\r\x02\u0232\u0233\x03\x02\x02\x02\u0233" + - "\u0234\b<\x02\x02\u0234}\x03\x02\x02\x02\u0235\u0237\x07\x0F\x02\x02\u0236" + - "\u0235\x03\x02\x02\x02\u0236\u0237\x03\x02\x02\x02\u0237\u0238\x03\x02" + - "\x02\x02\u0238\u0239\x07\f\x02\x02\u0239\u023A\b=\x1F\x02\u023A\x7F\x03" + - "\x02\x02\x02\u023B\u023C\x07_\x02\x02\u023C\u023D\x06>\x0E\x02\u023D\u023E" + - "\b> \x02\u023E\u023F\x03\x02\x02\x02\u023F\u0240\b>\v\x02\u0240\u0241" + - "\b>\v\x02\u0241\x81\x03\x02\x02\x02\u0242\u0246\x05 \x0E\x02\u0243\u0246" + - "\x05\"\x0F\x02\u0244\u0246\x07a\x02\x02\u0245\u0242\x03\x02\x02\x02\u0245" + - "\u0243\x03\x02\x02\x02\u0245\u0244\x03\x02\x02\x02\u0246\u024C\x03\x02" + - "\x02\x02\u0247\u024B\x05 \x0E\x02\u0248\u024B\x05\"\x0F\x02\u0249\u024B" + - "\t\x18\x02\x02\u024A\u0247\x03\x02\x02\x02\u024A\u0248\x03\x02\x02\x02" + - "\u024A\u0249\x03\x02\x02\x02\u024B\u024E\x03\x02\x02\x02\u024C\u024A\x03" + - "\x02\x02\x02\u024C\u024D\x03\x02\x02\x02\u024D\u024F\x03\x02\x02\x02\u024E" + - "\u024C\x03\x02\x02\x02\u024F\u0250\x06?\x0F\x02\u0250\u0251\b?!\x02\u0251" + - "\x83\x03\x02\x02\x02\u0252\u0253\x07?\x02\x02\u0253\u0254\x06@\x10\x02" + - "\u0254\u0255\b@\"\x02\u0255\x85\x03\x02\x02\x02\u0256\u0257\x07~\x02\x02" + - "\u0257\u0258\bA#\x02\u0258\x87\x03\x02\x02\x02\u0259\u025A\x05.\x15\x02" + - "\u025A\u025B\bB$\x02\u025B\x89\x03\x02\x02\x02\u025C\u025D\x05,\x14\x02" + - "\u025D\u025E\bC%\x02\u025E\x8B\x03\x02\x02\x02\u025F\u0261\n\x14\x02\x02" + - "\u0260\u025F\x03\x02\x02\x02\u0261\u0262\x03\x02\x02\x02\u0262\u0263\x03" + - "\x02\x02\x02\u0262\u0260\x03\x02\x02\x02\u0263\u0264\x03\x02\x02\x02\u0264" + - "\u0265\bD&\x02\u0265\x8D\x03\x02\x02\x02:\x02\x03\x04\x05\x06\x07\xB0" + - "\xB9\xC1\xC5\xCB\xCD\xD8\xDA\xDD\xE1\xE7\xF0\xF6\xFE\u0103\u011D\u0125" + - "\u0131\u0136\u0141\u0146\u0148\u0156\u015B\u016B\u0178\u0186\u018E\u019C" + - "\u01AC\u01BA\u01CB\u01DB\u01F0\u01F4\u01F6\u01FD\u0202\u020E\u0213\u0215" + - "\u021B\u0221\u0225\u022F\u0236\u0245\u024A\u024C\u0262\'\b\x02\x02\x03" + - "\x1A\x02\x07\x03\x02\x03\x1B\x03\x07\x04\x02\x07\x06\x02\x03\x1D\x04\x03" + - "\x1E\x05\x03 \x06\x06\x02\x02\x03(\x07\x07\x05\x02\x03)\b\x03*\t\x03+" + - "\n\x03,\v\x03-\f\x03.\r\x03/\x0E\x030\x0F\x031\x10\x032\x11\x033\x12\t" + - "\x1D\x02\t\x1E\x02\t\x1F\x02\x038\x13\x038\x14\x07\x07\x02\x03=\x15\x03" + - ">\x16\x03?\x17\x03@\x18\x03A\x19\x03B\x1A\x03C\x1B\x03D\x1C"; + "\u0215\u0216\x03\x02\x02\x02\u0216w\x03\x02\x02\x02\u0217\u0215\x03\x02" + + "\x02\x02\u0218\u021A\n\x14\x02\x02\u0219\u0218\x03\x02\x02\x02\u021A\u021B" + + "\x03\x02\x02\x02\u021B\u021C\x03\x02\x02\x02\u021B\u0219\x03\x02\x02\x02" + + "\u021Cy\x03\x02\x02\x02\u021D\u0221\x07@\x02\x02\u021E\u0220\n\x14\x02" + + "\x02\u021F\u021E\x03\x02\x02\x02\u0220\u0223\x03\x02\x02\x02\u0221\u021F" + + "\x03\x02\x02\x02\u0221\u0222\x03\x02\x02\x02\u0222\u0225\x03\x02\x02\x02" + + "\u0223\u0221\x03\x02\x02\x02\u0224\u0226\x07\x0F\x02\x02\u0225\u0224\x03" + + "\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226\u0227\x03\x02\x02\x02\u0227" + + "\u0228\x07\f\x02\x02\u0228\u0229\x06;\f\x02\u0229\u022A\x03\x02\x02\x02" + + "\u022A\u022B\b;\x02\x02\u022B{\x03\x02\x02\x02\u022C\u022E\x05$\x10\x02" + + "\u022D\u022C\x03\x02\x02\x02\u022E\u022F\x03\x02\x02\x02\u022F\u022D\x03" + + "\x02\x02\x02\u022F\u0230\x03\x02\x02\x02\u0230\u0231\x03\x02\x02\x02\u0231" + + "\u0232\x06<\r\x02\u0232\u0233\x03\x02\x02\x02\u0233\u0234\b<\x02\x02\u0234" + + "}\x03\x02\x02\x02\u0235\u0237\x07\x0F\x02\x02\u0236\u0235\x03\x02\x02" + + "\x02\u0236\u0237\x03\x02\x02\x02\u0237\u0238\x03\x02\x02\x02\u0238\u0239" + + "\x07\f\x02\x02\u0239\u023A\b=\x1F\x02\u023A\x7F\x03\x02\x02\x02\u023B" + + "\u023C\x07_\x02\x02\u023C\u023D\x06>\x0E\x02\u023D\u023E\b> \x02\u023E" + + "\u023F\x03\x02\x02\x02\u023F\u0240\b>\v\x02\u0240\u0241\b>\v\x02\u0241" + + "\x81\x03\x02\x02\x02\u0242\u0246\x05 \x0E\x02\u0243\u0246\x05\"\x0F\x02" + + "\u0244\u0246\x07a\x02\x02\u0245\u0242\x03\x02\x02\x02\u0245\u0243\x03" + + "\x02\x02\x02\u0245\u0244\x03\x02\x02\x02\u0246\u024C\x03\x02\x02\x02\u0247" + + "\u024B\x05 \x0E\x02\u0248\u024B\x05\"\x0F\x02\u0249\u024B\t\x18\x02\x02" + + "\u024A\u0247\x03\x02\x02\x02\u024A\u0248\x03\x02\x02\x02\u024A\u0249\x03" + + "\x02\x02\x02\u024B\u024E\x03\x02\x02\x02\u024C\u024A\x03\x02\x02\x02\u024C" + + "\u024D\x03\x02\x02\x02\u024D\u024F\x03\x02\x02\x02\u024E\u024C\x03\x02" + + "\x02\x02\u024F\u0250\x06?\x0F\x02\u0250\u0251\b?!\x02\u0251\x83\x03\x02" + + "\x02\x02\u0252\u0253\x07?\x02\x02\u0253\u0254\x06@\x10\x02\u0254\u0255" + + "\b@\"\x02\u0255\x85\x03\x02\x02\x02\u0256\u0257\x07~\x02\x02\u0257\u0258" + + "\bA#\x02\u0258\x87\x03\x02\x02\x02\u0259\u025A\x05.\x15\x02\u025A\u025B" + + "\bB$\x02\u025B\x89\x03\x02\x02\x02\u025C\u025D\x05,\x14\x02\u025D\u025E" + + "\bC%\x02\u025E\x8B\x03\x02\x02\x02\u025F\u0261\n\x14\x02\x02\u0260\u025F" + + "\x03\x02\x02\x02\u0261\u0262\x03\x02\x02\x02\u0262\u0263\x03\x02\x02\x02" + + "\u0262\u0260\x03\x02\x02\x02\u0263\u0264\x03\x02\x02\x02\u0264\u0265\b" + + "D&\x02\u0265\x8D\x03\x02\x02\x02:\x02\x03\x04\x05\x06\x07\xB0\xB9\xC1" + + "\xC5\xCB\xCD\xD8\xDA\xDD\xE1\xE7\xF0\xF6\xFE\u0103\u011D\u0125\u0131\u0136" + + "\u0141\u0146\u0148\u0156\u015B\u016B\u0178\u0186\u018E\u019C\u01AC\u01BA" + + "\u01CB\u01DB\u01F0\u01F4\u01F6\u01FD\u0202\u020E\u0213\u0215\u021B\u0221" + + "\u0225\u022F\u0236\u0245\u024A\u024C\u0262\'\b\x02\x02\x03\x1A\x02\x07" + + "\x03\x02\x03\x1B\x03\x07\x04\x02\x07\x06\x02\x03\x1D\x04\x03\x1E\x05\x03" + + " \x06\x06\x02\x02\x03(\x07\x07\x05\x02\x03)\b\x03*\t\x03+\n\x03,\v\x03" + + "-\f\x03.\r\x03/\x0E\x030\x0F\x031\x10\x032\x11\x033\x12\t\x1D\x02\t\x1E" + + "\x02\t\x1F\x02\x038\x13\x038\x14\x07\x07\x02\x03=\x15\x03>\x16\x03?\x17" + + "\x03@\x18\x03A\x19\x03B\x1A\x03C\x1B\x03D\x1C"; public static readonly _serializedATN: string = Utils.join( [ LGFileLexer._serializedATNSegment0, diff --git a/libraries/botbuilder-lg/src/generated/LGFileParser.ts b/libraries/botbuilder-lg/src/generated/LGFileParser.ts index c522c2823d..9213b281b7 100644 --- a/libraries/botbuilder-lg/src/generated/LGFileParser.ts +++ b/libraries/botbuilder-lg/src/generated/LGFileParser.ts @@ -1,4 +1,4 @@ -// Generated from ../LGFileParser.g4 by ANTLR 4.6-SNAPSHOT +// Generated from LGFileParser.g4 by ANTLR 4.6-SNAPSHOT import { ATN } from "antlr4ts/atn/ATN"; diff --git a/libraries/botbuilder-lg/src/generated/LGFileParserListener.ts b/libraries/botbuilder-lg/src/generated/LGFileParserListener.ts index c3e3b95239..6b9875c715 100644 --- a/libraries/botbuilder-lg/src/generated/LGFileParserListener.ts +++ b/libraries/botbuilder-lg/src/generated/LGFileParserListener.ts @@ -1,4 +1,4 @@ -// Generated from ../LGFileParser.g4 by ANTLR 4.6-SNAPSHOT +// Generated from LGFileParser.g4 by ANTLR 4.6-SNAPSHOT import { ParseTreeListener } from "antlr4ts/tree/ParseTreeListener"; diff --git a/libraries/botbuilder-lg/src/generated/LGFileParserVisitor.ts b/libraries/botbuilder-lg/src/generated/LGFileParserVisitor.ts index 4a64318c08..462741b782 100644 --- a/libraries/botbuilder-lg/src/generated/LGFileParserVisitor.ts +++ b/libraries/botbuilder-lg/src/generated/LGFileParserVisitor.ts @@ -1,4 +1,4 @@ -// Generated from ../LGFileParser.g4 by ANTLR 4.6-SNAPSHOT +// Generated from LGFileParser.g4 by ANTLR 4.6-SNAPSHOT import { ParseTreeVisitor } from "antlr4ts/tree/ParseTreeVisitor"; diff --git a/libraries/botbuilder-lg/tests/lg.test.js b/libraries/botbuilder-lg/tests/lg.test.js index d7b234e053..471dc27744 100644 --- a/libraries/botbuilder-lg/tests/lg.test.js +++ b/libraries/botbuilder-lg/tests/lg.test.js @@ -65,6 +65,9 @@ describe('LG', function() { evaled = templates.evaluate('time-of-day-readout-without-default2', { timeOfDay: 'evening' }); assert.strictEqual(evaled, undefined, `Evaled is ${ evaled } which should be undefined.`); + + evaled = templates.evaluate('time-of-day-with-two-expression', { timeOfDay: 'afternoon' }); + assert.strictEqual(evaled === 'GoodDay!' || evaled === 'How is going?', true, `Evaled is ${ evaled }`); }); it('TestBasicTemplateRefWithParameters', function() { diff --git a/libraries/botbuilder-lg/tests/testData/examples/5.lg b/libraries/botbuilder-lg/tests/testData/examples/5.lg index 8861c04ec6..4a9370f16e 100644 --- a/libraries/botbuilder-lg/tests/testData/examples/5.lg +++ b/libraries/botbuilder-lg/tests/testData/examples/5.lg @@ -42,4 +42,11 @@ # time-of-day-readout-without-default2 - IF: ${timeOfDay == 'morning'} - Good morning - - Morning! \ No newline at end of file + - Morning! + +> Conditional with multiline expressions +# time-of-day-with-two-expression +- IF: ${timeOfDay == 'morning' || + timeOfDay == 'afternoon'} + - GoodDay! + - How is going? \ No newline at end of file From ba19bdf7c824b2c1604ccc981f67eb5f5a44346b Mon Sep 17 00:00:00 2001 From: Shuai Wang Date: Mon, 16 Mar 2020 15:17:47 +0800 Subject: [PATCH 03/10] ensure more operators support multi line exprs --- .../src/parser/ExpressionAntlrParser.g4 | 20 +- .../parser/generated/ExpressionAntlrParser.ts | 340 +++++++++++------- .../tests/expressionParser.test.js | 19 + 3 files changed, 234 insertions(+), 145 deletions(-) diff --git a/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 b/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 index 0534372bee..ab6c3e2e6b 100644 --- a/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 +++ b/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 @@ -5,16 +5,16 @@ options { tokenVocab=ExpressionAntlrLexer; } file: expression EOF; expression - : (NON|SUBSTRACT|PLUS) expression #unaryOpExp - | expression XOR expression #binaryOpExp - | expression (ASTERISK|SLASH|PERCENT) expression #binaryOpExp - | expression (PLUS|SUBSTRACT) expression #binaryOpExp - | expression (DOUBLE_EQUAL|NOT_EQUAL) expression #binaryOpExp - | expression (SINGLE_AND) NEWLINE? expression #binaryOpExp - | expression (LESS_THAN|LESS_OR_EQUAl|MORE_THAN|MORE_OR_EQUAL) expression #binaryOpExp - | expression DOUBLE_AND NEWLINE? expression #binaryOpExp - | expression DOUBLE_VERTICAL_CYLINDER NEWLINE? expression #binaryOpExp - | primaryExpression #primaryExp + : (NON|SUBSTRACT|PLUS) NEWLINE? expression #unaryOpExp + | expression XOR NEWLINE? expression #binaryOpExp + | expression (ASTERISK|SLASH|PERCENT) NEWLINE? expression #binaryOpExp + | expression (PLUS|SUBSTRACT) NEWLINE? expression #binaryOpExp + | expression (DOUBLE_EQUAL|NOT_EQUAL) NEWLINE? expression #binaryOpExp + | expression (SINGLE_AND) NEWLINE? expression #binaryOpExp + | expression (LESS_THAN|LESS_OR_EQUAl|MORE_THAN|MORE_OR_EQUAL) NEWLINE? expression #binaryOpExp + | expression DOUBLE_AND NEWLINE? expression #binaryOpExp + | expression DOUBLE_VERTICAL_CYLINDER NEWLINE? expression #binaryOpExp + | primaryExpression #primaryExp ; primaryExpression diff --git a/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts b/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts index 7d473edb40..7f2ada425a 100644 --- a/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts +++ b/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts @@ -156,7 +156,7 @@ export class ExpressionAntlrParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 19; + this.state = 22; this._errHandler.sync(this); switch (this._input.LA(1)) { case ExpressionAntlrParser.PLUS: @@ -179,7 +179,17 @@ export class ExpressionAntlrParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 17; + this.state = 18; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === ExpressionAntlrParser.NEWLINE) { + { + this.state = 17; + this.match(ExpressionAntlrParser.NEWLINE); + } + } + + this.state = 20; this.expression(10); } break; @@ -193,7 +203,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new PrimaryExpContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 18; + this.state = 21; this.primaryExpression(0); } break; @@ -201,9 +211,9 @@ export class ExpressionAntlrParser extends Parser { throw new NoViableAltException(this); } this._ctx._stop = this._input.tryLT(-1); - this.state = 56; + this.state = 74; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 5, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 11, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -211,20 +221,30 @@ export class ExpressionAntlrParser extends Parser { } _prevctx = _localctx; { - this.state = 54; + this.state = 72; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 4, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 10, this._ctx) ) { case 1: { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 21; + this.state = 24; if (!(this.precpred(this._ctx, 9))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 9)"); } - this.state = 22; + this.state = 25; this.match(ExpressionAntlrParser.XOR); - this.state = 23; + this.state = 27; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === ExpressionAntlrParser.NEWLINE) { + { + this.state = 26; + this.match(ExpressionAntlrParser.NEWLINE); + } + } + + this.state = 29; this.expression(9); } break; @@ -233,11 +253,11 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 24; + this.state = 30; if (!(this.precpred(this._ctx, 8))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 8)"); } - this.state = 25; + this.state = 31; _la = this._input.LA(1); if (!((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ExpressionAntlrParser.ASTERISK) | (1 << ExpressionAntlrParser.SLASH) | (1 << ExpressionAntlrParser.PERCENT))) !== 0))) { this._errHandler.recoverInline(this); @@ -249,7 +269,17 @@ export class ExpressionAntlrParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 26; + this.state = 33; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === ExpressionAntlrParser.NEWLINE) { + { + this.state = 32; + this.match(ExpressionAntlrParser.NEWLINE); + } + } + + this.state = 35; this.expression(9); } break; @@ -258,11 +288,11 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 27; + this.state = 36; if (!(this.precpred(this._ctx, 7))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 7)"); } - this.state = 28; + this.state = 37; _la = this._input.LA(1); if (!(_la === ExpressionAntlrParser.PLUS || _la === ExpressionAntlrParser.SUBSTRACT)) { this._errHandler.recoverInline(this); @@ -274,7 +304,17 @@ export class ExpressionAntlrParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 29; + this.state = 39; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === ExpressionAntlrParser.NEWLINE) { + { + this.state = 38; + this.match(ExpressionAntlrParser.NEWLINE); + } + } + + this.state = 41; this.expression(8); } break; @@ -283,11 +323,11 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 30; + this.state = 42; if (!(this.precpred(this._ctx, 6))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 6)"); } - this.state = 31; + this.state = 43; _la = this._input.LA(1); if (!(_la === ExpressionAntlrParser.DOUBLE_EQUAL || _la === ExpressionAntlrParser.NOT_EQUAL)) { this._errHandler.recoverInline(this); @@ -299,7 +339,17 @@ export class ExpressionAntlrParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 32; + this.state = 45; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === ExpressionAntlrParser.NEWLINE) { + { + this.state = 44; + this.match(ExpressionAntlrParser.NEWLINE); + } + } + + this.state = 47; this.expression(7); } break; @@ -308,25 +358,25 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 33; + this.state = 48; if (!(this.precpred(this._ctx, 5))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } { - this.state = 34; + this.state = 49; this.match(ExpressionAntlrParser.SINGLE_AND); } - this.state = 36; + this.state = 51; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === ExpressionAntlrParser.NEWLINE) { { - this.state = 35; + this.state = 50; this.match(ExpressionAntlrParser.NEWLINE); } } - this.state = 38; + this.state = 53; this.expression(6); } break; @@ -335,11 +385,11 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 39; + this.state = 54; if (!(this.precpred(this._ctx, 4))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 40; + this.state = 55; _la = this._input.LA(1); if (!((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ExpressionAntlrParser.LESS_THAN) | (1 << ExpressionAntlrParser.MORE_THAN) | (1 << ExpressionAntlrParser.LESS_OR_EQUAl) | (1 << ExpressionAntlrParser.MORE_OR_EQUAL))) !== 0))) { this._errHandler.recoverInline(this); @@ -351,7 +401,17 @@ export class ExpressionAntlrParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 41; + this.state = 57; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === ExpressionAntlrParser.NEWLINE) { + { + this.state = 56; + this.match(ExpressionAntlrParser.NEWLINE); + } + } + + this.state = 59; this.expression(5); } break; @@ -360,23 +420,23 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 42; + this.state = 60; if (!(this.precpred(this._ctx, 3))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 43; + this.state = 61; this.match(ExpressionAntlrParser.DOUBLE_AND); - this.state = 45; + this.state = 63; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === ExpressionAntlrParser.NEWLINE) { { - this.state = 44; + this.state = 62; this.match(ExpressionAntlrParser.NEWLINE); } } - this.state = 47; + this.state = 65; this.expression(4); } break; @@ -385,32 +445,32 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 48; + this.state = 66; if (!(this.precpred(this._ctx, 2))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 49; + this.state = 67; this.match(ExpressionAntlrParser.DOUBLE_VERTICAL_CYLINDER); - this.state = 51; + this.state = 69; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === ExpressionAntlrParser.NEWLINE) { { - this.state = 50; + this.state = 68; this.match(ExpressionAntlrParser.NEWLINE); } } - this.state = 53; + this.state = 71; this.expression(3); } break; } } } - this.state = 58; + this.state = 76; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 5, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 11, this._ctx); } } } @@ -448,7 +508,7 @@ export class ExpressionAntlrParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 69; + this.state = 87; this._errHandler.sync(this); switch (this._input.LA(1)) { case ExpressionAntlrParser.OPEN_BRACKET: @@ -457,11 +517,11 @@ export class ExpressionAntlrParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 60; + this.state = 78; this.match(ExpressionAntlrParser.OPEN_BRACKET); - this.state = 61; + this.state = 79; this.expression(0); - this.state = 62; + this.state = 80; this.match(ExpressionAntlrParser.CLOSE_BRACKET); } break; @@ -470,7 +530,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new ConstantAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 64; + this.state = 82; this.match(ExpressionAntlrParser.CONSTANT); } break; @@ -479,7 +539,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new NumericAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 65; + this.state = 83; this.match(ExpressionAntlrParser.NUMBER); } break; @@ -488,7 +548,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new StringAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 66; + this.state = 84; this.match(ExpressionAntlrParser.STRING); } break; @@ -497,7 +557,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new IdAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 67; + this.state = 85; this.match(ExpressionAntlrParser.IDENTIFIER); } break; @@ -506,7 +566,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new StringInterpolationAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 68; + this.state = 86; this.stringInterpolation(); } break; @@ -514,9 +574,9 @@ export class ExpressionAntlrParser extends Parser { throw new NoViableAltException(this); } this._ctx._stop = this._input.tryLT(-1); - this.state = 87; + this.state = 105; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 9, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 15, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -524,20 +584,20 @@ export class ExpressionAntlrParser extends Parser { } _prevctx = _localctx; { - this.state = 85; + this.state = 103; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 8, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { case 1: { _localctx = new MemberAccessExpContext(new PrimaryExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_primaryExpression); - this.state = 71; + this.state = 89; if (!(this.precpred(this._ctx, 3))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 72; + this.state = 90; this.match(ExpressionAntlrParser.DOT); - this.state = 73; + this.state = 91; this.match(ExpressionAntlrParser.IDENTIFIER); } break; @@ -546,23 +606,23 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new FuncInvokeExpContext(new PrimaryExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_primaryExpression); - this.state = 74; + this.state = 92; if (!(this.precpred(this._ctx, 2))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 75; + this.state = 93; this.match(ExpressionAntlrParser.OPEN_BRACKET); - this.state = 77; + this.state = 95; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ExpressionAntlrParser.STRING_INTERPOLATION_START) | (1 << ExpressionAntlrParser.PLUS) | (1 << ExpressionAntlrParser.SUBSTRACT) | (1 << ExpressionAntlrParser.NON) | (1 << ExpressionAntlrParser.OPEN_BRACKET) | (1 << ExpressionAntlrParser.NUMBER) | (1 << ExpressionAntlrParser.IDENTIFIER) | (1 << ExpressionAntlrParser.STRING) | (1 << ExpressionAntlrParser.CONSTANT))) !== 0)) { { - this.state = 76; + this.state = 94; this.argsList(); } } - this.state = 79; + this.state = 97; this.match(ExpressionAntlrParser.CLOSE_BRACKET); } break; @@ -571,24 +631,24 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new IndexAccessExpContext(new PrimaryExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_primaryExpression); - this.state = 80; + this.state = 98; if (!(this.precpred(this._ctx, 1))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 81; + this.state = 99; this.match(ExpressionAntlrParser.OPEN_SQUARE_BRACKET); - this.state = 82; + this.state = 100; this.expression(0); - this.state = 83; + this.state = 101; this.match(ExpressionAntlrParser.CLOSE_SQUARE_BRACKET); } break; } } } - this.state = 89; + this.state = 107; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 9, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 15, this._ctx); } } } @@ -614,31 +674,31 @@ export class ExpressionAntlrParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 90; + this.state = 108; this.match(ExpressionAntlrParser.STRING_INTERPOLATION_START); - this.state = 94; + this.state = 112; this._errHandler.sync(this); _la = this._input.LA(1); do { { - this.state = 94; + this.state = 112; this._errHandler.sync(this); switch (this._input.LA(1)) { case ExpressionAntlrParser.ESCAPE_CHARACTER: { - this.state = 91; + this.state = 109; this.match(ExpressionAntlrParser.ESCAPE_CHARACTER); } break; case ExpressionAntlrParser.TEMPLATE: { - this.state = 92; + this.state = 110; this.match(ExpressionAntlrParser.TEMPLATE); } break; case ExpressionAntlrParser.TEXT_CONTENT: { - this.state = 93; + this.state = 111; this.textContent(); } break; @@ -646,11 +706,11 @@ export class ExpressionAntlrParser extends Parser { throw new NoViableAltException(this); } } - this.state = 96; + this.state = 114; this._errHandler.sync(this); _la = this._input.LA(1); } while (((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (ExpressionAntlrParser.TEMPLATE - 31)) | (1 << (ExpressionAntlrParser.ESCAPE_CHARACTER - 31)) | (1 << (ExpressionAntlrParser.TEXT_CONTENT - 31)))) !== 0)); - this.state = 98; + this.state = 116; this.match(ExpressionAntlrParser.STRING_INTERPOLATION_START); } } @@ -676,7 +736,7 @@ export class ExpressionAntlrParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 101; + this.state = 119; this._errHandler.sync(this); _alt = 1; do { @@ -684,7 +744,7 @@ export class ExpressionAntlrParser extends Parser { case 1: { { - this.state = 100; + this.state = 118; this.match(ExpressionAntlrParser.TEXT_CONTENT); } } @@ -692,9 +752,9 @@ export class ExpressionAntlrParser extends Parser { default: throw new NoViableAltException(this); } - this.state = 103; + this.state = 121; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 12, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 18, this._ctx); } while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER); } } @@ -720,21 +780,21 @@ export class ExpressionAntlrParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 105; + this.state = 123; this.expression(0); - this.state = 110; + this.state = 128; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === ExpressionAntlrParser.COMMA) { { { - this.state = 106; + this.state = 124; this.match(ExpressionAntlrParser.COMMA); - this.state = 107; + this.state = 125; this.expression(0); } } - this.state = 112; + this.state = 130; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -808,57 +868,66 @@ export class ExpressionAntlrParser extends Parser { } public static readonly _serializedATN: string = - "\x03\uAF6F\u8320\u479D\uB75C\u4880\u1605\u191C\uAB37\x03#t\x04\x02\t\x02" + - "\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07\t\x07" + - "\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x05\x03\x16\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\x05\x03\'\n\x03\x03" + - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x05\x030\n\x03\x03" + - "\x03\x03\x03\x03\x03\x03\x03\x05\x036\n\x03\x03\x03\x07\x039\n\x03\f\x03" + - "\x0E\x03<\v\x03\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" + - "\x03\x04\x03\x04\x03\x04\x05\x04H\n\x04\x03\x04\x03\x04\x03\x04\x03\x04" + - "\x03\x04\x03\x04\x05\x04P\n\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" + - "\x03\x04\x07\x04X\n\x04\f\x04\x0E\x04[\v\x04\x03\x05\x03\x05\x03\x05\x03" + - "\x05\x06\x05a\n\x05\r\x05\x0E\x05b\x03\x05\x03\x05\x03\x06\x06\x06h\n" + - "\x06\r\x06\x0E\x06i\x03\x07\x03\x07\x03\x07\x07\x07o\n\x07\f\x07\x0E\x07" + - "r\v\x07\x03\x07\x02\x02\x04\x04\x06\b\x02\x02\x04\x02\x06\x02\b\x02\n" + - "\x02\f\x02\x02\x07\x03\x02\x04\x06\x03\x02\b\n\x03\x02\x04\x05\x03\x02" + - "\v\f\x03\x02\x10\x13\x87\x02\x0E\x03\x02\x02\x02\x04\x15\x03\x02\x02\x02" + - "\x06G\x03\x02\x02\x02\b\\\x03\x02\x02\x02\ng\x03\x02\x02\x02\fk\x03\x02" + - "\x02\x02\x0E\x0F\x05\x04\x03\x02\x0F\x10\x07\x02\x02\x03\x10\x03\x03\x02" + - "\x02\x02\x11\x12\b\x03\x01\x02\x12\x13\t\x02\x02\x02\x13\x16\x05\x04\x03" + - "\f\x14\x16\x05\x06\x04\x02\x15\x11\x03\x02\x02\x02\x15\x14\x03\x02\x02" + - "\x02\x16:\x03\x02\x02\x02\x17\x18\f\v\x02\x02\x18\x19\x07\x07\x02\x02" + - "\x199\x05\x04\x03\v\x1A\x1B\f\n\x02\x02\x1B\x1C\t\x03\x02\x02\x1C9\x05" + - "\x04\x03\v\x1D\x1E\f\t\x02\x02\x1E\x1F\t\x04\x02\x02\x1F9\x05\x04\x03" + - "\n !\f\b\x02\x02!\"\t\x05\x02\x02\"9\x05\x04\x03\t#$\f\x07\x02\x02$&\x07" + - "\r\x02\x02%\'\x07\x1D\x02\x02&%\x03\x02\x02\x02&\'\x03\x02\x02\x02\'(" + - "\x03\x02\x02\x02(9\x05\x04\x03\b)*\f\x06\x02\x02*+\t\x06\x02\x02+9\x05" + - "\x04\x03\x07,-\f\x05\x02\x02-/\x07\x0E\x02\x02.0\x07\x1D\x02\x02/.\x03" + - "\x02\x02\x02/0\x03\x02\x02\x0201\x03\x02\x02\x0219\x05\x04\x03\x0623\f" + - "\x04\x02\x0235\x07\x0F\x02\x0246\x07\x1D\x02\x0254\x03\x02\x02\x0256\x03" + - "\x02\x02\x0267\x03\x02\x02\x0279\x05\x04\x03\x058\x17\x03\x02\x02\x02" + - "8\x1A\x03\x02\x02\x028\x1D\x03\x02\x02\x028 \x03\x02\x02\x028#\x03\x02" + - "\x02\x028)\x03\x02\x02\x028,\x03\x02\x02\x0282\x03\x02\x02\x029<\x03\x02" + - "\x02\x02:8\x03\x02\x02\x02:;\x03\x02\x02\x02;\x05\x03\x02\x02\x02<:\x03" + - "\x02\x02\x02=>\b\x04\x01\x02>?\x07\x14\x02\x02?@\x05\x04\x03\x02@A\x07" + - "\x15\x02\x02AH\x03\x02\x02\x02BH\x07\x1F\x02\x02CH\x07\x1A\x02\x02DH\x07" + - "\x1E\x02\x02EH\x07\x1C\x02\x02FH\x05\b\x05\x02G=\x03\x02\x02\x02GB\x03" + - "\x02\x02\x02GC\x03\x02\x02\x02GD\x03\x02\x02\x02GE\x03\x02\x02\x02GF\x03" + - "\x02\x02\x02HY\x03\x02\x02\x02IJ\f\x05\x02\x02JK\x07\x16\x02\x02KX\x07" + - "\x1C\x02\x02LM\f\x04\x02\x02MO\x07\x14\x02\x02NP\x05\f\x07\x02ON\x03\x02" + - "\x02\x02OP\x03\x02\x02\x02PQ\x03\x02\x02\x02QX\x07\x15\x02\x02RS\f\x03" + - "\x02\x02ST\x07\x17\x02\x02TU\x05\x04\x03\x02UV\x07\x18\x02\x02VX\x03\x02" + - "\x02\x02WI\x03\x02\x02\x02WL\x03\x02\x02\x02WR\x03\x02\x02\x02X[\x03\x02" + - "\x02\x02YW\x03\x02\x02\x02YZ\x03\x02\x02\x02Z\x07\x03\x02\x02\x02[Y\x03" + - "\x02\x02\x02\\`\x07\x03\x02\x02]a\x07\"\x02\x02^a\x07!\x02\x02_a\x05\n" + - "\x06\x02`]\x03\x02\x02\x02`^\x03\x02\x02\x02`_\x03\x02\x02\x02ab\x03\x02" + - "\x02\x02b`\x03\x02\x02\x02bc\x03\x02\x02\x02cd\x03\x02\x02\x02de\x07\x03" + - "\x02\x02e\t\x03\x02\x02\x02fh\x07#\x02\x02gf\x03\x02\x02\x02hi\x03\x02" + - "\x02\x02ig\x03\x02\x02\x02ij\x03\x02\x02\x02j\v\x03\x02\x02\x02kp\x05" + - "\x04\x03\x02lm\x07\x19\x02\x02mo\x05\x04\x03\x02nl\x03\x02\x02\x02or\x03" + - "\x02\x02\x02pn\x03\x02\x02\x02pq\x03\x02\x02\x02q\r\x03\x02\x02\x02rp" + - "\x03\x02\x02\x02\x10\x15&/58:GOWY`bip"; + "\x03\uAF6F\u8320\u479D\uB75C\u4880\u1605\u191C\uAB37\x03#\x86\x04\x02" + + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + + "\t\x07\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x05\x03\x15\n\x03" + + "\x03\x03\x03\x03\x05\x03\x19\n\x03\x03\x03\x03\x03\x03\x03\x05\x03\x1E" + + "\n\x03\x03\x03\x03\x03\x03\x03\x03\x03\x05\x03$\n\x03\x03\x03\x03\x03" + + "\x03\x03\x03\x03\x05\x03*\n\x03\x03\x03\x03\x03\x03\x03\x03\x03\x05\x03" + + "0\n\x03\x03\x03\x03\x03\x03\x03\x03\x03\x05\x036\n\x03\x03\x03\x03\x03" + + "\x03\x03\x03\x03\x05\x03<\n\x03\x03\x03\x03\x03\x03\x03\x03\x03\x05\x03" + + "B\n\x03\x03\x03\x03\x03\x03\x03\x03\x03\x05\x03H\n\x03\x03\x03\x07\x03" + + "K\n\x03\f\x03\x0E\x03N\v\x03\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" + + "\x04\x03\x04\x03\x04\x03\x04\x03\x04\x05\x04Z\n\x04\x03\x04\x03\x04\x03" + + "\x04\x03\x04\x03\x04\x03\x04\x05\x04b\n\x04\x03\x04\x03\x04\x03\x04\x03" + + "\x04\x03\x04\x03\x04\x07\x04j\n\x04\f\x04\x0E\x04m\v\x04\x03\x05\x03\x05" + + "\x03\x05\x03\x05\x06\x05s\n\x05\r\x05\x0E\x05t\x03\x05\x03\x05\x03\x06" + + "\x06\x06z\n\x06\r\x06\x0E\x06{\x03\x07\x03\x07\x03\x07\x07\x07\x81\n\x07" + + "\f\x07\x0E\x07\x84\v\x07\x03\x07\x02\x02\x04\x04\x06\b\x02\x02\x04\x02" + + "\x06\x02\b\x02\n\x02\f\x02\x02\x07\x03\x02\x04\x06\x03\x02\b\n\x03\x02" + + "\x04\x05\x03\x02\v\f\x03\x02\x10\x13\x9F\x02\x0E\x03\x02\x02\x02\x04\x18" + + "\x03\x02\x02\x02\x06Y\x03\x02\x02\x02\bn\x03\x02\x02\x02\ny\x03\x02\x02" + + "\x02\f}\x03\x02\x02\x02\x0E\x0F\x05\x04\x03\x02\x0F\x10\x07\x02\x02\x03" + + "\x10\x03\x03\x02\x02\x02\x11\x12\b\x03\x01\x02\x12\x14\t\x02\x02\x02\x13" + + "\x15\x07\x1D\x02\x02\x14\x13\x03\x02\x02\x02\x14\x15\x03\x02\x02\x02\x15" + + "\x16\x03\x02\x02\x02\x16\x19\x05\x04\x03\f\x17\x19\x05\x06\x04\x02\x18" + + "\x11\x03\x02\x02\x02\x18\x17\x03\x02\x02\x02\x19L\x03\x02\x02\x02\x1A" + + "\x1B\f\v\x02\x02\x1B\x1D\x07\x07\x02\x02\x1C\x1E\x07\x1D\x02\x02\x1D\x1C" + + "\x03\x02\x02\x02\x1D\x1E\x03\x02\x02\x02\x1E\x1F\x03\x02\x02\x02\x1FK" + + "\x05\x04\x03\v !\f\n\x02\x02!#\t\x03\x02\x02\"$\x07\x1D\x02\x02#\"\x03" + + "\x02\x02\x02#$\x03\x02\x02\x02$%\x03\x02\x02\x02%K\x05\x04\x03\v&\'\f" + + "\t\x02\x02\')\t\x04\x02\x02(*\x07\x1D\x02\x02)(\x03\x02\x02\x02)*\x03" + + "\x02\x02\x02*+\x03\x02\x02\x02+K\x05\x04\x03\n,-\f\b\x02\x02-/\t\x05\x02" + + "\x02.0\x07\x1D\x02\x02/.\x03\x02\x02\x02/0\x03\x02\x02\x0201\x03\x02\x02" + + "\x021K\x05\x04\x03\t23\f\x07\x02\x0235\x07\r\x02\x0246\x07\x1D\x02\x02" + + "54\x03\x02\x02\x0256\x03\x02\x02\x0267\x03\x02\x02\x027K\x05\x04\x03\b" + + "89\f\x06\x02\x029;\t\x06\x02\x02:<\x07\x1D\x02\x02;:\x03\x02\x02\x02;" + + "<\x03\x02\x02\x02<=\x03\x02\x02\x02=K\x05\x04\x03\x07>?\f\x05\x02\x02" + + "?A\x07\x0E\x02\x02@B\x07\x1D\x02\x02A@\x03\x02\x02\x02AB\x03\x02\x02\x02" + + "BC\x03\x02\x02\x02CK\x05\x04\x03\x06DE\f\x04\x02\x02EG\x07\x0F\x02\x02" + + "FH\x07\x1D\x02\x02GF\x03\x02\x02\x02GH\x03\x02\x02\x02HI\x03\x02\x02\x02" + + "IK\x05\x04\x03\x05J\x1A\x03\x02\x02\x02J \x03\x02\x02\x02J&\x03\x02\x02" + + "\x02J,\x03\x02\x02\x02J2\x03\x02\x02\x02J8\x03\x02\x02\x02J>\x03\x02\x02" + + "\x02JD\x03\x02\x02\x02KN\x03\x02\x02\x02LJ\x03\x02\x02\x02LM\x03\x02\x02" + + "\x02M\x05\x03\x02\x02\x02NL\x03\x02\x02\x02OP\b\x04\x01\x02PQ\x07\x14" + + "\x02\x02QR\x05\x04\x03\x02RS\x07\x15\x02\x02SZ\x03\x02\x02\x02TZ\x07\x1F" + + "\x02\x02UZ\x07\x1A\x02\x02VZ\x07\x1E\x02\x02WZ\x07\x1C\x02\x02XZ\x05\b" + + "\x05\x02YO\x03\x02\x02\x02YT\x03\x02\x02\x02YU\x03\x02\x02\x02YV\x03\x02" + + "\x02\x02YW\x03\x02\x02\x02YX\x03\x02\x02\x02Zk\x03\x02\x02\x02[\\\f\x05" + + "\x02\x02\\]\x07\x16\x02\x02]j\x07\x1C\x02\x02^_\f\x04\x02\x02_a\x07\x14" + + "\x02\x02`b\x05\f\x07\x02a`\x03\x02\x02\x02ab\x03\x02\x02\x02bc\x03\x02" + + "\x02\x02cj\x07\x15\x02\x02de\f\x03\x02\x02ef\x07\x17\x02\x02fg\x05\x04" + + "\x03\x02gh\x07\x18\x02\x02hj\x03\x02\x02\x02i[\x03\x02\x02\x02i^\x03\x02" + + "\x02\x02id\x03\x02\x02\x02jm\x03\x02\x02\x02ki\x03\x02\x02\x02kl\x03\x02" + + "\x02\x02l\x07\x03\x02\x02\x02mk\x03\x02\x02\x02nr\x07\x03\x02\x02os\x07" + + "\"\x02\x02ps\x07!\x02\x02qs\x05\n\x06\x02ro\x03\x02\x02\x02rp\x03\x02" + + "\x02\x02rq\x03\x02\x02\x02st\x03\x02\x02\x02tr\x03\x02\x02\x02tu\x03\x02" + + "\x02\x02uv\x03\x02\x02\x02vw\x07\x03\x02\x02w\t\x03\x02\x02\x02xz\x07" + + "#\x02\x02yx\x03\x02\x02\x02z{\x03\x02\x02\x02{y\x03\x02\x02\x02{|\x03" + + "\x02\x02\x02|\v\x03\x02\x02\x02}\x82\x05\x04\x03\x02~\x7F\x07\x19\x02" + + "\x02\x7F\x81\x05\x04\x03\x02\x80~\x03\x02\x02\x02\x81\x84\x03\x02\x02" + + "\x02\x82\x80\x03\x02\x02\x02\x82\x83\x03\x02\x02\x02\x83\r\x03\x02\x02" + + "\x02\x84\x82\x03\x02\x02\x02\x16\x14\x18\x1D#)/5;AGJLYaikrt{\x82"; public static __ATN: ATN; public static get _ATN(): ATN { if (!ExpressionAntlrParser.__ATN) { @@ -920,6 +989,7 @@ export class UnaryOpExpContext extends ExpressionContext { public NON(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.NON, 0); } public SUBSTRACT(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.SUBSTRACT, 0); } public PLUS(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.PLUS, 0); } + public NEWLINE(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.NEWLINE, 0); } constructor(ctx: ExpressionContext) { super(ctx.parent, ctx.invokingState); this.copyFrom(ctx); @@ -956,6 +1026,7 @@ export class BinaryOpExpContext extends ExpressionContext { } } public XOR(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.XOR, 0); } + public NEWLINE(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.NEWLINE, 0); } public ASTERISK(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.ASTERISK, 0); } public SLASH(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.SLASH, 0); } public PERCENT(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.PERCENT, 0); } @@ -964,7 +1035,6 @@ export class BinaryOpExpContext extends ExpressionContext { public DOUBLE_EQUAL(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.DOUBLE_EQUAL, 0); } public NOT_EQUAL(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.NOT_EQUAL, 0); } public SINGLE_AND(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.SINGLE_AND, 0); } - public NEWLINE(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.NEWLINE, 0); } public LESS_THAN(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.LESS_THAN, 0); } public LESS_OR_EQUAl(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.LESS_OR_EQUAl, 0); } public MORE_THAN(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.MORE_THAN, 0); } diff --git a/libraries/adaptive-expressions/tests/expressionParser.test.js b/libraries/adaptive-expressions/tests/expressionParser.test.js index 1cfe2a389c..5d88b08426 100644 --- a/libraries/adaptive-expressions/tests/expressionParser.test.js +++ b/libraries/adaptive-expressions/tests/expressionParser.test.js @@ -24,16 +24,25 @@ const dataSource = [ // Operators tests ['1 + 2', 3], + ['1 +\n 2', 3], + ['1 +\r\n 2', 3], ['- 1 + 2', 1], + ['-\r\n 1 + 2', 1], ['+ 1 + 2', 3], + ['+\r\n 1 + 2', 3], ['1 - 2', -1], + ['1 -\r\n 2', -1], ['1 - (-2)', 3], + ['1 - (\r\n-2)', 3], ['1.0 + 2.0', 3.0], ['1 * 2 + 3', 5], + ['1 *\r\n 2 + 3', 5], ['1 + 2 * 3', 7], ['4 / 2', 2], + ['4 /\r\n 2', 2], ['1 + 3 / 2', 2], ['(1 + 3) / 2', 2], + ['(1 +\r\n 3) / 2', 2], ['1 * (2 + 3)', 5], ['(1 + 2) * 3', 9], ['(one + two) * bag.three', 9.0, ['one', 'two', 'bag.three']], @@ -43,14 +52,20 @@ const dataSource = [ ['one + two + hello + one + two', '3hello12'], ['2^2', 4.0], + ['2^\r\n2', 4.0], + ['3^2^2', 81.0], + ['one >\r\n 0.5', true], ['one > 0.5 && two < 2.5', true], ['one > 0.5 || two < 1.5', true], ['5 % 2', 1], + ['5 %\r\n 2', 1], ['!(one == 1.0)', false], + ['!\r\n(one == 1.0)', false], ['!!(one == 1.0)', true], ['!exists(xione) || !!exists(two)', true], ['(1 + 2) == (4 - 1)', true], + ['(1 + 2) ==\r\n (4 - 1)', true], ['!!exists(one) == !!exists(one)', true], ['!(one == 1.0)', false, ['one']], ['!!(one == 1.0)', true, ['one']], @@ -61,6 +76,7 @@ const dataSource = [ ['hello == \'hello\'', true], ['hello == \'world\'', false], ['(1 + 2) != (4 - 1)', false], + ['(1 + 2) !=\r\n (4 - 1)', false], ['!!exists(one) != !!exists(one)', false], ['hello != \'hello\'', false], ['hello != \'world\'', true], @@ -68,9 +84,11 @@ const dataSource = [ ['hello != "world"', true], ['(1 + 2) >= (4 - 1)', true], ['(2 + 2) >= (4 - 1)', true], + ['(2 + 2) >=\r\n (4 - 1)', true], ['float(5.5) >= float(4 - 1)', true], ['(1 + 2) <= (4 - 1)', true], ['(2 + 2) <= (4 - 1)', false], + ['(2 + 2) <=\r\n (4 - 1)', false], ['float(5.5) <= float(4 - 1)', false], ['\'string\'&\'builder\'', 'stringbuilder'], ['"string"&"builder"', 'stringbuilder'], @@ -86,6 +104,7 @@ const dataSource = [ ['0 || false', true], // true || false ['0 ||\n false', true], // true || false ['0 ||\r\n false', true], // true || false + ['false ||\r\n false || \r\n true', true], // true || false ['!(hello)', false], // false ['!(10)', false], ['!(0)', false], From 5f6d143c6674e73663d5bc826d144f40489ff0ed Mon Sep 17 00:00:00 2001 From: Shuai Wang Date: Mon, 16 Mar 2020 15:52:01 +0800 Subject: [PATCH 04/10] revert ExpressionAntlrParser --- .../src/parser/ExpressionAntlrParser.g4 | 20 +- .../parser/generated/ExpressionAntlrParser.ts | 353 ++++++------------ .../tests/expressionParser.test.js | 1 + 3 files changed, 135 insertions(+), 239 deletions(-) diff --git a/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 b/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 index ab6c3e2e6b..a15d4a2ec4 100644 --- a/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 +++ b/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 @@ -5,16 +5,16 @@ options { tokenVocab=ExpressionAntlrLexer; } file: expression EOF; expression - : (NON|SUBSTRACT|PLUS) NEWLINE? expression #unaryOpExp - | expression XOR NEWLINE? expression #binaryOpExp - | expression (ASTERISK|SLASH|PERCENT) NEWLINE? expression #binaryOpExp - | expression (PLUS|SUBSTRACT) NEWLINE? expression #binaryOpExp - | expression (DOUBLE_EQUAL|NOT_EQUAL) NEWLINE? expression #binaryOpExp - | expression (SINGLE_AND) NEWLINE? expression #binaryOpExp - | expression (LESS_THAN|LESS_OR_EQUAl|MORE_THAN|MORE_OR_EQUAL) NEWLINE? expression #binaryOpExp - | expression DOUBLE_AND NEWLINE? expression #binaryOpExp - | expression DOUBLE_VERTICAL_CYLINDER NEWLINE? expression #binaryOpExp - | primaryExpression #primaryExp + : (NON|SUBSTRACT|PLUS) expression #unaryOpExp + | expression XOR expression #binaryOpExp + | expression (ASTERISK|SLASH|PERCENT) expression #binaryOpExp + | expression (PLUS|SUBSTRACT) expression #binaryOpExp + | expression (DOUBLE_EQUAL|NOT_EQUAL) expression #binaryOpExp + | expression (SINGLE_AND) expression #binaryOpExp + | expression (LESS_THAN|LESS_OR_EQUAl|MORE_THAN|MORE_OR_EQUAL) expression #binaryOpExp + | expression DOUBLE_AND expression #binaryOpExp + | expression DOUBLE_VERTICAL_CYLINDER expression #binaryOpExp + | primaryExpression #primaryExp ; primaryExpression diff --git a/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts b/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts index 7f2ada425a..7d055e60d3 100644 --- a/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts +++ b/libraries/adaptive-expressions/src/parser/generated/ExpressionAntlrParser.ts @@ -156,7 +156,7 @@ export class ExpressionAntlrParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 22; + this.state = 19; this._errHandler.sync(this); switch (this._input.LA(1)) { case ExpressionAntlrParser.PLUS: @@ -179,17 +179,7 @@ export class ExpressionAntlrParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 18; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === ExpressionAntlrParser.NEWLINE) { - { - this.state = 17; - this.match(ExpressionAntlrParser.NEWLINE); - } - } - - this.state = 20; + this.state = 17; this.expression(10); } break; @@ -203,7 +193,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new PrimaryExpContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 21; + this.state = 18; this.primaryExpression(0); } break; @@ -211,9 +201,9 @@ export class ExpressionAntlrParser extends Parser { throw new NoViableAltException(this); } this._ctx._stop = this._input.tryLT(-1); - this.state = 74; + this.state = 47; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 11, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 2, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -221,30 +211,20 @@ export class ExpressionAntlrParser extends Parser { } _prevctx = _localctx; { - this.state = 72; + this.state = 45; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 10, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 1, this._ctx) ) { case 1: { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 24; + this.state = 21; if (!(this.precpred(this._ctx, 9))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 9)"); } - this.state = 25; + this.state = 22; this.match(ExpressionAntlrParser.XOR); - this.state = 27; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === ExpressionAntlrParser.NEWLINE) { - { - this.state = 26; - this.match(ExpressionAntlrParser.NEWLINE); - } - } - - this.state = 29; + this.state = 23; this.expression(9); } break; @@ -253,11 +233,11 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 30; + this.state = 24; if (!(this.precpred(this._ctx, 8))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 8)"); } - this.state = 31; + this.state = 25; _la = this._input.LA(1); if (!((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ExpressionAntlrParser.ASTERISK) | (1 << ExpressionAntlrParser.SLASH) | (1 << ExpressionAntlrParser.PERCENT))) !== 0))) { this._errHandler.recoverInline(this); @@ -269,17 +249,7 @@ export class ExpressionAntlrParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 33; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === ExpressionAntlrParser.NEWLINE) { - { - this.state = 32; - this.match(ExpressionAntlrParser.NEWLINE); - } - } - - this.state = 35; + this.state = 26; this.expression(9); } break; @@ -288,11 +258,11 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 36; + this.state = 27; if (!(this.precpred(this._ctx, 7))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 7)"); } - this.state = 37; + this.state = 28; _la = this._input.LA(1); if (!(_la === ExpressionAntlrParser.PLUS || _la === ExpressionAntlrParser.SUBSTRACT)) { this._errHandler.recoverInline(this); @@ -304,17 +274,7 @@ export class ExpressionAntlrParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 39; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === ExpressionAntlrParser.NEWLINE) { - { - this.state = 38; - this.match(ExpressionAntlrParser.NEWLINE); - } - } - - this.state = 41; + this.state = 29; this.expression(8); } break; @@ -323,11 +283,11 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 42; + this.state = 30; if (!(this.precpred(this._ctx, 6))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 6)"); } - this.state = 43; + this.state = 31; _la = this._input.LA(1); if (!(_la === ExpressionAntlrParser.DOUBLE_EQUAL || _la === ExpressionAntlrParser.NOT_EQUAL)) { this._errHandler.recoverInline(this); @@ -339,17 +299,7 @@ export class ExpressionAntlrParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 45; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === ExpressionAntlrParser.NEWLINE) { - { - this.state = 44; - this.match(ExpressionAntlrParser.NEWLINE); - } - } - - this.state = 47; + this.state = 32; this.expression(7); } break; @@ -358,25 +308,15 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 48; + this.state = 33; if (!(this.precpred(this._ctx, 5))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } { - this.state = 49; + this.state = 34; this.match(ExpressionAntlrParser.SINGLE_AND); } - this.state = 51; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === ExpressionAntlrParser.NEWLINE) { - { - this.state = 50; - this.match(ExpressionAntlrParser.NEWLINE); - } - } - - this.state = 53; + this.state = 35; this.expression(6); } break; @@ -385,11 +325,11 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 54; + this.state = 36; if (!(this.precpred(this._ctx, 4))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 55; + this.state = 37; _la = this._input.LA(1); if (!((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ExpressionAntlrParser.LESS_THAN) | (1 << ExpressionAntlrParser.MORE_THAN) | (1 << ExpressionAntlrParser.LESS_OR_EQUAl) | (1 << ExpressionAntlrParser.MORE_OR_EQUAL))) !== 0))) { this._errHandler.recoverInline(this); @@ -401,17 +341,7 @@ export class ExpressionAntlrParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 57; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === ExpressionAntlrParser.NEWLINE) { - { - this.state = 56; - this.match(ExpressionAntlrParser.NEWLINE); - } - } - - this.state = 59; + this.state = 38; this.expression(5); } break; @@ -420,23 +350,13 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 60; + this.state = 39; if (!(this.precpred(this._ctx, 3))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 61; + this.state = 40; this.match(ExpressionAntlrParser.DOUBLE_AND); - this.state = 63; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === ExpressionAntlrParser.NEWLINE) { - { - this.state = 62; - this.match(ExpressionAntlrParser.NEWLINE); - } - } - - this.state = 65; + this.state = 41; this.expression(4); } break; @@ -445,32 +365,22 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new BinaryOpExpContext(new ExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_expression); - this.state = 66; + this.state = 42; if (!(this.precpred(this._ctx, 2))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 67; + this.state = 43; this.match(ExpressionAntlrParser.DOUBLE_VERTICAL_CYLINDER); - this.state = 69; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === ExpressionAntlrParser.NEWLINE) { - { - this.state = 68; - this.match(ExpressionAntlrParser.NEWLINE); - } - } - - this.state = 71; + this.state = 44; this.expression(3); } break; } } } - this.state = 76; + this.state = 49; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 11, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 2, this._ctx); } } } @@ -508,7 +418,7 @@ export class ExpressionAntlrParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 87; + this.state = 60; this._errHandler.sync(this); switch (this._input.LA(1)) { case ExpressionAntlrParser.OPEN_BRACKET: @@ -517,11 +427,11 @@ export class ExpressionAntlrParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 78; + this.state = 51; this.match(ExpressionAntlrParser.OPEN_BRACKET); - this.state = 79; + this.state = 52; this.expression(0); - this.state = 80; + this.state = 53; this.match(ExpressionAntlrParser.CLOSE_BRACKET); } break; @@ -530,7 +440,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new ConstantAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 82; + this.state = 55; this.match(ExpressionAntlrParser.CONSTANT); } break; @@ -539,7 +449,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new NumericAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 83; + this.state = 56; this.match(ExpressionAntlrParser.NUMBER); } break; @@ -548,7 +458,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new StringAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 84; + this.state = 57; this.match(ExpressionAntlrParser.STRING); } break; @@ -557,7 +467,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new IdAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 85; + this.state = 58; this.match(ExpressionAntlrParser.IDENTIFIER); } break; @@ -566,7 +476,7 @@ export class ExpressionAntlrParser extends Parser { _localctx = new StringInterpolationAtomContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 86; + this.state = 59; this.stringInterpolation(); } break; @@ -574,9 +484,9 @@ export class ExpressionAntlrParser extends Parser { throw new NoViableAltException(this); } this._ctx._stop = this._input.tryLT(-1); - this.state = 105; + this.state = 78; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 15, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 6, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -584,20 +494,20 @@ export class ExpressionAntlrParser extends Parser { } _prevctx = _localctx; { - this.state = 103; + this.state = 76; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 5, this._ctx) ) { case 1: { _localctx = new MemberAccessExpContext(new PrimaryExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_primaryExpression); - this.state = 89; + this.state = 62; if (!(this.precpred(this._ctx, 3))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 3)"); } - this.state = 90; + this.state = 63; this.match(ExpressionAntlrParser.DOT); - this.state = 91; + this.state = 64; this.match(ExpressionAntlrParser.IDENTIFIER); } break; @@ -606,23 +516,23 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new FuncInvokeExpContext(new PrimaryExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_primaryExpression); - this.state = 92; + this.state = 65; if (!(this.precpred(this._ctx, 2))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 93; + this.state = 66; this.match(ExpressionAntlrParser.OPEN_BRACKET); - this.state = 95; + this.state = 68; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << ExpressionAntlrParser.STRING_INTERPOLATION_START) | (1 << ExpressionAntlrParser.PLUS) | (1 << ExpressionAntlrParser.SUBSTRACT) | (1 << ExpressionAntlrParser.NON) | (1 << ExpressionAntlrParser.OPEN_BRACKET) | (1 << ExpressionAntlrParser.NUMBER) | (1 << ExpressionAntlrParser.IDENTIFIER) | (1 << ExpressionAntlrParser.STRING) | (1 << ExpressionAntlrParser.CONSTANT))) !== 0)) { { - this.state = 94; + this.state = 67; this.argsList(); } } - this.state = 97; + this.state = 70; this.match(ExpressionAntlrParser.CLOSE_BRACKET); } break; @@ -631,24 +541,24 @@ export class ExpressionAntlrParser extends Parser { { _localctx = new IndexAccessExpContext(new PrimaryExpressionContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, ExpressionAntlrParser.RULE_primaryExpression); - this.state = 98; + this.state = 71; if (!(this.precpred(this._ctx, 1))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 99; + this.state = 72; this.match(ExpressionAntlrParser.OPEN_SQUARE_BRACKET); - this.state = 100; + this.state = 73; this.expression(0); - this.state = 101; + this.state = 74; this.match(ExpressionAntlrParser.CLOSE_SQUARE_BRACKET); } break; } } } - this.state = 107; + this.state = 80; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 15, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 6, this._ctx); } } } @@ -674,31 +584,31 @@ export class ExpressionAntlrParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 108; + this.state = 81; this.match(ExpressionAntlrParser.STRING_INTERPOLATION_START); - this.state = 112; + this.state = 85; this._errHandler.sync(this); _la = this._input.LA(1); do { { - this.state = 112; + this.state = 85; this._errHandler.sync(this); switch (this._input.LA(1)) { case ExpressionAntlrParser.ESCAPE_CHARACTER: { - this.state = 109; + this.state = 82; this.match(ExpressionAntlrParser.ESCAPE_CHARACTER); } break; case ExpressionAntlrParser.TEMPLATE: { - this.state = 110; + this.state = 83; this.match(ExpressionAntlrParser.TEMPLATE); } break; case ExpressionAntlrParser.TEXT_CONTENT: { - this.state = 111; + this.state = 84; this.textContent(); } break; @@ -706,11 +616,11 @@ export class ExpressionAntlrParser extends Parser { throw new NoViableAltException(this); } } - this.state = 114; + this.state = 87; this._errHandler.sync(this); _la = this._input.LA(1); } while (((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (ExpressionAntlrParser.TEMPLATE - 31)) | (1 << (ExpressionAntlrParser.ESCAPE_CHARACTER - 31)) | (1 << (ExpressionAntlrParser.TEXT_CONTENT - 31)))) !== 0)); - this.state = 116; + this.state = 89; this.match(ExpressionAntlrParser.STRING_INTERPOLATION_START); } } @@ -736,7 +646,7 @@ export class ExpressionAntlrParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 119; + this.state = 92; this._errHandler.sync(this); _alt = 1; do { @@ -744,7 +654,7 @@ export class ExpressionAntlrParser extends Parser { case 1: { { - this.state = 118; + this.state = 91; this.match(ExpressionAntlrParser.TEXT_CONTENT); } } @@ -752,9 +662,9 @@ export class ExpressionAntlrParser extends Parser { default: throw new NoViableAltException(this); } - this.state = 121; + this.state = 94; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 18, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 9, this._ctx); } while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER); } } @@ -780,21 +690,21 @@ export class ExpressionAntlrParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 123; + this.state = 96; this.expression(0); - this.state = 128; + this.state = 101; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === ExpressionAntlrParser.COMMA) { { { - this.state = 124; + this.state = 97; this.match(ExpressionAntlrParser.COMMA); - this.state = 125; + this.state = 98; this.expression(0); } } - this.state = 130; + this.state = 103; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -868,66 +778,53 @@ export class ExpressionAntlrParser extends Parser { } public static readonly _serializedATN: string = - "\x03\uAF6F\u8320\u479D\uB75C\u4880\u1605\u191C\uAB37\x03#\x86\x04\x02" + - "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + - "\t\x07\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x05\x03\x15\n\x03" + - "\x03\x03\x03\x03\x05\x03\x19\n\x03\x03\x03\x03\x03\x03\x03\x05\x03\x1E" + - "\n\x03\x03\x03\x03\x03\x03\x03\x03\x03\x05\x03$\n\x03\x03\x03\x03\x03" + - "\x03\x03\x03\x03\x05\x03*\n\x03\x03\x03\x03\x03\x03\x03\x03\x03\x05\x03" + - "0\n\x03\x03\x03\x03\x03\x03\x03\x03\x03\x05\x036\n\x03\x03\x03\x03\x03" + - "\x03\x03\x03\x03\x05\x03<\n\x03\x03\x03\x03\x03\x03\x03\x03\x03\x05\x03" + - "B\n\x03\x03\x03\x03\x03\x03\x03\x03\x03\x05\x03H\n\x03\x03\x03\x07\x03" + - "K\n\x03\f\x03\x0E\x03N\v\x03\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" + - "\x04\x03\x04\x03\x04\x03\x04\x03\x04\x05\x04Z\n\x04\x03\x04\x03\x04\x03" + - "\x04\x03\x04\x03\x04\x03\x04\x05\x04b\n\x04\x03\x04\x03\x04\x03\x04\x03" + - "\x04\x03\x04\x03\x04\x07\x04j\n\x04\f\x04\x0E\x04m\v\x04\x03\x05\x03\x05" + - "\x03\x05\x03\x05\x06\x05s\n\x05\r\x05\x0E\x05t\x03\x05\x03\x05\x03\x06" + - "\x06\x06z\n\x06\r\x06\x0E\x06{\x03\x07\x03\x07\x03\x07\x07\x07\x81\n\x07" + - "\f\x07\x0E\x07\x84\v\x07\x03\x07\x02\x02\x04\x04\x06\b\x02\x02\x04\x02" + - "\x06\x02\b\x02\n\x02\f\x02\x02\x07\x03\x02\x04\x06\x03\x02\b\n\x03\x02" + - "\x04\x05\x03\x02\v\f\x03\x02\x10\x13\x9F\x02\x0E\x03\x02\x02\x02\x04\x18" + - "\x03\x02\x02\x02\x06Y\x03\x02\x02\x02\bn\x03\x02\x02\x02\ny\x03\x02\x02" + - "\x02\f}\x03\x02\x02\x02\x0E\x0F\x05\x04\x03\x02\x0F\x10\x07\x02\x02\x03" + - "\x10\x03\x03\x02\x02\x02\x11\x12\b\x03\x01\x02\x12\x14\t\x02\x02\x02\x13" + - "\x15\x07\x1D\x02\x02\x14\x13\x03\x02\x02\x02\x14\x15\x03\x02\x02\x02\x15" + - "\x16\x03\x02\x02\x02\x16\x19\x05\x04\x03\f\x17\x19\x05\x06\x04\x02\x18" + - "\x11\x03\x02\x02\x02\x18\x17\x03\x02\x02\x02\x19L\x03\x02\x02\x02\x1A" + - "\x1B\f\v\x02\x02\x1B\x1D\x07\x07\x02\x02\x1C\x1E\x07\x1D\x02\x02\x1D\x1C" + - "\x03\x02\x02\x02\x1D\x1E\x03\x02\x02\x02\x1E\x1F\x03\x02\x02\x02\x1FK" + - "\x05\x04\x03\v !\f\n\x02\x02!#\t\x03\x02\x02\"$\x07\x1D\x02\x02#\"\x03" + - "\x02\x02\x02#$\x03\x02\x02\x02$%\x03\x02\x02\x02%K\x05\x04\x03\v&\'\f" + - "\t\x02\x02\')\t\x04\x02\x02(*\x07\x1D\x02\x02)(\x03\x02\x02\x02)*\x03" + - "\x02\x02\x02*+\x03\x02\x02\x02+K\x05\x04\x03\n,-\f\b\x02\x02-/\t\x05\x02" + - "\x02.0\x07\x1D\x02\x02/.\x03\x02\x02\x02/0\x03\x02\x02\x0201\x03\x02\x02" + - "\x021K\x05\x04\x03\t23\f\x07\x02\x0235\x07\r\x02\x0246\x07\x1D\x02\x02" + - "54\x03\x02\x02\x0256\x03\x02\x02\x0267\x03\x02\x02\x027K\x05\x04\x03\b" + - "89\f\x06\x02\x029;\t\x06\x02\x02:<\x07\x1D\x02\x02;:\x03\x02\x02\x02;" + - "<\x03\x02\x02\x02<=\x03\x02\x02\x02=K\x05\x04\x03\x07>?\f\x05\x02\x02" + - "?A\x07\x0E\x02\x02@B\x07\x1D\x02\x02A@\x03\x02\x02\x02AB\x03\x02\x02\x02" + - "BC\x03\x02\x02\x02CK\x05\x04\x03\x06DE\f\x04\x02\x02EG\x07\x0F\x02\x02" + - "FH\x07\x1D\x02\x02GF\x03\x02\x02\x02GH\x03\x02\x02\x02HI\x03\x02\x02\x02" + - "IK\x05\x04\x03\x05J\x1A\x03\x02\x02\x02J \x03\x02\x02\x02J&\x03\x02\x02" + - "\x02J,\x03\x02\x02\x02J2\x03\x02\x02\x02J8\x03\x02\x02\x02J>\x03\x02\x02" + - "\x02JD\x03\x02\x02\x02KN\x03\x02\x02\x02LJ\x03\x02\x02\x02LM\x03\x02\x02" + - "\x02M\x05\x03\x02\x02\x02NL\x03\x02\x02\x02OP\b\x04\x01\x02PQ\x07\x14" + - "\x02\x02QR\x05\x04\x03\x02RS\x07\x15\x02\x02SZ\x03\x02\x02\x02TZ\x07\x1F" + - "\x02\x02UZ\x07\x1A\x02\x02VZ\x07\x1E\x02\x02WZ\x07\x1C\x02\x02XZ\x05\b" + - "\x05\x02YO\x03\x02\x02\x02YT\x03\x02\x02\x02YU\x03\x02\x02\x02YV\x03\x02" + - "\x02\x02YW\x03\x02\x02\x02YX\x03\x02\x02\x02Zk\x03\x02\x02\x02[\\\f\x05" + - "\x02\x02\\]\x07\x16\x02\x02]j\x07\x1C\x02\x02^_\f\x04\x02\x02_a\x07\x14" + - "\x02\x02`b\x05\f\x07\x02a`\x03\x02\x02\x02ab\x03\x02\x02\x02bc\x03\x02" + - "\x02\x02cj\x07\x15\x02\x02de\f\x03\x02\x02ef\x07\x17\x02\x02fg\x05\x04" + - "\x03\x02gh\x07\x18\x02\x02hj\x03\x02\x02\x02i[\x03\x02\x02\x02i^\x03\x02" + - "\x02\x02id\x03\x02\x02\x02jm\x03\x02\x02\x02ki\x03\x02\x02\x02kl\x03\x02" + - "\x02\x02l\x07\x03\x02\x02\x02mk\x03\x02\x02\x02nr\x07\x03\x02\x02os\x07" + - "\"\x02\x02ps\x07!\x02\x02qs\x05\n\x06\x02ro\x03\x02\x02\x02rp\x03\x02" + - "\x02\x02rq\x03\x02\x02\x02st\x03\x02\x02\x02tr\x03\x02\x02\x02tu\x03\x02" + - "\x02\x02uv\x03\x02\x02\x02vw\x07\x03\x02\x02w\t\x03\x02\x02\x02xz\x07" + - "#\x02\x02yx\x03\x02\x02\x02z{\x03\x02\x02\x02{y\x03\x02\x02\x02{|\x03" + - "\x02\x02\x02|\v\x03\x02\x02\x02}\x82\x05\x04\x03\x02~\x7F\x07\x19\x02" + - "\x02\x7F\x81\x05\x04\x03\x02\x80~\x03\x02\x02\x02\x81\x84\x03\x02\x02" + - "\x02\x82\x80\x03\x02\x02\x02\x82\x83\x03\x02\x02\x02\x83\r\x03\x02\x02" + - "\x02\x84\x82\x03\x02\x02\x02\x16\x14\x18\x1D#)/5;AGJLYaikrt{\x82"; + "\x03\uAF6F\u8320\u479D\uB75C\u4880\u1605\u191C\uAB37\x03#k\x04\x02\t\x02" + + "\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07\t\x07" + + "\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x05\x03\x16\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\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x030\n\x03\f" + + "\x03\x0E\x033\v\x03\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" + + "\x04\x03\x04\x03\x04\x03\x04\x05\x04?\n\x04\x03\x04\x03\x04\x03\x04\x03" + + "\x04\x03\x04\x03\x04\x05\x04G\n\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" + + "\x04\x03\x04\x07\x04O\n\x04\f\x04\x0E\x04R\v\x04\x03\x05\x03\x05\x03\x05" + + "\x03\x05\x06\x05X\n\x05\r\x05\x0E\x05Y\x03\x05\x03\x05\x03\x06\x06\x06" + + "_\n\x06\r\x06\x0E\x06`\x03\x07\x03\x07\x03\x07\x07\x07f\n\x07\f\x07\x0E" + + "\x07i\v\x07\x03\x07\x02\x02\x04\x04\x06\b\x02\x02\x04\x02\x06\x02\b\x02" + + "\n\x02\f\x02\x02\x07\x03\x02\x04\x06\x03\x02\b\n\x03\x02\x04\x05\x03\x02" + + "\v\f\x03\x02\x10\x13{\x02\x0E\x03\x02\x02\x02\x04\x15\x03\x02\x02\x02" + + "\x06>\x03\x02\x02\x02\bS\x03\x02\x02\x02\n^\x03\x02\x02\x02\fb\x03\x02" + + "\x02\x02\x0E\x0F\x05\x04\x03\x02\x0F\x10\x07\x02\x02\x03\x10\x03\x03\x02" + + "\x02\x02\x11\x12\b\x03\x01\x02\x12\x13\t\x02\x02\x02\x13\x16\x05\x04\x03" + + "\f\x14\x16\x05\x06\x04\x02\x15\x11\x03\x02\x02\x02\x15\x14\x03\x02\x02" + + "\x02\x161\x03\x02\x02\x02\x17\x18\f\v\x02\x02\x18\x19\x07\x07\x02\x02" + + "\x190\x05\x04\x03\v\x1A\x1B\f\n\x02\x02\x1B\x1C\t\x03\x02\x02\x1C0\x05" + + "\x04\x03\v\x1D\x1E\f\t\x02\x02\x1E\x1F\t\x04\x02\x02\x1F0\x05\x04\x03" + + "\n !\f\b\x02\x02!\"\t\x05\x02\x02\"0\x05\x04\x03\t#$\f\x07\x02\x02$%\x07" + + "\r\x02\x02%0\x05\x04\x03\b&\'\f\x06\x02\x02\'(\t\x06\x02\x02(0\x05\x04" + + "\x03\x07)*\f\x05\x02\x02*+\x07\x0E\x02\x02+0\x05\x04\x03\x06,-\f\x04\x02" + + "\x02-.\x07\x0F\x02\x02.0\x05\x04\x03\x05/\x17\x03\x02\x02\x02/\x1A\x03" + + "\x02\x02\x02/\x1D\x03\x02\x02\x02/ \x03\x02\x02\x02/#\x03\x02\x02\x02" + + "/&\x03\x02\x02\x02/)\x03\x02\x02\x02/,\x03\x02\x02\x0203\x03\x02\x02\x02" + + "1/\x03\x02\x02\x0212\x03\x02\x02\x022\x05\x03\x02\x02\x0231\x03\x02\x02" + + "\x0245\b\x04\x01\x0256\x07\x14\x02\x0267\x05\x04\x03\x0278\x07\x15\x02" + + "\x028?\x03\x02\x02\x029?\x07\x1F\x02\x02:?\x07\x1A\x02\x02;?\x07\x1E\x02" + + "\x024\x03\x02\x02\x02>9\x03\x02\x02" + + "\x02>:\x03\x02\x02\x02>;\x03\x02\x02\x02><\x03\x02\x02\x02>=\x03\x02\x02" + + "\x02?P\x03\x02\x02\x02@A\f\x05\x02\x02AB\x07\x16\x02\x02BO\x07\x1C\x02" + + "\x02CD\f\x04\x02\x02DF\x07\x14\x02\x02EG\x05\f\x07\x02FE\x03\x02\x02\x02" + + "FG\x03\x02\x02\x02GH\x03\x02\x02\x02HO\x07\x15\x02\x02IJ\f\x03\x02\x02" + + "JK\x07\x17\x02\x02KL\x05\x04\x03\x02LM\x07\x18\x02\x02MO\x03\x02\x02\x02" + + "N@\x03\x02\x02\x02NC\x03\x02\x02\x02NI\x03\x02\x02\x02OR\x03\x02\x02\x02" + + "PN\x03\x02\x02\x02PQ\x03\x02\x02\x02Q\x07\x03\x02\x02\x02RP\x03\x02\x02" + + "\x02SW\x07\x03\x02\x02TX\x07\"\x02\x02UX\x07!\x02\x02VX\x05\n\x06\x02" + + "WT\x03\x02\x02\x02WU\x03\x02\x02\x02WV\x03\x02\x02\x02XY\x03\x02\x02\x02" + + "YW\x03\x02\x02\x02YZ\x03\x02\x02\x02Z[\x03\x02\x02\x02[\\\x07\x03\x02" + + "\x02\\\t\x03\x02\x02\x02]_\x07#\x02\x02^]\x03\x02\x02\x02_`\x03\x02\x02" + + "\x02`^\x03\x02\x02\x02`a\x03\x02\x02\x02a\v\x03\x02\x02\x02bg\x05\x04" + + "\x03\x02cd\x07\x19\x02\x02df\x05\x04\x03\x02ec\x03\x02\x02\x02fi\x03\x02" + + "\x02\x02ge\x03\x02\x02\x02gh\x03\x02\x02\x02h\r\x03\x02\x02\x02ig\x03" + + "\x02\x02\x02\r\x15/1>FNPWY`g"; public static __ATN: ATN; public static get _ATN(): ATN { if (!ExpressionAntlrParser.__ATN) { @@ -989,7 +886,6 @@ export class UnaryOpExpContext extends ExpressionContext { public NON(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.NON, 0); } public SUBSTRACT(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.SUBSTRACT, 0); } public PLUS(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.PLUS, 0); } - public NEWLINE(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.NEWLINE, 0); } constructor(ctx: ExpressionContext) { super(ctx.parent, ctx.invokingState); this.copyFrom(ctx); @@ -1026,7 +922,6 @@ export class BinaryOpExpContext extends ExpressionContext { } } public XOR(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.XOR, 0); } - public NEWLINE(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.NEWLINE, 0); } public ASTERISK(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.ASTERISK, 0); } public SLASH(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.SLASH, 0); } public PERCENT(): TerminalNode | undefined { return this.tryGetToken(ExpressionAntlrParser.PERCENT, 0); } diff --git a/libraries/adaptive-expressions/tests/expressionParser.test.js b/libraries/adaptive-expressions/tests/expressionParser.test.js index 5d88b08426..a729ec686b 100644 --- a/libraries/adaptive-expressions/tests/expressionParser.test.js +++ b/libraries/adaptive-expressions/tests/expressionParser.test.js @@ -25,6 +25,7 @@ const dataSource = [ // Operators tests ['1 + 2', 3], ['1 +\n 2', 3], + ['1 \n+ 2', 3], ['1 +\r\n 2', 3], ['- 1 + 2', 1], ['-\r\n 1 + 2', 1], From 177542cd6b5c8af770cd0bd1aed80fb2d1d15628 Mon Sep 17 00:00:00 2001 From: Shuai Wang Date: Mon, 16 Mar 2020 16:12:39 +0800 Subject: [PATCH 05/10] add more tests --- .../adaptive-expressions/tests/expressionParser.test.js | 4 +++- libraries/botbuilder-lg/tests/lg.test.js | 8 ++++++++ .../tests/testData/examples/MultiLineExpr.lg | 9 +++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 libraries/botbuilder-lg/tests/testData/examples/MultiLineExpr.lg diff --git a/libraries/adaptive-expressions/tests/expressionParser.test.js b/libraries/adaptive-expressions/tests/expressionParser.test.js index a729ec686b..514fa7ef67 100644 --- a/libraries/adaptive-expressions/tests/expressionParser.test.js +++ b/libraries/adaptive-expressions/tests/expressionParser.test.js @@ -117,9 +117,11 @@ const dataSource = [ ['concat(hello,world)', 'helloworld'], ['concat(hello,nullObj)', 'hello'], ['concat(\'hello\',\'world\')', 'helloworld'], + ['concat(\'hello\'\r\n,\'world\')', 'helloworld'], ['concat("hello","world")', 'helloworld'], ['add(hello,world)', 'helloworld'], ['add(\'hello\',\'world\')', 'helloworld'], + ['add(\'hello\',\r\n\'world\')', 'helloworld'], ['add(nullObj,\'world\')', 'world'], ['add(\'hello\',nullObj)', 'hello'], ['add("hello","world")', 'helloworld'], @@ -130,7 +132,7 @@ const dataSource = [ ['length(hello + world)', 10], ['count(\'hello\')', 5], ['count("hello")', 5], - ['count(concat(hello,world))', 10], + ['count(concat(hello,\r\nworld))', 10], ['replace(\'hello\', \'l\', \'k\')', 'hekko'], ['replace(\'hello\', \'L\', \'k\')', 'hello'], ['replace(nullObj, \'L\', \'k\')', ''], diff --git a/libraries/botbuilder-lg/tests/lg.test.js b/libraries/botbuilder-lg/tests/lg.test.js index 471dc27744..d08fdb39d8 100644 --- a/libraries/botbuilder-lg/tests/lg.test.js +++ b/libraries/botbuilder-lg/tests/lg.test.js @@ -54,6 +54,14 @@ describe('LG', function() { assert.strictEqual(evaled === 'Good evening' || evaled === 'Evening! ', true, `Evaled is ${ evaled }`); }); + it('TestMultiLineExpressionInLG', function() { + let templates = Templates.parseFile(GetExampleFilePath('MultiLineExpr.lg')); + let evaled = templates.evaluate('definition'); + assert.strictEqual(evaled, 10); + evaled = templates.evaluate('definition2'); + assert.strictEqual(evaled, 'this is book list: Ender\'s Game, Dune'); + }); + it('TestBasicConditionalTemplateWithoutDefault', function() { let templates = Templates.parseFile(GetExampleFilePath('5.lg')); diff --git a/libraries/botbuilder-lg/tests/testData/examples/MultiLineExpr.lg b/libraries/botbuilder-lg/tests/testData/examples/MultiLineExpr.lg new file mode 100644 index 0000000000..1db9ff24c2 --- /dev/null +++ b/libraries/botbuilder-lg/tests/testData/examples/MultiLineExpr.lg @@ -0,0 +1,9 @@ +>Demo How LG can evalute a multiple line defined expression +#definition +- ${count(concat('hello', +'world'))} + +# definition2 +- this is book list: ${join(createArray("Ender's Game", +"Dune") +, ", ")} \ No newline at end of file From ee849232eb3ca65fe7bf6e434ce0e609fc5379ef Mon Sep 17 00:00:00 2001 From: Shuai Wang Date: Mon, 16 Mar 2020 16:24:40 +0800 Subject: [PATCH 06/10] fix some format and add a test for createArray --- .../src/parser/ExpressionAntlrParser.g4 | 20 +++++++++---------- .../tests/expressionParser.test.js | 1 + .../src/generated/LGFileLexer.ts | 2 +- .../src/generated/LGFileParser.ts | 2 +- .../src/generated/LGFileParserListener.ts | 2 +- .../src/generated/LGFileParserVisitor.ts | 2 +- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 b/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 index a15d4a2ec4..c0e17d62b9 100644 --- a/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 +++ b/libraries/adaptive-expressions/src/parser/ExpressionAntlrParser.g4 @@ -5,16 +5,16 @@ options { tokenVocab=ExpressionAntlrLexer; } file: expression EOF; expression - : (NON|SUBSTRACT|PLUS) expression #unaryOpExp - | expression XOR expression #binaryOpExp - | expression (ASTERISK|SLASH|PERCENT) expression #binaryOpExp - | expression (PLUS|SUBSTRACT) expression #binaryOpExp - | expression (DOUBLE_EQUAL|NOT_EQUAL) expression #binaryOpExp - | expression (SINGLE_AND) expression #binaryOpExp - | expression (LESS_THAN|LESS_OR_EQUAl|MORE_THAN|MORE_OR_EQUAL) expression #binaryOpExp - | expression DOUBLE_AND expression #binaryOpExp - | expression DOUBLE_VERTICAL_CYLINDER expression #binaryOpExp - | primaryExpression #primaryExp + : (NON|SUBSTRACT|PLUS) expression #unaryOpExp + | expression XOR expression #binaryOpExp + | expression (ASTERISK|SLASH|PERCENT) expression #binaryOpExp + | expression (PLUS|SUBSTRACT) expression #binaryOpExp + | expression (DOUBLE_EQUAL|NOT_EQUAL) expression #binaryOpExp + | expression (SINGLE_AND) expression #binaryOpExp + | expression (LESS_THAN|LESS_OR_EQUAl|MORE_THAN|MORE_OR_EQUAL) expression #binaryOpExp + | expression DOUBLE_AND expression #binaryOpExp + | expression DOUBLE_VERTICAL_CYLINDER expression #binaryOpExp + | primaryExpression #primaryExp ; primaryExpression diff --git a/libraries/adaptive-expressions/tests/expressionParser.test.js b/libraries/adaptive-expressions/tests/expressionParser.test.js index 514fa7ef67..8a4dceb896 100644 --- a/libraries/adaptive-expressions/tests/expressionParser.test.js +++ b/libraries/adaptive-expressions/tests/expressionParser.test.js @@ -432,6 +432,7 @@ const dataSource = [ ['uriScheme(\'http://www.contoso.com/catalog/shownew.htm?date=today\')', 'http'], // Collection functions tests + ['createArray(hello)', ['hello']], ['sum(createArray(1, 2))', 3], ['sum(createArray(one, two, 3))', 6.0], ['average(createArray(1, 2))', 1.5], diff --git a/libraries/botbuilder-lg/src/generated/LGFileLexer.ts b/libraries/botbuilder-lg/src/generated/LGFileLexer.ts index c87fbb693e..2a31ecd619 100644 --- a/libraries/botbuilder-lg/src/generated/LGFileLexer.ts +++ b/libraries/botbuilder-lg/src/generated/LGFileLexer.ts @@ -1,4 +1,4 @@ -// Generated from LGFileLexer.g4 by ANTLR 4.6-SNAPSHOT +// Generated from ../LGFileLexer.g4 by ANTLR 4.6-SNAPSHOT import { ATN } from "antlr4ts/atn/ATN"; diff --git a/libraries/botbuilder-lg/src/generated/LGFileParser.ts b/libraries/botbuilder-lg/src/generated/LGFileParser.ts index 9213b281b7..c522c2823d 100644 --- a/libraries/botbuilder-lg/src/generated/LGFileParser.ts +++ b/libraries/botbuilder-lg/src/generated/LGFileParser.ts @@ -1,4 +1,4 @@ -// Generated from LGFileParser.g4 by ANTLR 4.6-SNAPSHOT +// Generated from ../LGFileParser.g4 by ANTLR 4.6-SNAPSHOT import { ATN } from "antlr4ts/atn/ATN"; diff --git a/libraries/botbuilder-lg/src/generated/LGFileParserListener.ts b/libraries/botbuilder-lg/src/generated/LGFileParserListener.ts index 6b9875c715..c3e3b95239 100644 --- a/libraries/botbuilder-lg/src/generated/LGFileParserListener.ts +++ b/libraries/botbuilder-lg/src/generated/LGFileParserListener.ts @@ -1,4 +1,4 @@ -// Generated from LGFileParser.g4 by ANTLR 4.6-SNAPSHOT +// Generated from ../LGFileParser.g4 by ANTLR 4.6-SNAPSHOT import { ParseTreeListener } from "antlr4ts/tree/ParseTreeListener"; diff --git a/libraries/botbuilder-lg/src/generated/LGFileParserVisitor.ts b/libraries/botbuilder-lg/src/generated/LGFileParserVisitor.ts index 462741b782..4a64318c08 100644 --- a/libraries/botbuilder-lg/src/generated/LGFileParserVisitor.ts +++ b/libraries/botbuilder-lg/src/generated/LGFileParserVisitor.ts @@ -1,4 +1,4 @@ -// Generated from LGFileParser.g4 by ANTLR 4.6-SNAPSHOT +// Generated from ../LGFileParser.g4 by ANTLR 4.6-SNAPSHOT import { ParseTreeVisitor } from "antlr4ts/tree/ParseTreeVisitor"; From 06fe519ab63d81cf9f4b0f2f177cda08b05b7a05 Mon Sep 17 00:00:00 2001 From: Shuai Wang Date: Tue, 17 Mar 2020 15:48:55 +0800 Subject: [PATCH 07/10] remove multiline --- .../src/expressionFunctions.ts | 4 +- libraries/botbuilder-lg/src/LGFileLexer.g4 | 2 +- .../src/generated/LGFileLexer.ts | 250 +++++++++--------- .../tests/testData/examples/MultiLineExpr.lg | 9 - 4 files changed, 128 insertions(+), 137 deletions(-) delete mode 100644 libraries/botbuilder-lg/tests/testData/examples/MultiLineExpr.lg diff --git a/libraries/adaptive-expressions/src/expressionFunctions.ts b/libraries/adaptive-expressions/src/expressionFunctions.ts index d38d6b495b..298f9f5659 100644 --- a/libraries/adaptive-expressions/src/expressionFunctions.ts +++ b/libraries/adaptive-expressions/src/expressionFunctions.ts @@ -2991,11 +2991,11 @@ export class ExpressionFunctions { ReturnType.Boolean, ExpressionFunctions.validateUnary), new ExpressionEvaluator(ExpressionType.isInteger, ExpressionFunctions.apply( - (args: any[]): boolean => typeof args[0] === 'number' && args[0] % 1 === 0), + (args: any[]): boolean => this.isNumber(args[0]) && Number.isInteger(args[0])), ReturnType.Boolean, ExpressionFunctions.validateUnary), new ExpressionEvaluator(ExpressionType.isFloat, ExpressionFunctions.apply( - (args: any[]): boolean => typeof args[0] === 'number' && args[0] % 1 !== 0), + (args: any[]): boolean => this.isNumber(args[0]) && !Number.isInteger(args[0])), ReturnType.Boolean, ExpressionFunctions.validateUnary), new ExpressionEvaluator(ExpressionType.isArray, ExpressionFunctions.apply( diff --git a/libraries/botbuilder-lg/src/LGFileLexer.g4 b/libraries/botbuilder-lg/src/LGFileLexer.g4 index f7901b9904..0e9608f22f 100644 --- a/libraries/botbuilder-lg/src/LGFileLexer.g4 +++ b/libraries/botbuilder-lg/src/LGFileLexer.g4 @@ -46,7 +46,7 @@ fragment STRING_LITERAL : ('\'' (~['\r\n])* '\'') | ('"' (~["\r\n])* '"'); fragment STRING_INTERPOLATION : '`' ('\\`' | ~'`')* '`'; -fragment EXPRESSION_FRAGMENT : '$' '{' (STRING_LITERAL | STRING_INTERPOLATION | EMPTY_OBJECT | ~[{}'"`] )+ '}'?; +fragment EXPRESSION_FRAGMENT : '$' '{' (STRING_LITERAL | STRING_INTERPOLATION | EMPTY_OBJECT | ~[\r\n{}'"`] )+ '}'?; fragment ESCAPE_CHARACTER_FRAGMENT : '\\' ~[\r\n]?; diff --git a/libraries/botbuilder-lg/src/generated/LGFileLexer.ts b/libraries/botbuilder-lg/src/generated/LGFileLexer.ts index 2a31ecd619..eedb60a114 100644 --- a/libraries/botbuilder-lg/src/generated/LGFileLexer.ts +++ b/libraries/botbuilder-lg/src/generated/LGFileLexer.ts @@ -662,87 +662,87 @@ export class LGFileLexer extends Lexer { ".\b\x02\x03\x04\x05\x06\x07\x19\x04\x02CCcc\x04\x02EEee\x04\x02FFff\x04" + "\x02GGgg\x04\x02HHhh\x04\x02JJjj\x04\x02KKkk\x04\x02NNnn\x04\x02UUuu\x04" + "\x02VVvv\x04\x02WWww\x04\x02YYyy\x04\x02C\\c|\x06\x02\v\v\"\"\xA2\xA2" + - "\uFF01\uFF01\x05\x02\f\f\x0F\x0F))\x05\x02\f\f\x0F\x0F$$\x03\x02bb\x07" + - "\x02$$))bb}}\x7F\x7F\x04\x02\f\f\x0F\x0F\x06\x02\f\f\x0F\x0F]]__\x05\x02" + - "\f\f\x0F\x0F*+\x04\x02//aa\x04\x02/0aa\u0286\x020\x03\x02\x02\x02\x02" + - "2\x03\x02\x02\x02\x024\x03\x02\x02\x02\x026\x03\x02\x02\x02\x028\x03\x02" + - "\x02\x02\x02:\x03\x02\x02\x02\x02<\x03\x02\x02\x02\x02>\x03\x02\x02\x02" + - "\x02@\x03\x02\x02\x02\x03B\x03\x02\x02\x02\x03D\x03\x02\x02\x02\x03F\x03" + - "\x02\x02\x02\x03H\x03\x02\x02\x02\x03J\x03\x02\x02\x02\x03L\x03\x02\x02" + - "\x02\x03N\x03\x02\x02\x02\x03P\x03\x02\x02\x02\x04R\x03\x02\x02\x02\x04" + - "T\x03\x02\x02\x02\x04V\x03\x02\x02\x02\x04X\x03\x02\x02\x02\x04Z\x03\x02" + - "\x02\x02\x04\\\x03\x02\x02\x02\x04^\x03\x02\x02\x02\x04`\x03\x02\x02\x02" + - "\x04b\x03\x02\x02\x02\x04d\x03\x02\x02\x02\x04f\x03\x02\x02\x02\x04h\x03" + - "\x02\x02\x02\x05j\x03\x02\x02\x02\x05l\x03\x02\x02\x02\x05n\x03\x02\x02" + - "\x02\x05p\x03\x02\x02\x02\x06r\x03\x02\x02\x02\x06t\x03\x02\x02\x02\x06" + - "v\x03\x02\x02\x02\x06x\x03\x02\x02\x02\x07z\x03\x02\x02\x02\x07|\x03\x02" + - "\x02\x02\x07~\x03\x02\x02\x02\x07\x80\x03\x02\x02\x02\x07\x82\x03\x02" + - "\x02\x02\x07\x84\x03\x02\x02\x02\x07\x86\x03\x02\x02\x02\x07\x88\x03\x02" + - "\x02\x02\x07\x8A\x03\x02\x02\x02\x07\x8C\x03\x02\x02\x02\b\x8E\x03\x02" + - "\x02\x02\n\x90\x03\x02\x02\x02\f\x92\x03\x02\x02\x02\x0E\x94\x03\x02\x02" + - "\x02\x10\x96\x03\x02\x02\x02\x12\x98\x03\x02\x02\x02\x14\x9A\x03\x02\x02" + - "\x02\x16\x9C\x03\x02\x02\x02\x18\x9E\x03\x02\x02\x02\x1A\xA0\x03\x02\x02" + - "\x02\x1C\xA2\x03\x02\x02\x02\x1E\xA4\x03\x02\x02\x02 \xA6\x03\x02\x02" + - "\x02\"\xA8\x03\x02\x02\x02$\xAA\x03\x02\x02\x02&\xAC\x03\x02\x02\x02(" + - "\xC5\x03\x02\x02\x02*\xC7\x03\x02\x02\x02,\xD2\x03\x02\x02\x02.\xDF\x03" + - "\x02\x02\x020\xE3\x03\x02\x02\x022\xF2\x03\x02\x02\x024\xFC\x03\x02\x02" + - "\x026\u0103\x03\x02\x02\x028\u0109\x03\x02\x02\x02:\u010E\x03\x02\x02" + - "\x02<\u0114\x03\x02\x02\x02>\u0119\x03\x02\x02\x02@\u012B\x03\x02\x02" + - "\x02B\u012F\x03\x02\x02\x02D\u0136\x03\x02\x02\x02F\u0141\x03\x02\x02" + - "\x02H\u014B\x03\x02\x02\x02J\u014D\x03\x02\x02\x02L\u014F\x03\x02\x02" + - "\x02N\u0151\x03\x02\x02\x02P\u0154\x03\x02\x02\x02R\u0159\x03\x02\x02" + - "\x02T\u0161\x03\x02\x02\x02V\u016B\x03\x02\x02\x02X\u0173\x03\x02\x02" + - "\x02Z\u017F\x03\x02\x02\x02\\\u0195\x03\x02\x02\x02^\u01A3\x03\x02\x02" + - "\x02`\u01B3\x03\x02\x02\x02b\u01C1\x03\x02\x02\x02d\u01D2\x03\x02\x02" + - "\x02f\u01D5\x03\x02\x02\x02h\u01D9\x03\x02\x02\x02j\u01DF\x03\x02\x02" + - "\x02l\u01E7\x03\x02\x02\x02n\u01EB\x03\x02\x02\x02p\u01F4\x03\x02\x02" + - "\x02r\u01FB\x03\x02\x02\x02t\u0202\x03\x02\x02\x02v\u020E\x03\x02\x02" + - "\x02x\u0219\x03\x02\x02\x02z\u021D\x03\x02\x02\x02|\u022D\x03\x02\x02" + - "\x02~\u0236\x03\x02\x02\x02\x80\u023B\x03\x02\x02\x02\x82\u0245\x03\x02" + - "\x02\x02\x84\u0252\x03\x02\x02\x02\x86\u0256\x03\x02\x02\x02\x88\u0259" + - "\x03\x02\x02\x02\x8A\u025C\x03\x02\x02\x02\x8C\u0260\x03\x02\x02\x02\x8E" + - "\x8F\t\x02\x02\x02\x8F\t\x03\x02\x02\x02\x90\x91\t\x03\x02\x02\x91\v\x03" + - "\x02\x02\x02\x92\x93\t\x04\x02\x02\x93\r\x03\x02\x02\x02\x94\x95\t\x05" + - "\x02\x02\x95\x0F\x03\x02\x02\x02\x96\x97\t\x06\x02\x02\x97\x11\x03\x02" + - "\x02\x02\x98\x99\t\x07\x02\x02\x99\x13\x03\x02\x02\x02\x9A\x9B\t\b\x02" + - "\x02\x9B\x15\x03\x02\x02\x02\x9C\x9D\t\t\x02\x02\x9D\x17\x03\x02\x02\x02" + - "\x9E\x9F\t\n\x02\x02\x9F\x19\x03\x02\x02\x02\xA0\xA1\t\v\x02\x02\xA1\x1B" + - "\x03\x02\x02\x02\xA2\xA3\t\f\x02\x02\xA3\x1D\x03\x02\x02\x02\xA4\xA5\t" + - "\r\x02\x02\xA5\x1F\x03\x02\x02\x02\xA6\xA7\t\x0E\x02\x02\xA7!\x03\x02" + - "\x02\x02\xA8\xA9\x042;\x02\xA9#\x03\x02\x02\x02\xAA\xAB\t\x0F\x02\x02" + - "\xAB%\x03\x02\x02\x02\xAC\xB0\x07}\x02\x02\xAD\xAF\x05$\x10\x02\xAE\xAD" + - "\x03\x02\x02\x02\xAF\xB2\x03\x02\x02\x02\xB0\xAE\x03\x02\x02\x02\xB0\xB1" + - "\x03\x02\x02\x02\xB1\xB3\x03\x02\x02\x02\xB2\xB0\x03\x02\x02\x02\xB3\xB4" + - "\x07\x7F\x02\x02\xB4\'\x03\x02\x02\x02\xB5\xB9\x07)\x02\x02\xB6\xB8\n" + - "\x10\x02\x02\xB7\xB6\x03\x02\x02\x02\xB8\xBB\x03\x02\x02\x02\xB9\xB7\x03" + - "\x02\x02\x02\xB9\xBA\x03\x02\x02\x02\xBA\xBC\x03\x02\x02\x02\xBB\xB9\x03" + - "\x02\x02\x02\xBC\xC6\x07)\x02\x02\xBD\xC1\x07$\x02\x02\xBE\xC0\n\x11\x02" + - "\x02\xBF\xBE\x03\x02\x02\x02\xC0\xC3\x03\x02\x02\x02\xC1\xBF\x03\x02\x02" + - "\x02\xC1\xC2\x03\x02\x02\x02\xC2\xC4\x03\x02\x02\x02\xC3\xC1\x03\x02\x02" + - "\x02\xC4\xC6\x07$\x02\x02\xC5\xB5\x03\x02\x02\x02\xC5\xBD\x03\x02\x02" + - "\x02\xC6)\x03\x02\x02\x02\xC7\xCD\x07b\x02\x02\xC8\xC9\x07^\x02\x02\xC9" + - "\xCC\x07b\x02\x02\xCA\xCC\n\x12\x02\x02\xCB\xC8\x03\x02\x02\x02\xCB\xCA" + - "\x03\x02\x02\x02\xCC\xCF\x03\x02\x02\x02\xCD\xCB\x03\x02\x02\x02\xCD\xCE" + - "\x03\x02\x02\x02\xCE\xD0\x03\x02\x02\x02\xCF\xCD\x03\x02\x02\x02\xD0\xD1" + - "\x07b\x02\x02\xD1+\x03\x02\x02\x02\xD2\xD3\x07&\x02\x02\xD3\xD8\x07}\x02" + - "\x02\xD4\xD9\x05(\x12\x02\xD5\xD9\x05*\x13\x02\xD6\xD9\x05&\x11\x02\xD7" + - "\xD9\n\x13\x02\x02\xD8\xD4\x03\x02\x02\x02\xD8\xD5\x03\x02\x02\x02\xD8" + - "\xD6\x03\x02\x02\x02\xD8\xD7\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA" + - "\xD8\x03\x02\x02\x02\xDA\xDB\x03\x02\x02\x02\xDB\xDD\x03\x02\x02\x02\xDC" + - "\xDE\x07\x7F\x02\x02\xDD\xDC\x03\x02\x02\x02\xDD\xDE\x03\x02\x02\x02\xDE" + - "-\x03\x02\x02\x02\xDF\xE1\x07^\x02\x02\xE0\xE2\n\x14\x02\x02\xE1\xE0\x03" + - "\x02\x02\x02\xE1\xE2\x03\x02\x02\x02\xE2/\x03\x02\x02\x02\xE3\xE7\x07" + - "@\x02\x02\xE4\xE6\x05$\x10\x02\xE5\xE4\x03\x02\x02\x02\xE6\xE9\x03\x02" + - "\x02\x02\xE7\xE5\x03\x02\x02\x02\xE7\xE8\x03\x02\x02\x02\xE8\xEA\x03\x02" + - "\x02\x02\xE9\xE7\x03\x02\x02\x02\xEA\xEB\x07#\x02\x02\xEB\xEC\x07%\x02" + - "\x02\xEC\xEE\x03\x02\x02\x02\xED\xEF\n\x14\x02\x02\xEE\xED\x03\x02\x02" + - "\x02\xEF\xF0\x03\x02\x02\x02\xF0\xEE\x03\x02\x02\x02\xF0\xF1\x03\x02\x02" + - "\x02\xF11\x03\x02\x02\x02\xF2\xF6\x07@\x02\x02\xF3\xF5\n\x14\x02\x02\xF4" + - "\xF3\x03\x02\x02\x02\xF5\xF8\x03\x02\x02\x02\xF6\xF4\x03\x02\x02\x02\xF6" + - "\xF7\x03\x02\x02\x02\xF7\xF9\x03\x02\x02\x02\xF8\xF6\x03\x02\x02\x02\xF9" + - "\xFA\b\x17\x02\x02\xFA3\x03\x02\x02\x02\xFB\xFD\x05$\x10\x02\xFC\xFB\x03" + - "\x02\x02\x02\xFD\xFE\x03\x02\x02\x02\xFE\xFC\x03\x02\x02\x02\xFE\xFF\x03" + - "\x02\x02\x02\xFF\u0100\x03\x02\x02\x02\u0100\u0101\b\x18\x02\x02\u0101" + + "\uFF01\uFF01\x05\x02\f\f\x0F\x0F))\x05\x02\f\f\x0F\x0F$$\x03\x02bb\t\x02" + + "\f\f\x0F\x0F$$))bb}}\x7F\x7F\x04\x02\f\f\x0F\x0F\x06\x02\f\f\x0F\x0F]" + + "]__\x05\x02\f\f\x0F\x0F*+\x04\x02//aa\x04\x02/0aa\u0286\x020\x03\x02\x02" + + "\x02\x022\x03\x02\x02\x02\x024\x03\x02\x02\x02\x026\x03\x02\x02\x02\x02" + + "8\x03\x02\x02\x02\x02:\x03\x02\x02\x02\x02<\x03\x02\x02\x02\x02>\x03\x02" + + "\x02\x02\x02@\x03\x02\x02\x02\x03B\x03\x02\x02\x02\x03D\x03\x02\x02\x02" + + "\x03F\x03\x02\x02\x02\x03H\x03\x02\x02\x02\x03J\x03\x02\x02\x02\x03L\x03" + + "\x02\x02\x02\x03N\x03\x02\x02\x02\x03P\x03\x02\x02\x02\x04R\x03\x02\x02" + + "\x02\x04T\x03\x02\x02\x02\x04V\x03\x02\x02\x02\x04X\x03\x02\x02\x02\x04" + + "Z\x03\x02\x02\x02\x04\\\x03\x02\x02\x02\x04^\x03\x02\x02\x02\x04`\x03" + + "\x02\x02\x02\x04b\x03\x02\x02\x02\x04d\x03\x02\x02\x02\x04f\x03\x02\x02" + + "\x02\x04h\x03\x02\x02\x02\x05j\x03\x02\x02\x02\x05l\x03\x02\x02\x02\x05" + + "n\x03\x02\x02\x02\x05p\x03\x02\x02\x02\x06r\x03\x02\x02\x02\x06t\x03\x02" + + "\x02\x02\x06v\x03\x02\x02\x02\x06x\x03\x02\x02\x02\x07z\x03\x02\x02\x02" + + "\x07|\x03\x02\x02\x02\x07~\x03\x02\x02\x02\x07\x80\x03\x02\x02\x02\x07" + + "\x82\x03\x02\x02\x02\x07\x84\x03\x02\x02\x02\x07\x86\x03\x02\x02\x02\x07" + + "\x88\x03\x02\x02\x02\x07\x8A\x03\x02\x02\x02\x07\x8C\x03\x02\x02\x02\b" + + "\x8E\x03\x02\x02\x02\n\x90\x03\x02\x02\x02\f\x92\x03\x02\x02\x02\x0E\x94" + + "\x03\x02\x02\x02\x10\x96\x03\x02\x02\x02\x12\x98\x03\x02\x02\x02\x14\x9A" + + "\x03\x02\x02\x02\x16\x9C\x03\x02\x02\x02\x18\x9E\x03\x02\x02\x02\x1A\xA0" + + "\x03\x02\x02\x02\x1C\xA2\x03\x02\x02\x02\x1E\xA4\x03\x02\x02\x02 \xA6" + + "\x03\x02\x02\x02\"\xA8\x03\x02\x02\x02$\xAA\x03\x02\x02\x02&\xAC\x03\x02" + + "\x02\x02(\xC5\x03\x02\x02\x02*\xC7\x03\x02\x02\x02,\xD2\x03\x02\x02\x02" + + ".\xDF\x03\x02\x02\x020\xE3\x03\x02\x02\x022\xF2\x03\x02\x02\x024\xFC\x03" + + "\x02\x02\x026\u0103\x03\x02\x02\x028\u0109\x03\x02\x02\x02:\u010E\x03" + + "\x02\x02\x02<\u0114\x03\x02\x02\x02>\u0119\x03\x02\x02\x02@\u012B\x03" + + "\x02\x02\x02B\u012F\x03\x02\x02\x02D\u0136\x03\x02\x02\x02F\u0141\x03" + + "\x02\x02\x02H\u014B\x03\x02\x02\x02J\u014D\x03\x02\x02\x02L\u014F\x03" + + "\x02\x02\x02N\u0151\x03\x02\x02\x02P\u0154\x03\x02\x02\x02R\u0159\x03" + + "\x02\x02\x02T\u0161\x03\x02\x02\x02V\u016B\x03\x02\x02\x02X\u0173\x03" + + "\x02\x02\x02Z\u017F\x03\x02\x02\x02\\\u0195\x03\x02\x02\x02^\u01A3\x03" + + "\x02\x02\x02`\u01B3\x03\x02\x02\x02b\u01C1\x03\x02\x02\x02d\u01D2\x03" + + "\x02\x02\x02f\u01D5\x03\x02\x02\x02h\u01D9\x03\x02\x02\x02j\u01DF\x03" + + "\x02\x02\x02l\u01E7\x03\x02\x02\x02n\u01EB\x03\x02\x02\x02p\u01F4\x03" + + "\x02\x02\x02r\u01FB\x03\x02\x02\x02t\u0202\x03\x02\x02\x02v\u020E\x03" + + "\x02\x02\x02x\u0219\x03\x02\x02\x02z\u021D\x03\x02\x02\x02|\u022D\x03" + + "\x02\x02\x02~\u0236\x03\x02\x02\x02\x80\u023B\x03\x02\x02\x02\x82\u0245" + + "\x03\x02\x02\x02\x84\u0252\x03\x02\x02\x02\x86\u0256\x03\x02\x02\x02\x88" + + "\u0259\x03\x02\x02\x02\x8A\u025C\x03\x02\x02\x02\x8C\u0260\x03\x02\x02" + + "\x02\x8E\x8F\t\x02\x02\x02\x8F\t\x03\x02\x02\x02\x90\x91\t\x03\x02\x02" + + "\x91\v\x03\x02\x02\x02\x92\x93\t\x04\x02\x02\x93\r\x03\x02\x02\x02\x94" + + "\x95\t\x05\x02\x02\x95\x0F\x03\x02\x02\x02\x96\x97\t\x06\x02\x02\x97\x11" + + "\x03\x02\x02\x02\x98\x99\t\x07\x02\x02\x99\x13\x03\x02\x02\x02\x9A\x9B" + + "\t\b\x02\x02\x9B\x15\x03\x02\x02\x02\x9C\x9D\t\t\x02\x02\x9D\x17\x03\x02" + + "\x02\x02\x9E\x9F\t\n\x02\x02\x9F\x19\x03\x02\x02\x02\xA0\xA1\t\v\x02\x02" + + "\xA1\x1B\x03\x02\x02\x02\xA2\xA3\t\f\x02\x02\xA3\x1D\x03\x02\x02\x02\xA4" + + "\xA5\t\r\x02\x02\xA5\x1F\x03\x02\x02\x02\xA6\xA7\t\x0E\x02\x02\xA7!\x03" + + "\x02\x02\x02\xA8\xA9\x042;\x02\xA9#\x03\x02\x02\x02\xAA\xAB\t\x0F\x02" + + "\x02\xAB%\x03\x02\x02\x02\xAC\xB0\x07}\x02\x02\xAD\xAF\x05$\x10\x02\xAE" + + "\xAD\x03\x02\x02\x02\xAF\xB2\x03\x02\x02\x02\xB0\xAE\x03\x02\x02\x02\xB0" + + "\xB1\x03\x02\x02\x02\xB1\xB3\x03\x02\x02\x02\xB2\xB0\x03\x02\x02\x02\xB3" + + "\xB4\x07\x7F\x02\x02\xB4\'\x03\x02\x02\x02\xB5\xB9\x07)\x02\x02\xB6\xB8" + + "\n\x10\x02\x02\xB7\xB6\x03\x02\x02\x02\xB8\xBB\x03\x02\x02\x02\xB9\xB7" + + "\x03\x02\x02\x02\xB9\xBA\x03\x02\x02\x02\xBA\xBC\x03\x02\x02\x02\xBB\xB9" + + "\x03\x02\x02\x02\xBC\xC6\x07)\x02\x02\xBD\xC1\x07$\x02\x02\xBE\xC0\n\x11" + + "\x02\x02\xBF\xBE\x03\x02\x02\x02\xC0\xC3\x03\x02\x02\x02\xC1\xBF\x03\x02" + + "\x02\x02\xC1\xC2\x03\x02\x02\x02\xC2\xC4\x03\x02\x02\x02\xC3\xC1\x03\x02" + + "\x02\x02\xC4\xC6\x07$\x02\x02\xC5\xB5\x03\x02\x02\x02\xC5\xBD\x03\x02" + + "\x02\x02\xC6)\x03\x02\x02\x02\xC7\xCD\x07b\x02\x02\xC8\xC9\x07^\x02\x02" + + "\xC9\xCC\x07b\x02\x02\xCA\xCC\n\x12\x02\x02\xCB\xC8\x03\x02\x02\x02\xCB" + + "\xCA\x03\x02\x02\x02\xCC\xCF\x03\x02\x02\x02\xCD\xCB\x03\x02\x02\x02\xCD" + + "\xCE\x03\x02\x02\x02\xCE\xD0\x03\x02\x02\x02\xCF\xCD\x03\x02\x02\x02\xD0" + + "\xD1\x07b\x02\x02\xD1+\x03\x02\x02\x02\xD2\xD3\x07&\x02\x02\xD3\xD8\x07" + + "}\x02\x02\xD4\xD9\x05(\x12\x02\xD5\xD9\x05*\x13\x02\xD6\xD9\x05&\x11\x02" + + "\xD7\xD9\n\x13\x02\x02\xD8\xD4\x03\x02\x02\x02\xD8\xD5\x03\x02\x02\x02" + + "\xD8\xD6\x03\x02\x02\x02\xD8\xD7\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02" + + "\xDA\xD8\x03\x02\x02\x02\xDA\xDB\x03\x02\x02\x02\xDB\xDD\x03\x02\x02\x02" + + "\xDC\xDE\x07\x7F\x02\x02\xDD\xDC\x03\x02\x02\x02\xDD\xDE\x03\x02\x02\x02" + + "\xDE-\x03\x02\x02\x02\xDF\xE1\x07^\x02\x02\xE0\xE2\n\x14\x02\x02\xE1\xE0" + + "\x03\x02\x02\x02\xE1\xE2\x03\x02\x02\x02\xE2/\x03\x02\x02\x02\xE3\xE7" + + "\x07@\x02\x02\xE4\xE6\x05$\x10\x02\xE5\xE4\x03\x02\x02\x02\xE6\xE9\x03" + + "\x02\x02\x02\xE7\xE5\x03\x02\x02\x02\xE7\xE8\x03\x02\x02\x02\xE8\xEA\x03" + + "\x02\x02\x02\xE9\xE7\x03\x02\x02\x02\xEA\xEB\x07#\x02\x02\xEB\xEC\x07" + + "%\x02\x02\xEC\xEE\x03\x02\x02\x02\xED\xEF\n\x14\x02\x02\xEE\xED\x03\x02" + + "\x02\x02\xEF\xF0\x03\x02\x02\x02\xF0\xEE\x03\x02\x02\x02\xF0\xF1\x03\x02" + + "\x02\x02\xF11\x03\x02\x02\x02\xF2\xF6\x07@\x02\x02\xF3\xF5\n\x14\x02\x02" + + "\xF4\xF3\x03\x02\x02\x02\xF5\xF8\x03\x02\x02\x02\xF6\xF4\x03\x02\x02\x02" + + "\xF6\xF7\x03\x02\x02\x02\xF7\xF9\x03\x02\x02\x02\xF8\xF6\x03\x02\x02\x02" + + "\xF9\xFA\b\x17\x02\x02\xFA3\x03\x02\x02\x02\xFB\xFD\x05$\x10\x02\xFC\xFB" + + "\x03\x02\x02\x02\xFD\xFE\x03\x02\x02\x02\xFE\xFC\x03\x02\x02\x02\xFE\xFF" + + "\x03\x02\x02\x02\xFF\u0100\x03\x02\x02\x02\u0100\u0101\b\x18\x02\x02\u0101" + "5\x03\x02\x02\x02\u0102\u0104\x07\x0F\x02\x02\u0103\u0102\x03\x02\x02" + "\x02\u0103\u0104\x03\x02\x02\x02\u0104\u0105\x03\x02\x02\x02\u0105\u0106" + "\x07\f\x02\x02\u0106\u0107\x03\x02\x02\x02\u0107\u0108\b\x19\x02\x02\u0108" + @@ -855,51 +855,51 @@ export class LGFileLexer extends Lexer { "\u020D\x03\x02\x02\x02\u020F\u0215\x03\x02\x02\x02\u0210\u0214\x05 \x0E" + "\x02\u0211\u0214\x05\"\x0F\x02\u0212\u0214\t\x18\x02\x02\u0213\u0210\x03" + "\x02\x02\x02\u0213\u0211\x03\x02\x02\x02\u0213\u0212\x03\x02\x02\x02\u0214" + - "\u0217\x03\x02\x02\x02\u0215\u0213\x03\x02\x02\x02"; + "\u0217\x03\x02\x02\x02\u0215\u0213"; private static readonly _serializedATNSegment1: string = - "\u0215\u0216\x03\x02\x02\x02\u0216w\x03\x02\x02\x02\u0217\u0215\x03\x02" + - "\x02\x02\u0218\u021A\n\x14\x02\x02\u0219\u0218\x03\x02\x02\x02\u021A\u021B" + - "\x03\x02\x02\x02\u021B\u021C\x03\x02\x02\x02\u021B\u0219\x03\x02\x02\x02" + - "\u021Cy\x03\x02\x02\x02\u021D\u0221\x07@\x02\x02\u021E\u0220\n\x14\x02" + - "\x02\u021F\u021E\x03\x02\x02\x02\u0220\u0223\x03\x02\x02\x02\u0221\u021F" + - "\x03\x02\x02\x02\u0221\u0222\x03\x02\x02\x02\u0222\u0225\x03\x02\x02\x02" + - "\u0223\u0221\x03\x02\x02\x02\u0224\u0226\x07\x0F\x02\x02\u0225\u0224\x03" + - "\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226\u0227\x03\x02\x02\x02\u0227" + - "\u0228\x07\f\x02\x02\u0228\u0229\x06;\f\x02\u0229\u022A\x03\x02\x02\x02" + - "\u022A\u022B\b;\x02\x02\u022B{\x03\x02\x02\x02\u022C\u022E\x05$\x10\x02" + - "\u022D\u022C\x03\x02\x02\x02\u022E\u022F\x03\x02\x02\x02\u022F\u022D\x03" + - "\x02\x02\x02\u022F\u0230\x03\x02\x02\x02\u0230\u0231\x03\x02\x02\x02\u0231" + - "\u0232\x06<\r\x02\u0232\u0233\x03\x02\x02\x02\u0233\u0234\b<\x02\x02\u0234" + - "}\x03\x02\x02\x02\u0235\u0237\x07\x0F\x02\x02\u0236\u0235\x03\x02\x02" + - "\x02\u0236\u0237\x03\x02\x02\x02\u0237\u0238\x03\x02\x02\x02\u0238\u0239" + - "\x07\f\x02\x02\u0239\u023A\b=\x1F\x02\u023A\x7F\x03\x02\x02\x02\u023B" + - "\u023C\x07_\x02\x02\u023C\u023D\x06>\x0E\x02\u023D\u023E\b> \x02\u023E" + - "\u023F\x03\x02\x02\x02\u023F\u0240\b>\v\x02\u0240\u0241\b>\v\x02\u0241" + - "\x81\x03\x02\x02\x02\u0242\u0246\x05 \x0E\x02\u0243\u0246\x05\"\x0F\x02" + - "\u0244\u0246\x07a\x02\x02\u0245\u0242\x03\x02\x02\x02\u0245\u0243\x03" + - "\x02\x02\x02\u0245\u0244\x03\x02\x02\x02\u0246\u024C\x03\x02\x02\x02\u0247" + - "\u024B\x05 \x0E\x02\u0248\u024B\x05\"\x0F\x02\u0249\u024B\t\x18\x02\x02" + - "\u024A\u0247\x03\x02\x02\x02\u024A\u0248\x03\x02\x02\x02\u024A\u0249\x03" + - "\x02\x02\x02\u024B\u024E\x03\x02\x02\x02\u024C\u024A\x03\x02\x02\x02\u024C" + - "\u024D\x03\x02\x02\x02\u024D\u024F\x03\x02\x02\x02\u024E\u024C\x03\x02" + - "\x02\x02\u024F\u0250\x06?\x0F\x02\u0250\u0251\b?!\x02\u0251\x83\x03\x02" + - "\x02\x02\u0252\u0253\x07?\x02\x02\u0253\u0254\x06@\x10\x02\u0254\u0255" + - "\b@\"\x02\u0255\x85\x03\x02\x02\x02\u0256\u0257\x07~\x02\x02\u0257\u0258" + - "\bA#\x02\u0258\x87\x03\x02\x02\x02\u0259\u025A\x05.\x15\x02\u025A\u025B" + - "\bB$\x02\u025B\x89\x03\x02\x02\x02\u025C\u025D\x05,\x14\x02\u025D\u025E" + - "\bC%\x02\u025E\x8B\x03\x02\x02\x02\u025F\u0261\n\x14\x02\x02\u0260\u025F" + - "\x03\x02\x02\x02\u0261\u0262\x03\x02\x02\x02\u0262\u0263\x03\x02\x02\x02" + - "\u0262\u0260\x03\x02\x02\x02\u0263\u0264\x03\x02\x02\x02\u0264\u0265\b" + - "D&\x02\u0265\x8D\x03\x02\x02\x02:\x02\x03\x04\x05\x06\x07\xB0\xB9\xC1" + - "\xC5\xCB\xCD\xD8\xDA\xDD\xE1\xE7\xF0\xF6\xFE\u0103\u011D\u0125\u0131\u0136" + - "\u0141\u0146\u0148\u0156\u015B\u016B\u0178\u0186\u018E\u019C\u01AC\u01BA" + - "\u01CB\u01DB\u01F0\u01F4\u01F6\u01FD\u0202\u020E\u0213\u0215\u021B\u0221" + - "\u0225\u022F\u0236\u0245\u024A\u024C\u0262\'\b\x02\x02\x03\x1A\x02\x07" + - "\x03\x02\x03\x1B\x03\x07\x04\x02\x07\x06\x02\x03\x1D\x04\x03\x1E\x05\x03" + - " \x06\x06\x02\x02\x03(\x07\x07\x05\x02\x03)\b\x03*\t\x03+\n\x03,\v\x03" + - "-\f\x03.\r\x03/\x0E\x030\x0F\x031\x10\x032\x11\x033\x12\t\x1D\x02\t\x1E" + - "\x02\t\x1F\x02\x038\x13\x038\x14\x07\x07\x02\x03=\x15\x03>\x16\x03?\x17" + - "\x03@\x18\x03A\x19\x03B\x1A\x03C\x1B\x03D\x1C"; + "\x03\x02\x02\x02\u0215\u0216\x03\x02\x02\x02\u0216w\x03\x02\x02\x02\u0217" + + "\u0215\x03\x02\x02\x02\u0218\u021A\n\x14\x02\x02\u0219\u0218\x03\x02\x02" + + "\x02\u021A\u021B\x03\x02\x02\x02\u021B\u021C\x03\x02\x02\x02\u021B\u0219" + + "\x03\x02\x02\x02\u021Cy\x03\x02\x02\x02\u021D\u0221\x07@\x02\x02\u021E" + + "\u0220\n\x14\x02\x02\u021F\u021E\x03\x02\x02\x02\u0220\u0223\x03\x02\x02" + + "\x02\u0221\u021F\x03\x02\x02\x02\u0221\u0222\x03\x02\x02\x02\u0222\u0225" + + "\x03\x02\x02\x02\u0223\u0221\x03\x02\x02\x02\u0224\u0226\x07\x0F\x02\x02" + + "\u0225\u0224\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226\u0227\x03" + + "\x02\x02\x02\u0227\u0228\x07\f\x02\x02\u0228\u0229\x06;\f\x02\u0229\u022A" + + "\x03\x02\x02\x02\u022A\u022B\b;\x02\x02\u022B{\x03\x02\x02\x02\u022C\u022E" + + "\x05$\x10\x02\u022D\u022C\x03\x02\x02\x02\u022E\u022F\x03\x02\x02\x02" + + "\u022F\u022D\x03\x02\x02\x02\u022F\u0230\x03\x02\x02\x02\u0230\u0231\x03" + + "\x02\x02\x02\u0231\u0232\x06<\r\x02\u0232\u0233\x03\x02\x02\x02\u0233" + + "\u0234\b<\x02\x02\u0234}\x03\x02\x02\x02\u0235\u0237\x07\x0F\x02\x02\u0236" + + "\u0235\x03\x02\x02\x02\u0236\u0237\x03\x02\x02\x02\u0237\u0238\x03\x02" + + "\x02\x02\u0238\u0239\x07\f\x02\x02\u0239\u023A\b=\x1F\x02\u023A\x7F\x03" + + "\x02\x02\x02\u023B\u023C\x07_\x02\x02\u023C\u023D\x06>\x0E\x02\u023D\u023E" + + "\b> \x02\u023E\u023F\x03\x02\x02\x02\u023F\u0240\b>\v\x02\u0240\u0241" + + "\b>\v\x02\u0241\x81\x03\x02\x02\x02\u0242\u0246\x05 \x0E\x02\u0243\u0246" + + "\x05\"\x0F\x02\u0244\u0246\x07a\x02\x02\u0245\u0242\x03\x02\x02\x02\u0245" + + "\u0243\x03\x02\x02\x02\u0245\u0244\x03\x02\x02\x02\u0246\u024C\x03\x02" + + "\x02\x02\u0247\u024B\x05 \x0E\x02\u0248\u024B\x05\"\x0F\x02\u0249\u024B" + + "\t\x18\x02\x02\u024A\u0247\x03\x02\x02\x02\u024A\u0248\x03\x02\x02\x02" + + "\u024A\u0249\x03\x02\x02\x02\u024B\u024E\x03\x02\x02\x02\u024C\u024A\x03" + + "\x02\x02\x02\u024C\u024D\x03\x02\x02\x02\u024D\u024F\x03\x02\x02\x02\u024E" + + "\u024C\x03\x02\x02\x02\u024F\u0250\x06?\x0F\x02\u0250\u0251\b?!\x02\u0251" + + "\x83\x03\x02\x02\x02\u0252\u0253\x07?\x02\x02\u0253\u0254\x06@\x10\x02" + + "\u0254\u0255\b@\"\x02\u0255\x85\x03\x02\x02\x02\u0256\u0257\x07~\x02\x02" + + "\u0257\u0258\bA#\x02\u0258\x87\x03\x02\x02\x02\u0259\u025A\x05.\x15\x02" + + "\u025A\u025B\bB$\x02\u025B\x89\x03\x02\x02\x02\u025C\u025D\x05,\x14\x02" + + "\u025D\u025E\bC%\x02\u025E\x8B\x03\x02\x02\x02\u025F\u0261\n\x14\x02\x02" + + "\u0260\u025F\x03\x02\x02\x02\u0261\u0262\x03\x02\x02\x02\u0262\u0263\x03" + + "\x02\x02\x02\u0262\u0260\x03\x02\x02\x02\u0263\u0264\x03\x02\x02\x02\u0264" + + "\u0265\bD&\x02\u0265\x8D\x03\x02\x02\x02:\x02\x03\x04\x05\x06\x07\xB0" + + "\xB9\xC1\xC5\xCB\xCD\xD8\xDA\xDD\xE1\xE7\xF0\xF6\xFE\u0103\u011D\u0125" + + "\u0131\u0136\u0141\u0146\u0148\u0156\u015B\u016B\u0178\u0186\u018E\u019C" + + "\u01AC\u01BA\u01CB\u01DB\u01F0\u01F4\u01F6\u01FD\u0202\u020E\u0213\u0215" + + "\u021B\u0221\u0225\u022F\u0236\u0245\u024A\u024C\u0262\'\b\x02\x02\x03" + + "\x1A\x02\x07\x03\x02\x03\x1B\x03\x07\x04\x02\x07\x06\x02\x03\x1D\x04\x03" + + "\x1E\x05\x03 \x06\x06\x02\x02\x03(\x07\x07\x05\x02\x03)\b\x03*\t\x03+" + + "\n\x03,\v\x03-\f\x03.\r\x03/\x0E\x030\x0F\x031\x10\x032\x11\x033\x12\t" + + "\x1D\x02\t\x1E\x02\t\x1F\x02\x038\x13\x038\x14\x07\x07\x02\x03=\x15\x03" + + ">\x16\x03?\x17\x03@\x18\x03A\x19\x03B\x1A\x03C\x1B\x03D\x1C"; public static readonly _serializedATN: string = Utils.join( [ LGFileLexer._serializedATNSegment0, diff --git a/libraries/botbuilder-lg/tests/testData/examples/MultiLineExpr.lg b/libraries/botbuilder-lg/tests/testData/examples/MultiLineExpr.lg deleted file mode 100644 index 1db9ff24c2..0000000000 --- a/libraries/botbuilder-lg/tests/testData/examples/MultiLineExpr.lg +++ /dev/null @@ -1,9 +0,0 @@ ->Demo How LG can evalute a multiple line defined expression -#definition -- ${count(concat('hello', -'world'))} - -# definition2 -- this is book list: ${join(createArray("Ender's Game", -"Dune") -, ", ")} \ No newline at end of file From 5500a03d34ea61d27e0799f953fcb78fd6ddd6e4 Mon Sep 17 00:00:00 2001 From: Shuai Wang Date: Tue, 17 Mar 2020 15:49:56 +0800 Subject: [PATCH 08/10] remove test --- libraries/botbuilder-lg/tests/testData/examples/5.lg | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/libraries/botbuilder-lg/tests/testData/examples/5.lg b/libraries/botbuilder-lg/tests/testData/examples/5.lg index 4a9370f16e..b5d47c381d 100644 --- a/libraries/botbuilder-lg/tests/testData/examples/5.lg +++ b/libraries/botbuilder-lg/tests/testData/examples/5.lg @@ -42,11 +42,4 @@ # time-of-day-readout-without-default2 - IF: ${timeOfDay == 'morning'} - Good morning - - Morning! - -> Conditional with multiline expressions -# time-of-day-with-two-expression -- IF: ${timeOfDay == 'morning' || - timeOfDay == 'afternoon'} - - GoodDay! - - How is going? \ No newline at end of file + - Morning! \ No newline at end of file From ba2ace59ac19aa82ca7dbae52643e876f32110a2 Mon Sep 17 00:00:00 2001 From: Shuai Wang Date: Tue, 17 Mar 2020 15:50:45 +0800 Subject: [PATCH 09/10] revert change --- libraries/botbuilder-lg/tests/testData/examples/5.lg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/botbuilder-lg/tests/testData/examples/5.lg b/libraries/botbuilder-lg/tests/testData/examples/5.lg index b5d47c381d..8861c04ec6 100644 --- a/libraries/botbuilder-lg/tests/testData/examples/5.lg +++ b/libraries/botbuilder-lg/tests/testData/examples/5.lg @@ -42,4 +42,4 @@ # time-of-day-readout-without-default2 - IF: ${timeOfDay == 'morning'} - Good morning - - Morning! \ No newline at end of file + - Morning! \ No newline at end of file From 026d59d65118d4b15773ca0dff91e94bb888ec5c Mon Sep 17 00:00:00 2001 From: Shuai Wang Date: Tue, 17 Mar 2020 15:51:34 +0800 Subject: [PATCH 10/10] revert --- libraries/botbuilder-lg/tests/lg.test.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/libraries/botbuilder-lg/tests/lg.test.js b/libraries/botbuilder-lg/tests/lg.test.js index d08fdb39d8..d7b234e053 100644 --- a/libraries/botbuilder-lg/tests/lg.test.js +++ b/libraries/botbuilder-lg/tests/lg.test.js @@ -54,14 +54,6 @@ describe('LG', function() { assert.strictEqual(evaled === 'Good evening' || evaled === 'Evening! ', true, `Evaled is ${ evaled }`); }); - it('TestMultiLineExpressionInLG', function() { - let templates = Templates.parseFile(GetExampleFilePath('MultiLineExpr.lg')); - let evaled = templates.evaluate('definition'); - assert.strictEqual(evaled, 10); - evaled = templates.evaluate('definition2'); - assert.strictEqual(evaled, 'this is book list: Ender\'s Game, Dune'); - }); - it('TestBasicConditionalTemplateWithoutDefault', function() { let templates = Templates.parseFile(GetExampleFilePath('5.lg')); @@ -73,9 +65,6 @@ describe('LG', function() { evaled = templates.evaluate('time-of-day-readout-without-default2', { timeOfDay: 'evening' }); assert.strictEqual(evaled, undefined, `Evaled is ${ evaled } which should be undefined.`); - - evaled = templates.evaluate('time-of-day-with-two-expression', { timeOfDay: 'afternoon' }); - assert.strictEqual(evaled === 'GoodDay!' || evaled === 'How is going?', true, `Evaled is ${ evaled }`); }); it('TestBasicTemplateRefWithParameters', function() {