%left POST_IF
%right IF ELSE FOR WHILE UNTIL LOOP SUPER CLASS IMPORT EXPORT
%right FORIN FOROF FORFROM BY WHEN
%right '=' ':' COMPOUND_ASSIGN RETURN THROW EXTENDS
%right YIELD
%nonassoc INDENT OUTDENT
%left BIN?
%left '||'
%left '&&'
%left '|'
%left '^'
%left '&'
%left COMPARE
%left RELATION
%left SHIFT
%left '+' '-'
%left MATH
%right UNARY_MATH
%right '**'
%right AWAIT
%right UNARY
%left '?'
%nonassoc '++' '--'
%left CALL_START CALL_END
%left '.' '?.' '::' '?::'
%%
Root
:
{return $$ = yy.addLocationDataFn(@1, @1)(new yy.Block);}
| Body
{return $$ = $1;}
;
Body
: Line
{$$ = yy.addLocationDataFn(@1, @1)(yy.Block.wrap([$1]));}
| Body TERMINATOR Line
{$$ = yy.addLocationDataFn(@1, @3)($1.push($3));}
| Body TERMINATOR
{$$ = $1;}
;
Line
: Expression
{$$ = $1;}
| Statement
{$$ = $1;}
| FuncDirective
{$$ = $1;}
;
FuncDirective
: YieldReturn
{$$ = $1;}
| AwaitReturn
{$$ = $1;}
;
Statement
: Return
{$$ = $1;}
| Comment
{$$ = $1;}
| STATEMENT
{$$ = yy.addLocationDataFn(@1, @1)(new yy.StatementLiteral($1));}
| Import
{$$ = $1;}
| Export
{$$ = $1;}
;
Expression
: Value
{$$ = $1;}
| Invocation
{$$ = $1;}
| Code
{$$ = $1;}
| Operation
{$$ = $1;}
| Assign
{$$ = $1;}
| If
{$$ = $1;}
| Try
{$$ = $1;}
| While
{$$ = $1;}
| For
{$$ = $1;}
| Switch
{$$ = $1;}
| Class
{$$ = $1;}
| Throw
{$$ = $1;}
| Yield
{$$ = $1;}
;
Yield
: YIELD
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Op($1, new yy.Value(new yy.Literal(''))));}
| YIELD Expression
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Op($1, $2));}
| YIELD FROM Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($1.concat($2), $3));}
;
Block
: INDENT OUTDENT
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Block);}
| INDENT Body OUTDENT
{$$ = yy.addLocationDataFn(@1, @3)($2);}
;
Identifier
: IDENTIFIER
{$$ = yy.addLocationDataFn(@1, @1)(new yy.IdentifierLiteral($1));}
;
Property
: PROPERTY
{$$ = yy.addLocationDataFn(@1, @1)(new yy.PropertyName($1));}
;
AlphaNumeric
: NUMBER
{$$ = yy.addLocationDataFn(@1, @1)(new yy.NumberLiteral($1));}
| String
{$$ = $1;}
;
String
: STRING
{$$ = yy.addLocationDataFn(@1, @1)(new yy.StringLiteral($1));}
| STRING_START Body STRING_END
{$$ = yy.addLocationDataFn(@1, @3)(new yy.StringWithInterpolations($2));}
;
Regex
: REGEX
{$$ = yy.addLocationDataFn(@1, @1)(new yy.RegexLiteral($1));}
| REGEX_START Invocation REGEX_END
{$$ = yy.addLocationDataFn(@1, @3)(new yy.RegexWithInterpolations($2.args));}
;
Literal
: AlphaNumeric
{$$ = $1;}
| JS
{$$ = yy.addLocationDataFn(@1, @1)(new yy.PassthroughLiteral($1));}
| Regex
{$$ = $1;}
| UNDEFINED
{$$ = yy.addLocationDataFn(@1, @1)(new yy.UndefinedLiteral);}
| NULL
{$$ = yy.addLocationDataFn(@1, @1)(new yy.NullLiteral);}
| BOOL
{$$ = yy.addLocationDataFn(@1, @1)(new yy.BooleanLiteral($1));}
| INFINITY
{$$ = yy.addLocationDataFn(@1, @1)(new yy.InfinityLiteral($1));}
| NAN
{$$ = yy.addLocationDataFn(@1, @1)(new yy.NaNLiteral);}
;
Assign
: Assignable '=' Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Assign($1, $3));}
| Assignable '=' TERMINATOR Expression
{$$ = yy.addLocationDataFn(@1, @4)(new yy.Assign($1, $4));}
| Assignable '=' INDENT Expression OUTDENT
{$$ = yy.addLocationDataFn(@1, @5)(new yy.Assign($1, $4));}
;
AssignObj
: ObjAssignable
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
| ObjAssignable ':' Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Assign(yy.addLocationDataFn(@1)(new yy.Value($1)), $3, 'object', {
operatorToken: yy.addLocationDataFn(@2)(new yy.Literal($2))
}));}
| ObjAssignable ':' INDENT Expression OUTDENT
{$$ = yy.addLocationDataFn(@1, @5)(new yy.Assign(yy.addLocationDataFn(@1)(new yy.Value($1)), $4, 'object', {
operatorToken: yy.addLocationDataFn(@2)(new yy.Literal($2))
}));}
| SimpleObjAssignable '=' Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Assign(yy.addLocationDataFn(@1)(new yy.Value($1)), $3, null, {
operatorToken: yy.addLocationDataFn(@2)(new yy.Literal($2))
}));}
| SimpleObjAssignable '=' INDENT Expression OUTDENT
{$$ = yy.addLocationDataFn(@1, @5)(new yy.Assign(yy.addLocationDataFn(@1)(new yy.Value($1)), $4, null, {
operatorToken: yy.addLocationDataFn(@2)(new yy.Literal($2))
}));}
| Comment
{$$ = $1;}
;
SimpleObjAssignable
: Identifier
{$$ = $1;}
| Property
{$$ = $1;}
| ThisProperty
{$$ = $1;}
;
ObjAssignable
: SimpleObjAssignable
{$$ = $1;}
| AlphaNumeric
{$$ = $1;}
;
Return
: RETURN Expression
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Return($2));}
| RETURN
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Return);}
;
YieldReturn
: YIELD RETURN Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.YieldReturn($3));}
| YIELD RETURN
{$$ = yy.addLocationDataFn(@1, @2)(new yy.YieldReturn);}
;
AwaitReturn
: AWAIT RETURN Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.AwaitReturn($3));}
| AWAIT RETURN
{$$ = yy.addLocationDataFn(@1, @2)(new yy.AwaitReturn);}
;
Comment
: HERECOMMENT
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Comment($1));}
;
Code
: PARAM_START ParamList PARAM_END FuncGlyph Block
{$$ = yy.addLocationDataFn(@1, @5)(new yy.Code($2, $5, $4));}
| FuncGlyph Block
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Code([], $2, $1));}
;
FuncGlyph
: '->'
{$$ = yy.addLocationDataFn(@1, @1)('func');}
| '=>'
{$$ = yy.addLocationDataFn(@1, @1)('boundfunc');}
;
OptComma
:
{$$ = $1;}
| ','
{$$ = $1;}
;
ParamList
:
{$$ = yy.addLocationDataFn(@1, @1)([]);}
| Param
{$$ = yy.addLocationDataFn(@1, @1)([$1]);}
| ParamList ',' Param
{$$ = yy.addLocationDataFn(@1, @3)($1.concat($3));}
| ParamList OptComma TERMINATOR Param
{$$ = yy.addLocationDataFn(@1, @4)($1.concat($4));}
| ParamList OptComma INDENT ParamList OptComma OUTDENT
{$$ = yy.addLocationDataFn(@1, @6)($1.concat($4));}
;
Param
: ParamVar
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Param($1));}
| ParamVar '...'
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Param($1, null, true));}
| ParamVar '=' Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Param($1, $3));}
| '...'
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Expansion);}
;
ParamVar
: Identifier
{$$ = $1;}
| ThisProperty
{$$ = $1;}
| Array
{$$ = $1;}
| Object
{$$ = $1;}
;
Splat
: Expression '...'
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Splat($1));}
;
SimpleAssignable
: Identifier
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
| Value Accessor
{$$ = yy.addLocationDataFn(@1, @2)($1.add($2));}
| Invocation Accessor
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Value($1, [].concat($2)));}
| ThisProperty
{$$ = $1;}
;
Assignable
: SimpleAssignable
{$$ = $1;}
| Array
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
| Object
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
;
Value
: Assignable
{$$ = $1;}
| Literal
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
| Parenthetical
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
| Range
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
| This
{$$ = $1;}
| Super
{$$ = $1;}
;
Super
: SUPER '.' Property
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Super(yy.addLocationDataFn(@3)(new yy.Access($3))));}
| SUPER INDEX_START Expression INDEX_END
{$$ = yy.addLocationDataFn(@1, @4)(new yy.Super(yy.addLocationDataFn(@3)(new yy.Index($3))));}
;
Accessor
: '.' Property
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Access($2));}
| '?.' Property
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Access($2, 'soak'));}
| '::' Property
{$$ = yy.addLocationDataFn(@1, @2)([yy.addLocationDataFn(@1)(new yy.Access(new yy.PropertyName('prototype'))), yy.addLocationDataFn(@2)(new yy.Access($2))]);}
| '?::' Property
{$$ = yy.addLocationDataFn(@1, @2)([yy.addLocationDataFn(@1)(new yy.Access(new yy.PropertyName('prototype'), 'soak')), yy.addLocationDataFn(@2)(new yy.Access($2))]);}
| '::'
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Access(new yy.PropertyName('prototype')));}
| Index
{$$ = $1;}
;
Index
: INDEX_START IndexValue INDEX_END
{$$ = yy.addLocationDataFn(@1, @3)($2);}
| INDEX_SOAK Index
{$$ = yy.addLocationDataFn(@1, @2)(yy.extend($2, {
soak: true
}));}
;
IndexValue
: Expression
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Index($1));}
| Slice
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Slice($1));}
;
Object
: '{' AssignList OptComma '}'
{$$ = yy.addLocationDataFn(@1, @4)(new yy.Obj($2, $1.generated));}
;
AssignList
:
{$$ = yy.addLocationDataFn(@1, @1)([]);}
| AssignObj
{$$ = yy.addLocationDataFn(@1, @1)([$1]);}
| AssignList ',' AssignObj
{$$ = yy.addLocationDataFn(@1, @3)($1.concat($3));}
| AssignList OptComma TERMINATOR AssignObj
{$$ = yy.addLocationDataFn(@1, @4)($1.concat($4));}
| AssignList OptComma INDENT AssignList OptComma OUTDENT
{$$ = yy.addLocationDataFn(@1, @6)($1.concat($4));}
;
Class
: CLASS
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Class);}
| CLASS Block
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Class(null, null, $2));}
| CLASS EXTENDS Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Class(null, $3));}
| CLASS EXTENDS Expression Block
{$$ = yy.addLocationDataFn(@1, @4)(new yy.Class(null, $3, $4));}
| CLASS SimpleAssignable
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Class($2));}
| CLASS SimpleAssignable Block
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Class($2, null, $3));}
| CLASS SimpleAssignable EXTENDS Expression
{$$ = yy.addLocationDataFn(@1, @4)(new yy.Class($2, $4));}
| CLASS SimpleAssignable EXTENDS Expression Block
{$$ = yy.addLocationDataFn(@1, @5)(new yy.Class($2, $4, $5));}
;
Import
: IMPORT String
{$$ = yy.addLocationDataFn(@1, @2)(new yy.ImportDeclaration(null, $2));}
| IMPORT ImportDefaultSpecifier FROM String
{$$ = yy.addLocationDataFn(@1, @4)(new yy.ImportDeclaration(new yy.ImportClause($2, null), $4));}
| IMPORT ImportNamespaceSpecifier FROM String
{$$ = yy.addLocationDataFn(@1, @4)(new yy.ImportDeclaration(new yy.ImportClause(null, $2), $4));}
| IMPORT '{' '}' FROM String
{$$ = yy.addLocationDataFn(@1, @5)(new yy.ImportDeclaration(new yy.ImportClause(null, new yy.ImportSpecifierList([])), $5));}
| IMPORT '{' ImportSpecifierList OptComma '}' FROM String
{$$ = yy.addLocationDataFn(@1, @7)(new yy.ImportDeclaration(new yy.ImportClause(null, new yy.ImportSpecifierList($3)), $7));}
| IMPORT ImportDefaultSpecifier ',' ImportNamespaceSpecifier FROM String
{$$ = yy.addLocationDataFn(@1, @6)(new yy.ImportDeclaration(new yy.ImportClause($2, $4), $6));}
| IMPORT ImportDefaultSpecifier ',' '{' ImportSpecifierList OptComma '}' FROM String
{$$ = yy.addLocationDataFn(@1, @9)(new yy.ImportDeclaration(new yy.ImportClause($2, new yy.ImportSpecifierList($5)), $9));}
;
ImportSpecifierList
: ImportSpecifier
{$$ = yy.addLocationDataFn(@1, @1)([$1]);}
| ImportSpecifierList ',' ImportSpecifier
{$$ = yy.addLocationDataFn(@1, @3)($1.concat($3));}
| ImportSpecifierList OptComma TERMINATOR ImportSpecifier
{$$ = yy.addLocationDataFn(@1, @4)($1.concat($4));}
| INDENT ImportSpecifierList OptComma OUTDENT
{$$ = yy.addLocationDataFn(@1, @4)($2);}
| ImportSpecifierList OptComma INDENT ImportSpecifierList OptComma OUTDENT
{$$ = yy.addLocationDataFn(@1, @6)($1.concat($4));}
;
ImportSpecifier
: Identifier
{$$ = yy.addLocationDataFn(@1, @1)(new yy.ImportSpecifier($1));}
| Identifier AS Identifier
{$$ = yy.addLocationDataFn(@1, @3)(new yy.ImportSpecifier($1, $3));}
| DEFAULT
{$$ = yy.addLocationDataFn(@1, @1)(new yy.ImportSpecifier(new yy.Literal($1)));}
| DEFAULT AS Identifier
{$$ = yy.addLocationDataFn(@1, @3)(new yy.ImportSpecifier(new yy.Literal($1), $3));}
;
ImportDefaultSpecifier
: Identifier
{$$ = yy.addLocationDataFn(@1, @1)(new yy.ImportDefaultSpecifier($1));}
;
ImportNamespaceSpecifier
: IMPORT_ALL AS Identifier
{$$ = yy.addLocationDataFn(@1, @3)(new yy.ImportNamespaceSpecifier(new yy.Literal($1), $3));}
;
Export
: EXPORT '{' '}'
{$$ = yy.addLocationDataFn(@1, @3)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([])));}
| EXPORT '{' ExportSpecifierList OptComma '}'
{$$ = yy.addLocationDataFn(@1, @5)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($3)));}
| EXPORT Class
{$$ = yy.addLocationDataFn(@1, @2)(new yy.ExportNamedDeclaration($2));}
| EXPORT Identifier '=' Expression
{$$ = yy.addLocationDataFn(@1, @4)(new yy.ExportNamedDeclaration(new yy.Assign($2, $4, null, {
moduleDeclaration: 'export'
})));}
| EXPORT Identifier '=' TERMINATOR Expression
{$$ = yy.addLocationDataFn(@1, @5)(new yy.ExportNamedDeclaration(new yy.Assign($2, $5, null, {
moduleDeclaration: 'export'
})));}
| EXPORT Identifier '=' INDENT Expression OUTDENT
{$$ = yy.addLocationDataFn(@1, @6)(new yy.ExportNamedDeclaration(new yy.Assign($2, $5, null, {
moduleDeclaration: 'export'
})));}
| EXPORT DEFAULT Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.ExportDefaultDeclaration($3));}
| EXPORT EXPORT_ALL FROM String
{$$ = yy.addLocationDataFn(@1, @4)(new yy.ExportAllDeclaration(new yy.Literal($2), $4));}
| EXPORT '{' ExportSpecifierList OptComma '}' FROM String
{$$ = yy.addLocationDataFn(@1, @7)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($3), $7));}
;
ExportSpecifierList
: ExportSpecifier
{$$ = yy.addLocationDataFn(@1, @1)([$1]);}
| ExportSpecifierList ',' ExportSpecifier
{$$ = yy.addLocationDataFn(@1, @3)($1.concat($3));}
| ExportSpecifierList OptComma TERMINATOR ExportSpecifier
{$$ = yy.addLocationDataFn(@1, @4)($1.concat($4));}
| INDENT ExportSpecifierList OptComma OUTDENT
{$$ = yy.addLocationDataFn(@1, @4)($2);}
| ExportSpecifierList OptComma INDENT ExportSpecifierList OptComma OUTDENT
{$$ = yy.addLocationDataFn(@1, @6)($1.concat($4));}
;
ExportSpecifier
: Identifier
{$$ = yy.addLocationDataFn(@1, @1)(new yy.ExportSpecifier($1));}
| Identifier AS Identifier
{$$ = yy.addLocationDataFn(@1, @3)(new yy.ExportSpecifier($1, $3));}
| Identifier AS DEFAULT
{$$ = yy.addLocationDataFn(@1, @3)(new yy.ExportSpecifier($1, new yy.Literal($3)));}
| DEFAULT
{$$ = yy.addLocationDataFn(@1, @1)(new yy.ExportSpecifier(new yy.Literal($1)));}
| DEFAULT AS Identifier
{$$ = yy.addLocationDataFn(@1, @3)(new yy.ExportSpecifier(new yy.Literal($1), $3));}
;
Invocation
: Value OptFuncExist String
{$$ = yy.addLocationDataFn(@1, @3)(new yy.TaggedTemplateCall($1, $3, $2));}
| Value OptFuncExist Arguments
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Call($1, $3, $2));}
| Invocation OptFuncExist Arguments
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Call($1, $3, $2));}
| SUPER OptFuncExist Arguments
{$$ = yy.addLocationDataFn(@1, @3)(new yy.SuperCall(yy.addLocationDataFn(@1)(new yy.Super), $3, $2));}
;
OptFuncExist
:
{$$ = yy.addLocationDataFn(@1, @1)(false);}
| FUNC_EXIST
{$$ = yy.addLocationDataFn(@1, @1)(true);}
;
Arguments
: CALL_START CALL_END
{$$ = yy.addLocationDataFn(@1, @2)([]);}
| CALL_START ArgList OptComma CALL_END
{$$ = yy.addLocationDataFn(@1, @4)($2);}
;
This
: THIS
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Value(new yy.ThisLiteral));}
| '@'
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Value(new yy.ThisLiteral));}
;
ThisProperty
: '@' Property
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Value(yy.addLocationDataFn(@1)(new yy.ThisLiteral), [yy.addLocationDataFn(@2)(new yy.Access($2))], 'this'));}
;
Array
: '[' ']'
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Arr([]));}
| '[' ArgList OptComma ']'
{$$ = yy.addLocationDataFn(@1, @4)(new yy.Arr($2));}
;
RangeDots
: '..'
{$$ = yy.addLocationDataFn(@1, @1)('inclusive');}
| '...'
{$$ = yy.addLocationDataFn(@1, @1)('exclusive');}
;
Range
: '[' Expression RangeDots Expression ']'
{$$ = yy.addLocationDataFn(@1, @5)(new yy.Range($2, $4, $3));}
;
Slice
: Expression RangeDots Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Range($1, $3, $2));}
| Expression RangeDots
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Range($1, null, $2));}
| RangeDots Expression
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Range(null, $2, $1));}
| RangeDots
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Range(null, null, $1));}
;
ArgList
: Arg
{$$ = yy.addLocationDataFn(@1, @1)([$1]);}
| ArgList ',' Arg
{$$ = yy.addLocationDataFn(@1, @3)($1.concat($3));}
| ArgList OptComma TERMINATOR Arg
{$$ = yy.addLocationDataFn(@1, @4)($1.concat($4));}
| INDENT ArgList OptComma OUTDENT
{$$ = yy.addLocationDataFn(@1, @4)($2);}
| ArgList OptComma INDENT ArgList OptComma OUTDENT
{$$ = yy.addLocationDataFn(@1, @6)($1.concat($4));}
;
Arg
: Expression
{$$ = $1;}
| Splat
{$$ = $1;}
| '...'
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Expansion);}
;
SimpleArgs
: Expression
{$$ = $1;}
| SimpleArgs ',' Expression
{$$ = yy.addLocationDataFn(@1, @3)([].concat($1, $3));}
;
Try
: TRY Block
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Try($2));}
| TRY Block Catch
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Try($2, $3[0], $3[1]));}
| TRY Block FINALLY Block
{$$ = yy.addLocationDataFn(@1, @4)(new yy.Try($2, null, null, $4));}
| TRY Block Catch FINALLY Block
{$$ = yy.addLocationDataFn(@1, @5)(new yy.Try($2, $3[0], $3[1], $5));}
;
Catch
: CATCH Identifier Block
{$$ = yy.addLocationDataFn(@1, @3)([$2, $3]);}
| CATCH Object Block
{$$ = yy.addLocationDataFn(@1, @3)([yy.addLocationDataFn(@2)(new yy.Value($2)), $3]);}
| CATCH Block
{$$ = yy.addLocationDataFn(@1, @2)([null, $2]);}
;
Throw
: THROW Expression
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Throw($2));}
;
Parenthetical
: '(' Body ')'
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Parens($2));}
| '(' INDENT Body OUTDENT ')'
{$$ = yy.addLocationDataFn(@1, @5)(new yy.Parens($3));}
;
WhileSource
: WHILE Expression
{$$ = yy.addLocationDataFn(@1, @2)(new yy.While($2));}
| WHILE Expression WHEN Expression
{$$ = yy.addLocationDataFn(@1, @4)(new yy.While($2, {
guard: $4
}));}
| UNTIL Expression
{$$ = yy.addLocationDataFn(@1, @2)(new yy.While($2, {
invert: true
}));}
| UNTIL Expression WHEN Expression
{$$ = yy.addLocationDataFn(@1, @4)(new yy.While($2, {
invert: true,
guard: $4
}));}
;
While
: WhileSource Block
{$$ = yy.addLocationDataFn(@1, @2)($1.addBody($2));}
| Statement WhileSource
{$$ = yy.addLocationDataFn(@1, @2)($2.addBody(yy.addLocationDataFn(@1)(yy.Block.wrap([$1]))));}
| Expression WhileSource
{$$ = yy.addLocationDataFn(@1, @2)($2.addBody(yy.addLocationDataFn(@1)(yy.Block.wrap([$1]))));}
| Loop
{$$ = yy.addLocationDataFn(@1, @1)($1);}
;
Loop
: LOOP Block
{$$ = yy.addLocationDataFn(@1, @2)(new yy.While(yy.addLocationDataFn(@1)(new yy.BooleanLiteral('true'))).addBody($2));}
| LOOP Expression
{$$ = yy.addLocationDataFn(@1, @2)(new yy.While(yy.addLocationDataFn(@1)(new yy.BooleanLiteral('true'))).addBody(yy.addLocationDataFn(@2)(yy.Block.wrap([$2]))));}
;
For
: Statement ForBody
{$$ = yy.addLocationDataFn(@1, @2)(new yy.For($1, $2));}
| Expression ForBody
{$$ = yy.addLocationDataFn(@1, @2)(new yy.For($1, $2));}
| ForBody Block
{$$ = yy.addLocationDataFn(@1, @2)(new yy.For($2, $1));}
;
ForBody
: FOR Range
{$$ = yy.addLocationDataFn(@1, @2)({
source: yy.addLocationDataFn(@2)(new yy.Value($2))
});}
| FOR Range BY Expression
{$$ = yy.addLocationDataFn(@1, @4)({
source: yy.addLocationDataFn(@2)(new yy.Value($2)),
step: $4
});}
| ForStart ForSource
{$$ = yy.addLocationDataFn(@1, @2)((function () {
$2.own = $1.own;
$2.ownTag = $1.ownTag;
$2.name = $1[0];
$2.index = $1[1];
return $2;
}()));}
;
ForStart
: FOR ForVariables
{$$ = yy.addLocationDataFn(@1, @2)($2);}
| FOR OWN ForVariables
{$$ = yy.addLocationDataFn(@1, @3)((function () {
$3.own = true;
$3.ownTag = yy.addLocationDataFn(@2)(new yy.Literal($2));
return $3;
}()));}
;
ForValue
: Identifier
{$$ = $1;}
| ThisProperty
{$$ = $1;}
| Array
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
| Object
{$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
;
ForVariables
: ForValue
{$$ = yy.addLocationDataFn(@1, @1)([$1]);}
| ForValue ',' ForValue
{$$ = yy.addLocationDataFn(@1, @3)([$1, $3]);}
;
ForSource
: FORIN Expression
{$$ = yy.addLocationDataFn(@1, @2)({
source: $2
});}
| FOROF Expression
{$$ = yy.addLocationDataFn(@1, @2)({
source: $2,
object: true
});}
| FORIN Expression WHEN Expression
{$$ = yy.addLocationDataFn(@1, @4)({
source: $2,
guard: $4
});}
| FOROF Expression WHEN Expression
{$$ = yy.addLocationDataFn(@1, @4)({
source: $2,
guard: $4,
object: true
});}
| FORIN Expression BY Expression
{$$ = yy.addLocationDataFn(@1, @4)({
source: $2,
step: $4
});}
| FORIN Expression WHEN Expression BY Expression
{$$ = yy.addLocationDataFn(@1, @6)({
source: $2,
guard: $4,
step: $6
});}
| FORIN Expression BY Expression WHEN Expression
{$$ = yy.addLocationDataFn(@1, @6)({
source: $2,
step: $4,
guard: $6
});}
| FORFROM Expression
{$$ = yy.addLocationDataFn(@1, @2)({
source: $2,
from: true
});}
| FORFROM Expression WHEN Expression
{$$ = yy.addLocationDataFn(@1, @4)({
source: $2,
guard: $4,
from: true
});}
;
Switch
: SWITCH Expression INDENT Whens OUTDENT
{$$ = yy.addLocationDataFn(@1, @5)(new yy.Switch($2, $4));}
| SWITCH Expression INDENT Whens ELSE Block OUTDENT
{$$ = yy.addLocationDataFn(@1, @7)(new yy.Switch($2, $4, $6));}
| SWITCH INDENT Whens OUTDENT
{$$ = yy.addLocationDataFn(@1, @4)(new yy.Switch(null, $3));}
| SWITCH INDENT Whens ELSE Block OUTDENT
{$$ = yy.addLocationDataFn(@1, @6)(new yy.Switch(null, $3, $5));}
;
Whens
: When
{$$ = $1;}
| Whens When
{$$ = yy.addLocationDataFn(@1, @2)($1.concat($2));}
;
When
: LEADING_WHEN SimpleArgs Block
{$$ = yy.addLocationDataFn(@1, @3)([[$2, $3]]);}
| LEADING_WHEN SimpleArgs Block TERMINATOR
{$$ = yy.addLocationDataFn(@1, @4)([[$2, $3]]);}
;
IfBlock
: IF Expression Block
{$$ = yy.addLocationDataFn(@1, @3)(new yy.If($2, $3, {
type: $1
}));}
| IfBlock ELSE IF Expression Block
{$$ = yy.addLocationDataFn(@1, @5)($1.addElse(yy.addLocationDataFn(@3, @5)(new yy.If($4, $5, {
type: $3
}))));}
;
If
: IfBlock
{$$ = $1;}
| IfBlock ELSE Block
{$$ = yy.addLocationDataFn(@1, @3)($1.addElse($3));}
| Statement POST_IF Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.If($3, yy.addLocationDataFn(@1)(yy.Block.wrap([$1])), {
type: $2,
statement: true
}));}
| Expression POST_IF Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.If($3, yy.addLocationDataFn(@1)(yy.Block.wrap([$1])), {
type: $2,
statement: true
}));}
;
Operation
: UNARY Expression
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Op($1, $2));}
| UNARY_MATH Expression
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Op($1, $2));}
| '-' Expression %prec UNARY_MATH
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Op('-', $2));}
| '+' Expression %prec UNARY_MATH
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Op('+', $2));}
| AWAIT Expression
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Op($1, $2));}
| '--' SimpleAssignable
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Op('--', $2));}
| '++' SimpleAssignable
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Op('++', $2));}
| SimpleAssignable '--'
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Op('--', $1, null, true));}
| SimpleAssignable '++'
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Op('++', $1, null, true));}
| Expression '?'
{$$ = yy.addLocationDataFn(@1, @2)(new yy.Existence($1));}
| Expression '+' Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Op('+', $1, $3));}
| Expression '-' Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Op('-', $1, $3));}
| Expression MATH Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
| Expression '**' Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
| Expression SHIFT Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
| Expression COMPARE Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
| Expression '&' Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
| Expression '^' Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
| Expression '|' Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
| Expression '&&' Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
| Expression '||' Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
| Expression BIN? Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
| Expression RELATION Expression
{$$ = yy.addLocationDataFn(@1, @3)((function () {
if ($2.charAt(0) === '!') {
return new yy.Op($2.slice(1), $1, $3).invert();
} else {
return new yy.Op($2, $1, $3);
}
}()));}
| SimpleAssignable COMPOUND_ASSIGN Expression
{$$ = yy.addLocationDataFn(@1, @3)(new yy.Assign($1, $3, $2));}
| SimpleAssignable COMPOUND_ASSIGN INDENT Expression OUTDENT
{$$ = yy.addLocationDataFn(@1, @5)(new yy.Assign($1, $4, $2));}
| SimpleAssignable COMPOUND_ASSIGN TERMINATOR Expression
{$$ = yy.addLocationDataFn(@1, @4)(new yy.Assign($1, $4, $2));}
;