| # Minimal | |
| 0 | |
| ==> | |
| Script(ExpressionStatement(Number)) | |
| # Strings | |
| "A string with \"double\" and 'single' quotes"; | |
| 'A string with "double" and \'single\' quotes'; | |
| '\\'; | |
| "\\"; | |
| 'A string with new \ | |
| line'; | |
| ==> | |
| Script(ExpressionStatement(String(Escape,Escape)), | |
| ExpressionStatement(String(Escape,Escape)), | |
| ExpressionStatement(String(Escape)), | |
| ExpressionStatement(String(Escape)), | |
| ExpressionStatement(String(Escape))) | |
| # Numbers | |
| 101; | |
| 3.14; | |
| 3.14e+1; | |
| 0x1ABCDEFabcdef; | |
| 0o7632157312; | |
| 0b1010101001; | |
| 1e+3; | |
| ==> | |
| Script( | |
| ExpressionStatement(Number), | |
| ExpressionStatement(Number), | |
| ExpressionStatement(Number), | |
| ExpressionStatement(Number), | |
| ExpressionStatement(Number), | |
| ExpressionStatement(Number), | |
| ExpressionStatement(Number)) | |
| # Identifiers | |
| theVar; | |
| theVar2; | |
| $_; | |
| é象𫝄; | |
| últimaVez; | |
| 県; | |
| ==> | |
| Script( | |
| ExpressionStatement(VariableName), | |
| ExpressionStatement(VariableName), | |
| ExpressionStatement(VariableName), | |
| ExpressionStatement(VariableName), | |
| ExpressionStatement(VariableName), | |
| ExpressionStatement(VariableName)) | |
| # RegExps | |
| /one\\/; | |
| /one/g; | |
| /one/i; | |
| /one/gim; | |
| /on\/e/gim; | |
| /on[^/]afe/gim; | |
| /[\]/]/; | |
| ==> | |
| Script( | |
| ExpressionStatement(RegExp), | |
| ExpressionStatement(RegExp), | |
| ExpressionStatement(RegExp), | |
| ExpressionStatement(RegExp), | |
| ExpressionStatement(RegExp), | |
| ExpressionStatement(RegExp), | |
| ExpressionStatement(RegExp)) | |
| # Arrays | |
| []; | |
| [ "item1" ]; | |
| [ "item1", ]; | |
| [ "item1", item2 ]; | |
| [ , item2 ]; | |
| [ item2 = 5 ]; | |
| [ a, ...b, c ]; | |
| ==> | |
| Script( | |
| ExpressionStatement(ArrayExpression), | |
| ExpressionStatement(ArrayExpression(String)), | |
| ExpressionStatement(ArrayExpression(String)), | |
| ExpressionStatement(ArrayExpression(String,VariableName)), | |
| ExpressionStatement(ArrayExpression(VariableName)), | |
| ExpressionStatement(ArrayExpression(AssignmentExpression(VariableName,Equals,Number))), | |
| ExpressionStatement(ArrayExpression(VariableName, Spread, VariableName, VariableName))) | |
| # Functions | |
| [ | |
| function() {}, | |
| function(arg1, ...arg2) { | |
| arg2; | |
| }, | |
| function stuff() {}, | |
| function trailing(a,) {}, | |
| function trailing(a,b,) {} | |
| ] | |
| ==> | |
| Script(ExpressionStatement(ArrayExpression( | |
| FunctionExpression(function,ParamList,Block), | |
| FunctionExpression(function,ParamList(VariableDefinition,Spread,VariableDefinition), Block(ExpressionStatement(VariableName))), | |
| FunctionExpression(function,VariableDefinition,ParamList,Block), | |
| FunctionExpression(function,VariableDefinition,ParamList(VariableDefinition), Block), | |
| FunctionExpression(function,VariableDefinition,ParamList(VariableDefinition,VariableDefinition),Block)))) | |
| # Arrow functions | |
| a => 1; | |
| () => 2; | |
| (d, e) => 3; | |
| (f, g,) => { | |
| return h; | |
| }; | |
| async () => 4; | |
| ==> | |
| Script( | |
| ExpressionStatement(ArrowFunction(ParamList(VariableDefinition),Arrow,Number)), | |
| ExpressionStatement(ArrowFunction(ParamList,Arrow,Number)), | |
| ExpressionStatement(ArrowFunction(ParamList(VariableDefinition,VariableDefinition),Arrow,Number)), | |
| ExpressionStatement(ArrowFunction(ParamList(VariableDefinition,VariableDefinition),Arrow,Block(ReturnStatement(return,VariableName)))), | |
| ExpressionStatement(ArrowFunction(async,ParamList,Arrow,Number))) | |
| # Arrow function followed by comma | |
| ({ | |
| a: () => 1, | |
| b: "x" | |
| }) | |
| ==> | |
| Script(ExpressionStatement(ParenthesizedExpression(ObjectExpression( | |
| Property(PropertyDefinition,ArrowFunction(ParamList,Arrow,Number)), | |
| Property(PropertyDefinition,String))))) | |
| # Long potential arrow function | |
| (assign = [to, from], from = assign[0], to = assign[1]); | |
| ==> | |
| Script(ExpressionStatement(ParenthesizedExpression(SequenceExpression( | |
| AssignmentExpression(VariableName,Equals,ArrayExpression(VariableName,VariableName)), | |
| AssignmentExpression(VariableName,Equals,MemberExpression(VariableName,Number)), | |
| AssignmentExpression(VariableName,Equals,MemberExpression(VariableName,Number)))))) | |
| # Ternary operator | |
| condition ? case1 : case2; | |
| x.y = some.condition ? 2**x : 1 - 2; | |
| ==> | |
| Script( | |
| ExpressionStatement(ConditionalExpression(VariableName,LogicOp,VariableName,LogicOp,VariableName)), | |
| ExpressionStatement(AssignmentExpression( | |
| MemberExpression(VariableName,PropertyName),Equals, | |
| ConditionalExpression( | |
| MemberExpression(VariableName,PropertyName),LogicOp, | |
| BinaryExpression(Number,ArithOp,VariableName),LogicOp, | |
| BinaryExpression(Number,ArithOp,Number))))) | |
| # Type operators | |
| typeof x; | |
| x instanceof String; | |
| ==> | |
| Script(ExpressionStatement(UnaryExpression(typeof,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,instanceof,VariableName))) | |
| # Delete | |
| delete thing['prop']; | |
| true ? delete thing.prop : null; | |
| ==> | |
| Script( | |
| ExpressionStatement(UnaryExpression(delete,MemberExpression(VariableName,String))), | |
| ExpressionStatement(ConditionalExpression(BooleanLiteral,LogicOp, | |
| UnaryExpression(delete,MemberExpression(VariableName,PropertyName)),LogicOp,null))) | |
| # Void | |
| a = void b(); | |
| ==> | |
| Script(ExpressionStatement(AssignmentExpression(VariableName,Equals,UnaryExpression(void,CallExpression(VariableName,ArgList))))) | |
| # Augmented assignment | |
| s |= 1; | |
| t %= 2; | |
| w ^= 3; | |
| x += 4; | |
| y.z *= 5; | |
| z += 1; | |
| a >>= 1; | |
| b >>>= 1; | |
| c <<= 1; | |
| ==> | |
| Script( | |
| ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number)), | |
| ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number)), | |
| ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number)), | |
| ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number)), | |
| ExpressionStatement(AssignmentExpression(MemberExpression(VariableName,PropertyName),UpdateOp,Number)), | |
| ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number)), | |
| ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number)), | |
| ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number)), | |
| ExpressionStatement(AssignmentExpression(VariableName,UpdateOp,Number))) | |
| # Operator precedence | |
| a <= b && c >= d; | |
| a.b = c ? d : e; | |
| a && b(c) && d; | |
| a && new b(c) && d; | |
| typeof a == b && c instanceof d; | |
| ==> | |
| Script( | |
| ExpressionStatement(BinaryExpression(BinaryExpression(VariableName,CompareOp,VariableName),LogicOp, | |
| BinaryExpression(VariableName,CompareOp,VariableName))), | |
| ExpressionStatement(AssignmentExpression(MemberExpression(VariableName,PropertyName),Equals, | |
| ConditionalExpression(VariableName,LogicOp,VariableName,LogicOp,VariableName))), | |
| ExpressionStatement(BinaryExpression(BinaryExpression(VariableName,LogicOp,CallExpression(VariableName,ArgList(VariableName))),LogicOp, | |
| VariableName)), | |
| ExpressionStatement(BinaryExpression(BinaryExpression(VariableName,LogicOp,NewExpression(new,VariableName,ArgList(VariableName))),LogicOp, | |
| VariableName)), | |
| ExpressionStatement(BinaryExpression(BinaryExpression(UnaryExpression(typeof,VariableName),CompareOp,VariableName),LogicOp, | |
| BinaryExpression(VariableName,instanceof,VariableName)))) | |
| # Rest args | |
| foo(...rest); | |
| ==> | |
| Script(ExpressionStatement(CallExpression(VariableName,ArgList(Spread,VariableName)))) | |
| # Forward slashes after parenthesized expressions | |
| (foo - bar) / baz; | |
| if (foo - bar) /baz/; | |
| (this.a() / this.b() - 1) / 2; | |
| ==> | |
| Script( | |
| ExpressionStatement(BinaryExpression(ParenthesizedExpression(BinaryExpression(VariableName,ArithOp,VariableName)),ArithOp,VariableName)), | |
| IfStatement(if,ParenthesizedExpression(BinaryExpression(VariableName,ArithOp,VariableName)), | |
| ExpressionStatement(RegExp)), | |
| ExpressionStatement(BinaryExpression(ParenthesizedExpression( | |
| BinaryExpression( | |
| BinaryExpression( | |
| CallExpression(MemberExpression(this,PropertyName),ArgList),ArithOp, | |
| CallExpression(MemberExpression(this,PropertyName),ArgList)),ArithOp,Number)),ArithOp,Number))) | |
| # Yield expressions | |
| yield db.users.where('[endpoint+email]'); | |
| yield* a; | |
| yield [22]; | |
| ==> | |
| Script( | |
| ExpressionStatement(YieldExpression(yield, | |
| CallExpression(MemberExpression(MemberExpression(VariableName,PropertyName),PropertyName),ArgList(String)))), | |
| ExpressionStatement(YieldExpression(yield,Star,VariableName)), | |
| ExpressionStatement(YieldExpression(yield,ArrayExpression(Number)))) | |
| # Template strings | |
| `one line`; | |
| `multi | |
| line`; | |
| `multi | |
| ${2 + 2} | |
| hello | |
| ${1, 2} | |
| line`; | |
| `$$$$`; | |
| `$`; | |
| `$$$$${ async }`; | |
| `\\\``; | |
| `one${`two${`three`}`}`; | |
| f`hi${there}`; | |
| ==> | |
| Script( | |
| ExpressionStatement(TemplateString), | |
| ExpressionStatement(TemplateString), | |
| ExpressionStatement(TemplateString( | |
| Interpolation(InterpolationStart,BinaryExpression(Number,ArithOp,Number),InterpolationEnd), | |
| Interpolation(InterpolationStart,SequenceExpression(Number,Number),InterpolationEnd))), | |
| ExpressionStatement(TemplateString), | |
| ExpressionStatement(TemplateString), | |
| ExpressionStatement(TemplateString(Interpolation(InterpolationStart,VariableName,InterpolationEnd))), | |
| ExpressionStatement(TemplateString(Escape,Escape)), | |
| ExpressionStatement(TemplateString(Interpolation(InterpolationStart,TemplateString( | |
| Interpolation(InterpolationStart,TemplateString,InterpolationEnd)),InterpolationEnd))), | |
| ExpressionStatement(TaggedTemplateExpression(VariableName,TemplateString( | |
| Interpolation(InterpolationStart,VariableName,InterpolationEnd))))) | |
| # Atoms | |
| this; | |
| null; | |
| undefined; | |
| true; | |
| false; | |
| ==> | |
| Script( | |
| ExpressionStatement(this), | |
| ExpressionStatement(null), | |
| ExpressionStatement(VariableName), | |
| ExpressionStatement(BooleanLiteral), | |
| ExpressionStatement(BooleanLiteral)) | |
| # Objects | |
| foo({}, | |
| { a: "b" }, | |
| { c: "d", "e": f, 1: 2 }, | |
| { | |
| g, | |
| [methodName]() {} | |
| }, | |
| {b, get}, | |
| {a,}); | |
| ==> | |
| Script(ExpressionStatement(CallExpression(VariableName,ArgList( | |
| ObjectExpression, | |
| ObjectExpression(Property(PropertyDefinition,String)), | |
| ObjectExpression(Property(PropertyDefinition,String),Property(String,VariableName),Property(Number,Number)), | |
| ObjectExpression(Property(PropertyDefinition),Property(VariableName,ParamList,Block)), | |
| ObjectExpression(Property(PropertyDefinition),Property(PropertyDefinition)), | |
| ObjectExpression(Property(PropertyDefinition)))))) | |
| # Method definitions | |
| ({ | |
| foo: true, | |
| add(a, b) { | |
| return a + b; | |
| }, | |
| get bar() { return c; }, | |
| set bar(a) { c = a; }, | |
| *barGenerator() { yield c; }, | |
| get() { return 1; } | |
| }); | |
| ==> | |
| Script(ExpressionStatement(ParenthesizedExpression(ObjectExpression( | |
| Property(PropertyDefinition,BooleanLiteral), | |
| Property(PropertyDefinition,ParamList(VariableDefinition,VariableDefinition), | |
| Block(ReturnStatement(return,BinaryExpression(VariableName,ArithOp,VariableName)))), | |
| Property(get,PropertyDefinition,ParamList,Block(ReturnStatement(return,VariableName))), | |
| Property(set,PropertyDefinition,ParamList(VariableDefinition), | |
| Block(ExpressionStatement(AssignmentExpression(VariableName,Equals,VariableName)))), | |
| Property(Star,PropertyDefinition,ParamList,Block(ExpressionStatement(YieldExpression(yield,VariableName)))), | |
| Property(PropertyDefinition,ParamList,Block(ReturnStatement(return,Number))))))) | |
| # Keyword property names | |
| ({ | |
| finally() {}, | |
| catch() {}, | |
| get: function () {}, | |
| set() {}, | |
| static: true, | |
| async: true, | |
| }); | |
| ==> | |
| Script(ExpressionStatement(ParenthesizedExpression(ObjectExpression( | |
| Property(PropertyDefinition,ParamList,Block), | |
| Property(PropertyDefinition,ParamList,Block), | |
| Property(PropertyDefinition,FunctionExpression(function,ParamList,Block)), | |
| Property(PropertyDefinition,ParamList,Block), | |
| Property(PropertyDefinition,BooleanLiteral), | |
| Property(PropertyDefinition,BooleanLiteral))))) | |
| # Generator functions | |
| [ | |
| function *() {}, | |
| function *generateStuff(arg1, arg2) { | |
| yield; | |
| yield arg2; | |
| } | |
| ]; | |
| ==> | |
| Script(ExpressionStatement(ArrayExpression( | |
| FunctionExpression(function,Star,ParamList,Block), | |
| FunctionExpression(function,Star,VariableDefinition,ParamList(VariableDefinition,VariableDefinition),Block( | |
| ExpressionStatement(VariableName), | |
| ExpressionStatement(YieldExpression(yield,VariableName))))))) | |
| # Member expressions | |
| x.someProperty; | |
| x?.other; | |
| x[someVariable]; | |
| f()["some-string"]; | |
| return returned.promise().done(a).fail(b); | |
| ==> | |
| Script( | |
| ExpressionStatement(MemberExpression(VariableName,PropertyName)), | |
| ExpressionStatement(MemberExpression(VariableName,PropertyName)), | |
| ExpressionStatement(MemberExpression(VariableName,VariableName)), | |
| ExpressionStatement(MemberExpression(CallExpression(VariableName,ArgList),String)), | |
| ReturnStatement(return,CallExpression(MemberExpression(CallExpression(MemberExpression(CallExpression( | |
| MemberExpression(VariableName,PropertyName),ArgList),PropertyName),ArgList(VariableName)),PropertyName),ArgList(VariableName)))) | |
| # Callback chain | |
| return this.map(function (a) { | |
| return a.b; | |
| }) | |
| // a comment | |
| .filter(function (c) { | |
| return 2; | |
| }); | |
| ==> | |
| Script(ReturnStatement(return,CallExpression(MemberExpression(CallExpression(MemberExpression(this,PropertyName), | |
| ArgList(FunctionExpression(function,ParamList(VariableDefinition),Block(ReturnStatement(return,MemberExpression(VariableName,PropertyName)))))), | |
| LineComment,PropertyName),ArgList(FunctionExpression(function,ParamList(VariableDefinition),Block(ReturnStatement(return,Number))))))) | |
| # Function calls | |
| x.someMethod(arg1, "arg2"); | |
| (function(x, y) { | |
| }(a, b)); | |
| f(new foo.bar(1), 2); | |
| ==> | |
| Script( | |
| ExpressionStatement(CallExpression(MemberExpression(VariableName,PropertyName),ArgList(VariableName,String))), | |
| ExpressionStatement(ParenthesizedExpression(CallExpression(FunctionExpression(function,ParamList(VariableDefinition,VariableDefinition),Block), | |
| ArgList(VariableName,VariableName)))), | |
| ExpressionStatement(CallExpression(VariableName,ArgList(NewExpression(new,MemberExpression(VariableName,PropertyName),ArgList(Number)),Number)))) | |
| # Constructor calls | |
| new foo(1); | |
| new module.Klass(1, "two"); | |
| new Thing; | |
| ==> | |
| Script( | |
| ExpressionStatement(NewExpression(new,VariableName,ArgList(Number))), | |
| ExpressionStatement(NewExpression(new,MemberExpression(VariableName,PropertyName),ArgList(Number,String))), | |
| ExpressionStatement(NewExpression(new,VariableName))) | |
| # Await Expressions | |
| await asyncFunction(); | |
| await asyncPromise; | |
| ==> | |
| Script( | |
| ExpressionStatement(AwaitExpression(await,CallExpression(VariableName,ArgList))), | |
| ExpressionStatement(AwaitExpression(await,VariableName))) | |
| # Numeric operators | |
| i++; | |
| i--; | |
| i + j * 3 - j % 5; | |
| 2 ** i * 3; | |
| 2 * i ** 3; | |
| +x; | |
| -x; | |
| ==> | |
| Script( | |
| ExpressionStatement(PostfixExpression(VariableName,ArithOp)), | |
| ExpressionStatement(PostfixExpression(VariableName,ArithOp)), | |
| ExpressionStatement(BinaryExpression(BinaryExpression(VariableName,ArithOp,BinaryExpression(VariableName,ArithOp,Number)),ArithOp,BinaryExpression(VariableName,ArithOp,Number))), | |
| ExpressionStatement(BinaryExpression(BinaryExpression(Number,ArithOp,VariableName),ArithOp,Number)), | |
| ExpressionStatement(BinaryExpression(Number,ArithOp,BinaryExpression(VariableName,ArithOp,Number))), | |
| ExpressionStatement(UnaryExpression(ArithOp,VariableName)), | |
| ExpressionStatement(UnaryExpression(ArithOp,VariableName))) | |
| # Boolean operators | |
| i || j; | |
| i && j; | |
| i ?? j; | |
| !a && !b || !c && !d; | |
| ==> | |
| Script( | |
| ExpressionStatement(BinaryExpression(VariableName,LogicOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,LogicOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,LogicOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(BinaryExpression(UnaryExpression(LogicOp,VariableName),LogicOp, | |
| UnaryExpression(LogicOp,VariableName)),LogicOp,BinaryExpression(UnaryExpression(LogicOp,VariableName),LogicOp, | |
| UnaryExpression(LogicOp,VariableName))))) | |
| # Bitwise operators | |
| i >> j; | |
| i >>> j; | |
| i << j; | |
| i & j; | |
| i | j; | |
| ~i ^ ~j; | |
| ==> | |
| Script( | |
| ExpressionStatement(BinaryExpression(VariableName,BitOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,BitOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,BitOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,BitOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,BitOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(UnaryExpression(BitOp,VariableName),BitOp,UnaryExpression(BitOp,VariableName)))) | |
| # Relational operators | |
| x < y; | |
| x <= y; | |
| x == y; | |
| x === y; | |
| x != y; | |
| x !== y; | |
| x > y; | |
| x >= y; | |
| ==> | |
| Script( | |
| ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,CompareOp,VariableName))) | |
| # Word operators | |
| x in y; | |
| x instanceof y; | |
| !x instanceof y; | |
| ==> | |
| Script( | |
| ExpressionStatement(BinaryExpression(VariableName,in,VariableName)), | |
| ExpressionStatement(BinaryExpression(VariableName,instanceof,VariableName)), | |
| ExpressionStatement(BinaryExpression(UnaryExpression(LogicOp,VariableName),instanceof,VariableName))) | |
| # Assignments | |
| x = 0; | |
| x.y = 0; | |
| x["y"] = 0; | |
| async = 0; | |
| [a, b = 2] = foo; | |
| ({a, b, ...d} = c); | |
| ==> | |
| Script( | |
| ExpressionStatement(AssignmentExpression(VariableName,Equals,Number)), | |
| ExpressionStatement(AssignmentExpression(MemberExpression(VariableName,PropertyName),Equals,Number)), | |
| ExpressionStatement(AssignmentExpression(MemberExpression(VariableName,String),Equals,Number)), | |
| ExpressionStatement(AssignmentExpression(VariableName,Equals,Number)), | |
| ExpressionStatement(AssignmentExpression(ArrayPattern(VariableDefinition,VariableDefinition,Equals,Number),Equals,VariableName)), | |
| ExpressionStatement(ParenthesizedExpression(AssignmentExpression(ObjectPattern( | |
| PatternProperty(PropertyName),PatternProperty(PropertyName),PatternProperty(Spread,VariableDefinition)),Equals,VariableName)))) | |
| # Comma operator | |
| a = 1, b = 2; | |
| c = {d: (3, 4 + 5)}; | |
| ==> | |
| Script( | |
| ExpressionStatement(SequenceExpression(AssignmentExpression(VariableName,Equals,Number),AssignmentExpression(VariableName,Equals,Number))), | |
| ExpressionStatement(AssignmentExpression(VariableName,Equals,ObjectExpression( | |
| Property(PropertyDefinition,ParenthesizedExpression(SequenceExpression(Number,BinaryExpression(Number,ArithOp,Number)))))))) | |
| # Punctuation | |
| (foo(1, 2), bar); | |
| ==> | |
| Script(ExpressionStatement(ParenthesizedExpression( | |
| "(",SequenceExpression(CallExpression(VariableName,ArgList("(",Number,Number,")")),",",VariableName),")"))) | |
| # Doesn't choke on unfinished ternary operator | |
| 1?1 | |
| ==> | |
| Script(ExpressionStatement(ConditionalExpression(Number,LogicOp,Number,⚠))) | |
| # Can handle unterminated template literals | |
| `f | |
| ==> | |
| Script(ExpressionStatement(TemplateString(⚠))) | |
| # Ternary with leading-dot number | |
| a?.2:.3 | |
| ==> | |
| Script(ExpressionStatement(ConditionalExpression(VariableName,LogicOp,Number,LogicOp,Number))) | |