Compare commits

..

No commits in common. "0d1f1323791684a01c599fea6743315f2b678840" and "5f4bf60062e5a6c79aa77ec6479145dfc2c1f9b8" have entirely different histories.

8 changed files with 137 additions and 95 deletions

View File

@ -389,7 +389,11 @@ export class Compiler {
return instructions
}
case terms.Block: {
case terms.MultiLineBlock:
case terms.SingleLineBlock:
case terms.ThenBlock:
case terms.SingleLineThenBlock:
case terms.TryBlock: {
const children = getAllChildren(node)
const instructions: ProgramItem[] = []

View File

@ -309,7 +309,7 @@ export const getDotGetParts = (node: SyntaxNode, input: string) => {
export const getTryExprParts = (node: SyntaxNode, input: string) => {
const children = getAllChildren(node)
// First child is always 'try' keyword, second is colon, third is Block or statement
// First child is always 'try' keyword, second is colon, third is TryBlock or statement
const [tryKeyword, _colon, tryBlock, ...rest] = children
if (!tryKeyword || !tryBlock) {

View File

@ -25,18 +25,8 @@
Underscore { "_" }
Regex { "//" (![/\\\n[] | "\\" ![\n] | "[" (![\n\\\]] | "\\" ![\n])* "]")+ ("//" $[gimsuy]*)? } // Stolen from the lezer JavaScript grammar
"|"[@name=operator]
}
end { @specialize[@name=keyword]<Identifier, "end"> }
while { @specialize[@name=keyword]<Identifier, "while"> }
if { @specialize[@name=keyword]<Identifier, "if"> }
else { @specialize[@name=keyword]<Identifier, "else"> }
elseif { @specialize[@name=keyword]<Identifier, "elseif"> }
try { @specialize[@name=keyword]<Identifier, "try"> }
catch { @specialize[@name=keyword]<Identifier, "catch"> }
finally { @specialize[@name=keyword]<Identifier, "finally"> }
throw { @specialize[@name=keyword]<Identifier, "throw"> }
null { @specialize[@name=Null]<Identifier, "null"> }
}
@external tokens tokenizer from "./tokenizer" { Identifier, AssignableIdentifier, Word, IdentifierBeforeDot }
@external specialize {Identifier} specializeKeyword from "./tokenizer" { Do }
@ -57,6 +47,7 @@ item {
newlineOrSemicolon // allow blank lines
}
consumeToTerminator {
PipeExpr |
WhileExpr |
@ -81,11 +72,23 @@ pipeOperand {
}
WhileExpr {
while (ConditionalOp | expression) colon Block end
singleLineWhileExpr | multiLineWhileExpr
}
Block {
consumeToTerminator | newlineOrSemicolon block
SingleLineBlock {
consumeToTerminator
}
MultiLineBlock {
block
}
singleLineWhileExpr {
@specialize[@name=keyword]<Identifier, "while"> (ConditionalOp | expression) colon SingleLineBlock @specialize[@name=keyword]<Identifier, "end">
}
multiLineWhileExpr {
@specialize[@name=keyword]<Identifier, "while"> (ConditionalOp | expression) colon newlineOrSemicolon MultiLineBlock @specialize[@name=keyword]<Identifier, "end">
}
FunctionCallOrIdentifier {
@ -104,6 +107,7 @@ arg {
PositionalArg | NamedArg
}
PositionalArg {
expression | FunctionDef | Underscore
}
@ -113,35 +117,71 @@ NamedArg {
}
FunctionDef {
Do Params colon (consumeToTerminator | newlineOrSemicolon block) CatchExpr? FinallyExpr? end
singleLineFunctionDef | multilineFunctionDef
}
singleLineFunctionDef {
Do Params colon consumeToTerminator CatchExpr? FinallyExpr? @specialize[@name=keyword]<Identifier, "end">
}
multilineFunctionDef {
Do Params colon newlineOrSemicolon block CatchExpr? FinallyExpr? @specialize[@name=keyword]<Identifier, "end">
}
IfExpr {
if (ConditionalOp | expression) colon Block ElseIfExpr* ElseExpr? end
singleLineIf | multilineIf
}
singleLineIf {
@specialize[@name=keyword]<Identifier, "if"> (ConditionalOp | expression) colon SingleLineThenBlock @specialize[@name=keyword]<Identifier, "end">
}
multilineIf {
@specialize[@name=keyword]<Identifier, "if"> (ConditionalOp | expression) colon newlineOrSemicolon ThenBlock ElseIfExpr* ElseExpr? @specialize[@name=keyword]<Identifier, "end">
}
ElseIfExpr {
elseif (ConditionalOp | expression) colon Block
@specialize[@name=keyword]<Identifier, "elseif"> (ConditionalOp | expression) colon newlineOrSemicolon ThenBlock
}
ElseExpr {
else colon Block
@specialize[@name=keyword]<Identifier, "else"> colon newlineOrSemicolon ThenBlock
}
ThenBlock {
block
}
SingleLineThenBlock {
consumeToTerminator
}
TryExpr {
try colon Block CatchExpr? FinallyExpr? end
singleLineTry | multilineTry
}
singleLineTry {
@specialize[@name=keyword]<Identifier, "try"> colon consumeToTerminator CatchExpr? FinallyExpr? @specialize[@name=keyword]<Identifier, "end">
}
multilineTry {
@specialize[@name=keyword]<Identifier, "try"> colon newlineOrSemicolon TryBlock CatchExpr? FinallyExpr? @specialize[@name=keyword]<Identifier, "end">
}
CatchExpr {
catch Identifier colon Block
@specialize[@name=keyword]<Identifier, "catch"> Identifier colon (newlineOrSemicolon TryBlock | consumeToTerminator)
}
FinallyExpr {
finally colon Block
@specialize[@name=keyword]<Identifier, "finally"> colon (newlineOrSemicolon TryBlock | consumeToTerminator)
}
TryBlock {
block
}
Throw {
throw (BinOp | ConditionalOp | expression)
@specialize[@name=keyword]<Identifier, "throw"> (BinOp | ConditionalOp | expression)
}
ConditionalOp {
@ -160,7 +200,7 @@ Params {
}
NamedParam {
NamedArgPrefix (String | Number | Boolean | null)
NamedArgPrefix (String | Number | Boolean | @specialize[@name=Null]<Identifier, "null">)
}
Assign {
@ -198,6 +238,7 @@ expression {
}
String { "'" stringContent* "'" }
}
stringContent {
@ -233,7 +274,7 @@ Array {
// to go through ambiguousFunctionCall (which is what we want semantically).
// Yes, it is annoying and I gave up trying to use GLR to fix it.
expressionWithoutIdentifier {
ParenExpr | Word | String | Number | Boolean | Regex | Dict | Array | null
ParenExpr | Word | String | Number | Boolean | Regex | Dict | Array | @specialize[@name=Null]<Identifier, "null">
}
block {

View File

@ -47,18 +47,22 @@ export const
Null = 45,
colon = 46,
CatchExpr = 47,
keyword = 69,
Block = 49,
keyword = 73,
TryBlock = 49,
FinallyExpr = 50,
Underscore = 53,
Array = 54,
ConditionalOp = 55,
PositionalArg = 56,
WhileExpr = 58,
TryExpr = 60,
Throw = 62,
IfExpr = 64,
ElseIfExpr = 66,
ElseExpr = 68,
CompoundAssign = 70,
Assign = 71
SingleLineBlock = 60,
MultiLineBlock = 61,
TryExpr = 62,
Throw = 64,
IfExpr = 66,
SingleLineThenBlock = 68,
ThenBlock = 69,
ElseIfExpr = 70,
ElseExpr = 72,
CompoundAssign = 74,
Assign = 75

View File

@ -4,14 +4,14 @@ import {operatorTokenizer} from "./operatorTokenizer"
import {tokenizer, specializeKeyword} from "./tokenizer"
import {trackScope} from "./scopeTracker"
import {highlighting} from "./highlight"
const spec_Identifier = {__proto__:null,null:90, catch:96, finally:102, end:104, while:118, try:122, throw:126, if:130, elseif:134, else:138}
const spec_Identifier = {__proto__:null,null:90, catch:96, finally:102, end:104, while:118, try:126, throw:130, if:134, elseif:142, else:146}
export const parser = LRParser.deserialize({
version: 14,
states: "7vQYQbOOO#}QcO'#C{O$zOSO'#C}OOQa'#DT'#DTO&TQbO'#DdO'lQcO'#E]OOQa'#E]'#E]O(oQcO'#E]O)qQcO'#E[O*[QRO'#C|O+nQcO'#EWO,OQcO'#EWO,YQbO'#CzO-QOpO'#CxOOQ`'#EX'#EXO-VQbO'#EWO-^QRO'#DtOOQ`'#EW'#EWO-rQQO'#EVOOQ`'#EV'#EVOOQ`'#Dv'#DvQYQbOOO-zQbO'#DWO.VQbO'#DhO.zQQO'#DjO.VQbO'#DlO.VQbO'#DnO/PQbO'#DUOOQa'#E['#E[OOQ`'#Df'#DfOOQ`'#Ek'#EkOOQ`'#EO'#EOO/ZQbO,59cO0TQbO'#DPO0]QWO'#DQOOOO'#E_'#E_OOOO'#Dw'#DwO0qOSO,59iOOQa,59i,59iOOQ`'#Dx'#DxO1PQbO,5:OO1WQQO,59oOOQa,5:O,5:OO1cQbO,5:OO1mQbO,5:aO.VQbO,59hO.VQbO,59hO.VQbO,59hO.VQbO,5:PO.VQbO,5:PO.VQbO,5:PO2QQRO,59fO2XQRO,59fO2jQRO,59fO2eQQO,59fO2uQQO,59fO2}ObO,59dO3YQbO'#EPO3eQbO,59bO1mQbO,5:`OOQ`,5:q,5:qOOQ`-E7t-E7tOOQ`'#Dy'#DyO4SQbO'#DXO4_QbO'#DYOOQO'#Dz'#DzO4VQQO'#DXO4mQQO,59rO5^QRO,5:SO5eQRO,5:SO5pQbO,5:UO6WQcO,5:WO7YQcO,5:WO7jQcO,5:WO7tQRO,5:YO7{QRO,5:YOOQ`,59p,59pOOQ`-E7|-E7|OOOO,59k,59kOOOO,59l,59lOOOO-E7u-E7uOOQa1G/T1G/TOOQ`-E7v-E7vO8WQQO1G/ZOOQa1G/j1G/jO8cQbO1G/jOOQO'#D|'#D|O8WQQO1G/ZOOQa1G/Z1G/ZOOQ`'#D}'#D}O8cQbO1G/jOOQ`1G/{1G/{OOQa1G/S1G/SO9bQcO1G/SO9lQcO1G/SO9vQcO1G/SOOQa1G/k1G/kO;rQcO1G/kO;yQcO1G/kO<QQcO1G/kOOQa1G/Q1G/QOOQa1G/O1G/OO!dQbO'#C{O<XQbO'#CwOOQ`,5:k,5:kOOQ`-E7}-E7}OOQ`1G/z1G/zOOQ`-E7w-E7wO<fQQO,59sOOQO,59t,59tOOQO-E7x-E7xO<nQbO1G/^O5pQbO1G/nOOQ`'#D_'#D_O=UQbO'#D_O={QbO1G/pO5pQbO1G/tO>WQQO7+$uOOQa7+$u7+$uO>cQbO7+%UOOQa7+%U7+%UOOQO-E7z-E7zOOQ`-E7{-E7{O>mQbO7+$xO>xQbO7+$xO?iQbO7+%YOOQ`'#D{'#D{O?nQQO'#D{O?sQbO'#EhOOQ`,59y,59yO@jQbO'#D]O@oQQO'#D`OOQ`7+%[7+%[O@tQbO7+%[O@yQbO7+%[OARQbO7+%`OOQa<<Ha<<HaOOQa<<Hp<<HpOOQ`<<Hd<<HdOA^QbO<<HdOAcQbO<<HdOAkQbO<<HdOOQ`<<Ht<<HtOOQ`,5:g,5:gOOQ`-E7y-E7yOAvQQO,59wO5pQbO,59zOOQ`<<Hv<<HvOA{QbO<<HvOOQ`'#EQ'#EQOBQQbO<<HzO.VQbO'#DpOB]QQO'#DrOOQ`<<Hz<<HzOBbQbO<<HzOOQ`AN>OAN>OOBgQbOAN>OOBlQbOAN>OO5pQbO1G/cOOQ`1G/f1G/fOOQ`AN>bAN>bOOQ`-E8O-E8OOOQ`AN>fAN>fOBtQbOAN>fOByQRO,5:[OCQQRO,5:[O5pQbO,5:^OOQ`G23jG23jOC]QbOG23jOOQ`7+$}7+$}OOQ`G24QG24QO5pQbO1G/vOOQ`1G/x1G/xOOQ`LD)ULD)UOOQ`7+%b7+%b",
stateData: "Ce~O!wOS!xOS~OdPOe`OfUOg]OhfOmUOuUOvUO}UO!]gO!_hO!aiO!cjO!}[O#QQO#XRO#YSO#ZcO~OdlOfUOg]OhfOmUOuUOvUOykO}UO!VmO!}[O#QQO#XRO#YSO!ZoX#ZoX#`oX#^oX!QoX!ToX!UoX!eoX!goX~OP#OXQ#OXR#OXS#OXT#OXU#OXW#OXX#OXY#OXZ#OX[#OX]#OX^#OX~P!dOrsO#QvO#SqO#TrO~OdlOfUOg]OmUOuUOvUOykO}UO!}[O#QQO#XRO#YSO#ZwO~O#]zO~P%YOP#PXQ#PXR#PXS#PXT#PXU#PXW#PXX#PXY#PXZ#PX[#PX]#PX^#PX#Z#PX#`#PX!Q#PX!T#PX!U#PX!e#PX!g#PX~OdlOfUOg]OhfOmUOuUOvUOykO}UO!VmO!}[O#QQO#XRO#YSO#^#PX~P&[OV|O~P&[OP#OXQ#OXR#OXS#OXT#OXU#OXW#OXX#OXY#OXZ#OX[#OX]#OX^#OX~O#Z!zX#`!zX!Q!zX!T!zX!U!zX!e!zX!g!zX~P(vOP!OOQ!OOR!POS!POT!ROU!SOW!QOX!QOY!QOZ!QO[!QO]!QO^}O~O#Z!zX#`!zX!Q!zX!T!zX!U!zX!e!zX!g!zX~OP!OOQ!OOR!POS!PO~P+VOT!ROU!SO~P+VOdPOfUOg]OhfOmUOuUOvUO}UO!}[O#QQO#XRO#YSO~O!|!YO~O!Z!ZO~P+VOV|O_!]O`!]Oa!]Ob!]Oc!]O~O#Z!^O#`!^O~Od!`Oy!bO!O{P~OdlOfUOg]OmUOuUOvUO}UO!}[O#QQO#XRO#YSO~O!O!hO~OhfO!V!nO~P.VOhfOykO!VmO!Zka#Zka#`ka#^ka!Qka!Tka!Uka!eka!gka~P.VOd!pO!}[O~O#Q!qO#S!qO#T!qO#U!qO#V!qO#W!qO~OrsO#Q!sO#SqO#TrO~O#]!vO~P%YOykO#Z!xO#]!zO~O#Z!{O#]!vO~P.VOe`O!]gO!_hO!aiO!cjO~P,YO#^#WO~P(vOP!OOQ!OOR!POS!PO#^#WO~OT!ROU!SO#^#WO~O!Z!ZO#^#WO~Od#XOm#XO!}[O~Od#YOg]O!}[O~O!Z!ZO#Zja#`ja#^ja!Qja!Tja!Uja!eja!gja~Od!`Oy!bO!O{X~Om#aOu#aO}#aO#QQO~O!O#cO~OT!ROU!SOW!QOX!QOY!QOZ!QO[!QO]!QO~O!O#dO~P4rOT!ROU!SO!O#dO~Oe`O!]gO!_hO!aiO!cjO#Z#fO~P,YO#Z!`a#`!`a!Q!`a!T!`a!U!`a!e!`a!g!`a~P*[O#Z!`a#`!`a!Q!`a!T!`a!U!`a!e!`a!g!`a~OP!OOQ!OOR!POS!PO~P6qOT!ROU!SO~P6qO!O#hO~P4rOT!ROU!SO!O#hO~OykO#Z!xO#]#jO~O#Z!{O#]#lO~P.VO^}ORpiSpi#Zpi#`pi#^pi!Qpi!Tpi!Upi!epi!gpi~OPpiQpi~P8mOP!OOQ!OO~P8mOP!OOQ!OORpiSpi#Zpi#`pi#^pi!Qpi!Tpi!Upi!epi!gpi~OW!QOX!QOY!QOZ!QO[!QO]!QOT!Xi#Z!Xi#`!Xi#^!Xi!O!Xi!Q!Xi!T!Xi!U!Xi!e!Xi!g!Xi~OU!SO~P:nOU!SO~P;QOU!Xi~P:nOhfOykO!VmO~P.VOy!bO!O{a~Oe`O!]gO!_hO!aiO!cjO#Z#pO~P,YOe`O!]gO!_hO!aiO!cjO#Z#rO!Q#[P!T#[P!U#[P!e#[P!g#[P~P,YO!Q#vO!T#wO!U#xO~OykO#Z!xO#]#|O~O#Z!{O#]#}O~P.VO!Q#vO!T#wO!U$OO~Oe`O!]gO!_hO!aiO!cjO#Z#rO!Q#[P!T#[P!U#[P~P,YO!U$SO~O#Z$TO~Oe`O!]gO!_hO!aiO!cjO#Z#rO!Q#[X!T#[X!U#[X!e#[X!g#[X~P,YOd$VO~O!O$WO~O!U$XO~O!T#wO!U$XO~O!U$_O!e$]O!g$^O~O!U$aO~O!T#wO!U$aO~O!Q#vO!T#wO!U$aO~O!O$dO~O!U$fO~O!U$hO!e$]O!g$^O~O!O$lO~O!U$hO~O!U$mO~O!T#wO!U$mO~O!U$pO~O!O$qO~P4rOT!ROU!SO!O$qO~O!U$sO~Omv~",
goto: "3b#`PPPPPPPPPPPPPPPPPPPPPPPPPP#a#u$YP%X#u&^&{P'x'xPP'|(vP)Z)y)|PP*SP*]*rPPP+S,O,vP,}P,}P,}P,}P-`P-dP,},}-j-p-v-|.S.^.e.o.y/S/ZPPPP/a/e0QPP0i2RP3PPPPPPPPP3TPP3ZnaOe|!]!h#c#d#f#h#p#t$W$d$l$qR!W[s^O[e|!Z!]!h#c#d#f#h#p#t$W$d$l$qpPO[e|!]!h#c#d#f#h#p#t$W$d$l$q|lPSTgijkpx{}!O!P!Q!R!S!w!|#Y#Z#k$]R#Y!ZpTO[e|!]!h#c#d#f#h#p#t$W$d$l$q|UPSTgijkpx{}!O!P!Q!R!S!w!|#Y#Z#k$]Q!pqQ#X!YR#Z!ZnYOe|!]!h#c#d#f#h#p#t$W$d$l$qQ!U[Q!jiQ#O!OR#R!P!nUOPST[egijkpx{|}!O!P!Q!R!S!]!h!w!|#Y#Z#c#d#f#h#k#p#t$W$]$d$l$qR#a!bTsQu!oUOPST[egijkpx{|}!O!P!Q!R!S!]!h!w!|#Y#Z#c#d#f#h#k#p#t$W$]$d$l$qYnPTp#Y#ZQySQ!uxX!xy!u!y#inaOe|!]!h#c#d#f#h#p#t$W$d$l$qYmPTp#Y#ZQ!W[R!nkR!efX!cf!a!d#`Q#z#gQ$Q#oR$c$RQ#g!hQ#q#dQ#{#hQ$e$WQ$o$dQ$r$lR$t$qQ#y#gQ$P#oQ$Y#zS$b$Q$RR$n$c!OUPST[gijkpx{}!O!P!Q!R!S!w!|#Y#Z#k$]oVOe|!]!h#c#d#f#h#p#t$W$d$l$qnZOe|!]!h#c#d#f#h#p#t$W$d$l$qQ!V[Q!ggQ!kiQ!mjQ#S!SQ#U!RR$k$]ZnPTp#Y#ZoaOe|!]!h#c#d#f#h#p#t$W$d$l$qT$Z#{$[Q$`#{R$i$[QeOR!_eQuQR!ruQxSR!txQ!afR#_!aQ!dfQ#`!aT#b!d#`S#t#f#pR$U#tQ!yyQ#i!uT#m!y#iQ!|{Q#k!wT#n!|#kWpPT#Y#ZR!opS![_!XR#]![Q$[#{R$g$[TdOeSbOeQ!}|Q#^!]^#e!h#d#h$W$d$l$qQ#o#cV#s#f#p#tn_Oe|!]!h#c#d#f#h#p#t$W$d$l$qQ!X[R#[!ZpXO[e|!]!h#c#d#f#h#p#t$W$d$l$qYmPTp#Y#ZQ{SQ!fgQ!iiQ!ljQ!nkQ!wxW!{{!w!|#kQ#O}Q#P!OQ#Q!PQ#S!QQ#T!RQ#V!SR$j$]nWOe|!]!h#c#d#f#h#p#t$W$d$l$q|lPSTgijkpx{}!O!P!Q!R!S!w!|#Y#Z#k$]R!T[TtQuQ#u#fR$R#pZoPTp#Y#Z",
nodeNames: "⚠ Star Slash Plus Minus And Or Eq EqEq Neq Lt Lte Gt Gte Modulo PlusEq MinusEq StarEq SlashEq ModuloEq Identifier AssignableIdentifier Word IdentifierBeforeDot Do Program PipeExpr FunctionCall DotGet Number ParenExpr FunctionCallOrIdentifier BinOp String StringFragment Interpolation EscapeSeq Boolean Regex Dict NamedArg NamedArgPrefix FunctionDef Params NamedParam Null colon CatchExpr keyword Block FinallyExpr keyword keyword Underscore Array ConditionalOp PositionalArg operator WhileExpr keyword TryExpr keyword Throw keyword IfExpr keyword ElseIfExpr keyword ElseExpr keyword CompoundAssign Assign",
maxTerm: 108,
states: ";lQYQbOOO#wQcO'#C{O$tOSO'#C}O%SQbO'#ElOOQ`'#DW'#DWOOQa'#DT'#DTO&YQbO'#DdO'kQcO'#EaOOQa'#Ea'#EaO(nQcO'#EaO)pQcO'#E`O*TQRO'#C|O+aQcO'#E[O+qQcO'#E[O+{QbO'#CzO,sOpO'#CxOOQ`'#E]'#E]O,xQbO'#E[O-PQbO'#ErOOQ`'#Dh'#DhO-tQQO'#EtOOQ`'#Dl'#DlO-PQbO'#DnO-PQbO'#EvOOQ`'#Dp'#DpO-yQRO'#DxOOQ`'#E['#E[O._QQO'#EZOOQ`'#EZ'#EZOOQ`'#Dz'#DzQYQbOOO.gQbO'#DUOOQa'#E`'#E`OOQ`'#Df'#DfOOQ`'#Eq'#EqOOQ`'#ES'#ESO.qQbO,59cO/eQbO'#DPO/mQWO'#DQOOOO'#Ec'#EcOOOO'#D{'#D{O0ROSO,59iOOQa,59i,59iOOQ`'#D}'#D}O0aQbO'#DXO0lQbO'#DYOOQO'#EO'#EOO0dQQO'#DXO0zQQO,5;WOOQ`'#D|'#D|O1PQbO,5:OO1WQQO,59oOOQa,5:O,5:OO1cQbO,5:OO1mQbO,5:eO-PQbO,59hO-PQbO,59hO-PQbO,59hO-PQbO,5:PO-PQbO,5:PO-PQbO,5:PO2QQRO,59fO2XQRO,59fO2jQRO,59fO2eQQO,59fO2uQQO,59fO2}ObO,59dO3YQbO'#ETO3eQbO,59bO4hQRO,5;^O4oQRO,5;^O4zQbO,5;`O5bQcO,5:YO6WQcO,5:YO6hQcO,5:YO6rQRO,5;bO6yQRO,5;bO1mQbO,5:dOOQ`,5:u,5:uOOQ`-E7x-E7xOOQ`,59p,59pOOQ`-E8Q-E8QOOOO,59k,59kOOOO,59l,59lOOOO-E7y-E7yOOQa1G/T1G/TOOQ`-E7{-E7{O7UQQO,59sOOQO,59t,59tOOQO-E7|-E7|O7^QbO1G0rOOQ`-E7z-E7zO7tQQO1G/ZOOQa1G/j1G/jO8PQbO1G/jOOQO'#EQ'#EQO7tQQO1G/ZOOQa1G/Z1G/ZOOQ`'#ER'#ERO8PQbO1G/jOOQ`1G0P1G0POOQa1G/S1G/SO8xQcO1G/SO9SQcO1G/SO9^QcO1G/SOOQa1G/k1G/kO:|QcO1G/kO;TQcO1G/kO;[QcO1G/kOOQa1G/Q1G/QOOQa1G/O1G/OO!dQbO'#C{O;cQbO'#CwOOQ`,5:o,5:oOOQ`-E8R-E8RO;pQbO1G0xO<WQbO1G0zO<cQbO1G0{O=SQbO1G0|OOQ`1G0O1G0OO=jQbO7+&^O<cQbO7+&`O=uQQO7+$uOOQa7+$u7+$uO>QQbO7+%UOOQa7+%U7+%UOOQO-E8O-E8OOOQ`-E8P-E8POOQ`'#Dj'#DjO>[QbO7+&dO>aQbO7+&eO>zQbO'#D]O?PQQO'#D`OOQ`7+&f7+&fO?UQbO7+&fO?ZQbO7+&fOOQ`'#EP'#EPO?cQQO'#EPO?hQbO'#EmOOQ`'#D_'#D_O@_QbO7+&gOOQ`'#Dr'#DrO@jQbO7+&hO@oQbO7+&iOOQ`<<Ix<<IxOA`QbO<<IxOAeQbO<<IxOAmQbO<<IzOOQa<<Ha<<HaOOQa<<Hp<<HpOOQ`<<JO<<JOOOQ`'#Dk'#DkOAxQbO<<JPOA}QQO,59wOBSQbO,59zOOQ`<<JQ<<JQOBjQbO<<JQOOQ`,5:k,5:kOOQ`-E7}-E7}OOQ`<<JR<<JROBoQbO<<JROBtQbO<<JROOQ`<<JS<<JSOOQ`'#Ds'#DsOB|QbO<<JTOOQ`AN?dAN?dOCXQbOAN?dOOQ`AN?fAN?fOC^QbOAN?fOCcQbOAN?fOOQ`AN?kAN?kOCkQbO1G/cO>aQbO1G/fOOQ`1G/f1G/fOOQ`AN?lAN?lOOQ`AN?mAN?mODRQbOAN?mO-PQbO'#DtOOQ`'#EU'#EUODWQbOAN?oODcQQO'#DvOOQ`AN?oAN?oODhQbOAN?oOOQ`G25OG25OOOQ`G25QG25QODmQbOG25QODrQbO7+$}OOQ`7+$}7+$}OOQ`7+%Q7+%QOOQ`G25XG25XOE`QRO,5:`OEgQRO,5:`OOQ`-E8S-E8SOOQ`G25ZG25ZOErQbOG25ZOEwQQO,5:bOOQ`LD*lLD*lOOQ`<<Hi<<HiOE|QQO1G/zOOQ`LD*uLD*uO>aQbO1G/|O@oQbO7+%fOOQ`7+%h7+%hOOQ`<<IQ<<IQ",
stateData: "FU~O!{OS!|OS~OdPOeiOfWOg_OhROmWOuWOvWO}WO!]bO!adO!cfO!egO#R^O#UQO#]TO#^UO#_lO~OdpOfWOg_OhROmWOuWOvWOyoO}WO!VqO#R^O#UQO#]TO#^UO!ZoX#_oX#loX#doX!QoX!ToX!UoX~OP#SXQ#SXR#SXS#SXT#SXU#SXW#SXX#SXY#SXZ#SX[#SX]#SX^#SX~P!dOrwO#UzO#WuO#XvO~Od{Oy}O!O{P~OdpOfWOg_OmWOuWOvWOyoO}WO#R^O#UQO#]TO#^UO#_!RO~O#c!UO~P%_OP#TXQ#TXR#TXS#TXT#TXU#TXW#TXX#TXY#TXZ#TX[#TX]#TX^#TX#_#TX#l#TX!Q#TX!T#TX!U#TX~OdpOfWOg_OhROmWOuWOvWOyoO}WO!VqO#R^O#UQO#]TO#^UO#d#TX~P&aOV!WO~P&aOP#SXQ#SXR#SXS#SXT#SXU#SXW#SXX#SXY#SXZ#SX[#SX]#SX^#SX~O#_#OX#l#OX!Q#OX!T#OX!U#OX~P(uOP!YOQ!YOR!ZOS!ZOT!]OU!^OW![OX![OY![OZ![O[![O]![O^!XO~O#_#OX#l#OX!Q#OX!T#OX!U#OX~OP!YOQ!YOR!ZOS!ZO~P+OOT!]OU!^O~P+OOdPOfWOg_OhROmWOuWOvWO}WO#R^O#UQO#]TO#^UO~O#Q!dO~O!Z!eO~P+OOdpOfWOg_OmWOuWOvWO}WO#R^O#UQO#]TO#^UO~O!O!iO~OV!WO_!oO`!oOa!oOb!oOc!oO~O#_!pO#l!pO~OhRO!V!rO~P-POhROyoO!VqO!Zka#_ka#lka#dka!Qka!Tka!Uka~P-POd!tO#R^O~O#U!uO#W!uO#X!uO#Y!uO#Z!uO#[!uO~OrwO#U!wO#WuO#XvO~Od{Oy}O!O{X~Om!zOu!zO}!zO#UQO~O!O!|O~O#c#PO~P%_OyoO#_#RO#c#TO~O#_#UO#c#PO~P-POeiO!]bO!adO!cfO!egO~P+{O#d#aO~P(uOP!YOQ!YOR!ZOS!ZO#d#aO~OT!]OU!^O#d#aO~O!Z!eO#d#aO~Od#bOm#bO#R^O~Od#cOg_O#R^O~O!Z!eO#_ja#lja#dja!Qja!Tja!Uja~OT!]OU!^OW![OX![OY![OZ![O[![O]![O~O!O#gO~P3|OT!]OU!^O!O#gO~OeiO!]bO!adO!cfO!egO#_#iO~P+{O#_!ba#l!ba!Q!ba!T!ba!U!ba~P*TO#_!ba#l!ba!Q!ba!T!ba!U!ba~OP!YOQ!YOR!ZOS!ZO~P5uOT!]OU!^O~P5uO!O#jO~P3|OT!]OU!^O!O#jO~Oy}O!O{a~OeiO!]bO!adO!cfO!egO#_#mO~P+{OyoO#_#RO#c#oO~O#_#UO#c#qO~P-PO^!XORpiSpi#_pi#lpi#dpi!Qpi!Tpi!Upi~OPpiQpi~P8ZOP!YOQ!YO~P8ZOP!YOQ!YORpiSpi#_pi#lpi#dpi!Qpi!Tpi!Upi~OW![OX![OY![OZ![O[![O]![OT!Xi#_!Xi#l!Xi#d!Xi!O!Xi!Q!Xi!T!Xi!U!Xi~OU!^O~P:OOU!^O~P:bOU!Xi~P:OOhROyoO!VqO~P-POeiO!]bO!adO!cfO!egO#_#vO~P+{O!Q#wO!T#xO!U#yO~OeiO!]bO!adO!cfO!egO#_#|O!Q#aP!T#aP!U#aP~P+{OeiO!]bO!adO!cfO!egO#_$TO~P+{O!Q#wO!T#xO!U$UO~OyoO#_#RO#c$YO~O#_#UO#c$ZO~P-PO!U$[O~OeiO!]bO!adO!cfO!egO#_#|O!U#aP~P+{Od$_O~O!O$`O~O!U$aO~O!T#xO!U$aO~O#_$cO~OeiO!]bO!adO!cfO!egO#_#|O!Q#aX!T#aX!U#aX!i#aX!k#aX~P+{O!Q#wO!T#xO!U$eO~O!U$hO~OeiO!]bO!adO!cfO!egO#_#|O!U#aP!i#aP!k#aP~P+{O!U$kO~O!T#xO!U$kO~O!Q#wO!T#xO!U$mO~O!U$pO~O!O$qO~OeiO!]bO!adO!cfO!egO#_$rO~P+{O!U$tO~O!U$uO~O!T#xO!U$uO~O!U${O!i$wO!k$zO~O!U$}O~O!U%OO~O!T#xO!U%OO~OeiO!]bO!adO!cfO!egO#_%QO~P+{O!U%TO~O!U%XO!i$wO!k$zO~O!O%ZO~O!U%XO~O!U%[O~OeiO!]bO!adO!cfO!egO#_#|O!T#aP!U#aP~P+{O!O%^O~P3|OT!]OU!^O!O%^O~O!U%_O~O#_%`O~O#_%aO~Omv~",
goto: "7v#lPPPPPPPPPPPPPPPPPPPPPPPPPP#m$V$nP%q$V&z'mP(n(nPP(r)pP*T*w*zPP+QP+^+gPPP,P-P-{P.SP.i.l.SP.SP.SP.o.r.{P/PP.S.S/V/]/c/i/o/y0W0b0l0u0|PPPP1S1W2PPP2l4YP5[PPPPPPPP5`5|5`PP6^6e6e6z6z7a7avjOn!W!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%aR!b^{`O^n!W!e!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%axPO^n!W!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%a|pPUVbfgot!S!V!X!Y!Z![!]!^#Q#V#c#d#p$wR#c!exVO^n!W!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%a|WPUVbfgot!S!V!X!Y!Z![!]!^#Q#V#c#d#p$wQ!tuQ#b!dR#d!ev[On!W!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%aQ!`^Q!kfQ#X!YR#[!Z!vWOPUV^bfgnot!S!V!W!X!Y!Z![!]!^!i!o!|#Q#V#c#d#g#i#j#m#p#v$O$T$`$q$r$w%Q%`%aR!z}TwQy!wWOPUV^bfgnot!S!V!W!X!Y!Z![!]!^!i!o!|#Q#V#c#d#g#i#j#m#p#v$O$T$`$q$r$w%Q%`%aYrPVt#c#dQ!TUQ#O!SX#R!T#O#S#nvjOn!W!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%aYqPVt#c#dQ!b^R!roR!QRX!OR|!P!yQ#{#hQ$W#lQ$g$QR$o$XQ$Q#iQ%S$rR%]%QQ#z#hQ$V#lQ$b#{Q$f$QQ$l$WQ$n$XQ$v$gR%P$o!OWPUV^bfgot!S!V!X!Y!Z![!]!^#Q#V#c#d#p$wwXOn!W!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%av]On!W!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%aQ!a^Q!hbQ!lfQ!ngQ#]!^Q#_!]R%V$wZrPVt#c#dwjOn!W!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%aR#u#gR$^#vR$S#jQ$j$TQ%b%`R%c%aT$x$j$yQ$|$jR%Y$yQnOR!qnQyQR!vyQ!SUR!}!SQ|RR!x|Q!PRQ!y|T!{!P!y`$O#i#m#v$T$r%Q%`%aR$d$OQ#S!TQ#n#OT#r#S#nQ#V!VQ#p#QT#s#V#pWtPV#c#dR!stS!fa!cR#f!fQ$y$jR%W$yTmOnSkOnQ#W!WQ#h!iQ#k!oQ#l!|Q#t#gb#}#i#m#v$O$T$r%Q%`%aQ$R#jQ$s$`R%R$qvaOn!W!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%aQ!c^R#e!exZO^n!W!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%aYqPVt#c#dQ!VUQ!gbQ!jfQ!mgQ!roQ#Q!SW#U!V#Q#V#pQ#X!XQ#Y!YQ#Z!ZQ#]![Q#^!]Q#`!^R%U$wvYOn!W!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%a|pPUVbfgot!S!V!X!Y!Z![!]!^#Q#V#c#d#p$wR!_^TxQy!VSOPV^not!W!i!o!|#c#d#g#i#j#m#v$O$T$`$q$r%Q%`%aU$P#i$r%QQ$X#mQ$]#vV$i$T%`%aZsPVt#c#dwcOn!W!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%aweOn!W!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%awhOn!W!i!o!|#g#i#j#m#v$O$T$`$q$r%Q%`%a",
nodeNames: "⚠ Star Slash Plus Minus And Or Eq EqEq Neq Lt Lte Gt Gte Modulo PlusEq MinusEq StarEq SlashEq ModuloEq Identifier AssignableIdentifier Word IdentifierBeforeDot Do Program PipeExpr FunctionCall DotGet Number ParenExpr FunctionCallOrIdentifier BinOp String StringFragment Interpolation EscapeSeq Boolean Regex Dict NamedArg NamedArgPrefix FunctionDef Params NamedParam Null colon CatchExpr keyword TryBlock FinallyExpr keyword keyword Underscore Array ConditionalOp PositionalArg operator WhileExpr keyword SingleLineBlock MultiLineBlock TryExpr keyword Throw keyword IfExpr keyword SingleLineThenBlock ThenBlock ElseIfExpr keyword ElseExpr keyword CompoundAssign Assign",
maxTerm: 120,
context: trackScope,
nodeProps: [
["closedBy", 46,"end"]
@ -19,9 +19,9 @@ export const parser = LRParser.deserialize({
propSources: [highlighting],
skippedNodes: [0],
repeatNodeCount: 11,
tokenData: "C_~R|OX#{XY$jYZ%TZp#{pq$jqs#{st%ntu'Vuw#{wx'[xy'ayz'zz{#{{|(e|}#{}!O+X!O!P#{!P!Q-n!Q![)S![!]6Z!]!^%T!^!}#{!}#O6t#O#P8j#P#Q8o#Q#R#{#R#S9Y#S#T#{#T#Y,Y#Y#Z9s#Z#b,Y#b#c>q#c#f,Y#f#g?n#g#h,Y#h#i@k#i#o,Y#o#p#{#p#qBo#q;'S#{;'S;=`$d<%l~#{~O#{~~CYS$QUrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{S$gP;=`<%l#{^$qUrS!wYOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U%[UrS#ZQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{^%uZrS!xYOY%nYZ#{Zt%ntu&huw%nwx&hx#O%n#O#P&h#P;'S%n;'S;=`'P<%lO%nY&mS!xYOY&hZ;'S&h;'S;=`&y<%lO&hY&|P;=`<%l&h^'SP;=`<%l%n~'[O#S~~'aO#Q~U'hUrS!}QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(RUrS#^QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(jWrSOt#{uw#{x!Q#{!Q![)S![#O#{#P;'S#{;'S;=`$d<%lO#{U)ZYrSmQOt#{uw#{x!O#{!O!P)y!P!Q#{!Q![)S![#O#{#P;'S#{;'S;=`$d<%lO#{U*OWrSOt#{uw#{x!Q#{!Q![*h![#O#{#P;'S#{;'S;=`$d<%lO#{U*oWrSmQOt#{uw#{x!Q#{!Q![*h![#O#{#P;'S#{;'S;=`$d<%lO#{U+^^rSOt#{uw#{x}#{}!O,Y!O!Q#{!Q![)S![!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{U,_[rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{U-[UyQrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U-sWrSOt#{uw#{x!P#{!P!Q.]!Q#O#{#P;'S#{;'S;=`$d<%lO#{U.b^rSOY/^YZ#{Zt/^tu0auw/^wx0ax!P/^!P!Q#{!Q!}/^!}#O5S#O#P2o#P;'S/^;'S;=`6T<%lO/^U/e^rSvQOY/^YZ#{Zt/^tu0auw/^wx0ax!P/^!P!Q3U!Q!}/^!}#O5S#O#P2o#P;'S/^;'S;=`6T<%lO/^Q0fXvQOY0aZ!P0a!P!Q1R!Q!}0a!}#O1p#O#P2o#P;'S0a;'S;=`3O<%lO0aQ1UP!P!Q1XQ1^UvQ#Z#[1X#]#^1X#a#b1X#g#h1X#i#j1X#m#n1XQ1sVOY1pZ#O1p#O#P2Y#P#Q0a#Q;'S1p;'S;=`2i<%lO1pQ2]SOY1pZ;'S1p;'S;=`2i<%lO1pQ2lP;=`<%l1pQ2rSOY0aZ;'S0a;'S;=`3O<%lO0aQ3RP;=`<%l0aU3ZWrSOt#{uw#{x!P#{!P!Q3s!Q#O#{#P;'S#{;'S;=`$d<%lO#{U3zbrSvQOt#{uw#{x#O#{#P#Z#{#Z#[3s#[#]#{#]#^3s#^#a#{#a#b3s#b#g#{#g#h3s#h#i#{#i#j3s#j#m#{#m#n3s#n;'S#{;'S;=`$d<%lO#{U5X[rSOY5SYZ#{Zt5Stu1puw5Swx1px#O5S#O#P2Y#P#Q/^#Q;'S5S;'S;=`5}<%lO5SU6QP;=`<%l5SU6WP;=`<%l/^U6bUrS!OQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U6{W#YQrSOt#{uw#{x!_#{!_!`7e!`#O#{#P;'S#{;'S;=`$d<%lO#{U7jVrSOt#{uw#{x#O#{#P#Q8P#Q;'S#{;'S;=`$d<%lO#{U8WU#XQrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~8oO#T~U8vU#]QrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U9aUrS!VQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U9x]rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#U:q#U#o,Y#o;'S#{;'S;=`$d<%lO#{U:v^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#`,Y#`#a;r#a#o,Y#o;'S#{;'S;=`$d<%lO#{U;w^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#g,Y#g#h<s#h#o,Y#o;'S#{;'S;=`$d<%lO#{U<x^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#X,Y#X#Y=t#Y#o,Y#o;'S#{;'S;=`$d<%lO#{U={[uQrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^>x[#UWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^?u[#WWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^@r^#VWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#f,Y#f#gAn#g#o,Y#o;'S#{;'S;=`$d<%lO#{UAs^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#i,Y#i#j<s#j#o,Y#o;'S#{;'S;=`$d<%lO#{UBvU!ZQrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~C_O#`~",
tokenizers: [operatorTokenizer, 1, 2, 3, tokenizer, new LocalTokenGroup("[~RP!O!PU~ZO!|~~", 11)],
tokenData: "C_~R|OX#{XY$jYZ%TZp#{pq$jqs#{st%ntu'Vuw#{wx'[xy'ayz'zz{#{{|(e|}#{}!O+X!O!P#{!P!Q-n!Q![)S![!]6Z!]!^%T!^!}#{!}#O6t#O#P8j#P#Q8o#Q#R#{#R#S9Y#S#T#{#T#Y,Y#Y#Z9s#Z#b,Y#b#c>q#c#f,Y#f#g?n#g#h,Y#h#i@k#i#o,Y#o#p#{#p#qBo#q;'S#{;'S;=`$d<%l~#{~O#{~~CYS$QUrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{S$gP;=`<%l#{^$qUrS!{YOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U%[UrS#_QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{^%uZrS!|YOY%nYZ#{Zt%ntu&huw%nwx&hx#O%n#O#P&h#P;'S%n;'S;=`'P<%lO%nY&mS!|YOY&hZ;'S&h;'S;=`&y<%lO&hY&|P;=`<%l&h^'SP;=`<%l%n~'[O#W~~'aO#U~U'hUrS#RQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(RUrS#dQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(jWrSOt#{uw#{x!Q#{!Q![)S![#O#{#P;'S#{;'S;=`$d<%lO#{U)ZYrSmQOt#{uw#{x!O#{!O!P)y!P!Q#{!Q![)S![#O#{#P;'S#{;'S;=`$d<%lO#{U*OWrSOt#{uw#{x!Q#{!Q![*h![#O#{#P;'S#{;'S;=`$d<%lO#{U*oWrSmQOt#{uw#{x!Q#{!Q![*h![#O#{#P;'S#{;'S;=`$d<%lO#{U+^^rSOt#{uw#{x}#{}!O,Y!O!Q#{!Q![)S![!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{U,_[rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{U-[UyQrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U-sWrSOt#{uw#{x!P#{!P!Q.]!Q#O#{#P;'S#{;'S;=`$d<%lO#{U.b^rSOY/^YZ#{Zt/^tu0auw/^wx0ax!P/^!P!Q#{!Q!}/^!}#O5S#O#P2o#P;'S/^;'S;=`6T<%lO/^U/e^rSvQOY/^YZ#{Zt/^tu0auw/^wx0ax!P/^!P!Q3U!Q!}/^!}#O5S#O#P2o#P;'S/^;'S;=`6T<%lO/^Q0fXvQOY0aZ!P0a!P!Q1R!Q!}0a!}#O1p#O#P2o#P;'S0a;'S;=`3O<%lO0aQ1UP!P!Q1XQ1^UvQ#Z#[1X#]#^1X#a#b1X#g#h1X#i#j1X#m#n1XQ1sVOY1pZ#O1p#O#P2Y#P#Q0a#Q;'S1p;'S;=`2i<%lO1pQ2]SOY1pZ;'S1p;'S;=`2i<%lO1pQ2lP;=`<%l1pQ2rSOY0aZ;'S0a;'S;=`3O<%lO0aQ3RP;=`<%l0aU3ZWrSOt#{uw#{x!P#{!P!Q3s!Q#O#{#P;'S#{;'S;=`$d<%lO#{U3zbrSvQOt#{uw#{x#O#{#P#Z#{#Z#[3s#[#]#{#]#^3s#^#a#{#a#b3s#b#g#{#g#h3s#h#i#{#i#j3s#j#m#{#m#n3s#n;'S#{;'S;=`$d<%lO#{U5X[rSOY5SYZ#{Zt5Stu1puw5Swx1px#O5S#O#P2Y#P#Q/^#Q;'S5S;'S;=`5}<%lO5SU6QP;=`<%l5SU6WP;=`<%l/^U6bUrS!OQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U6{W#^QrSOt#{uw#{x!_#{!_!`7e!`#O#{#P;'S#{;'S;=`$d<%lO#{U7jVrSOt#{uw#{x#O#{#P#Q8P#Q;'S#{;'S;=`$d<%lO#{U8WU#]QrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~8oO#X~U8vU#cQrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U9aUrS!VQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U9x]rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#U:q#U#o,Y#o;'S#{;'S;=`$d<%lO#{U:v^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#`,Y#`#a;r#a#o,Y#o;'S#{;'S;=`$d<%lO#{U;w^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#g,Y#g#h<s#h#o,Y#o;'S#{;'S;=`$d<%lO#{U<x^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#X,Y#X#Y=t#Y#o,Y#o;'S#{;'S;=`$d<%lO#{U={[uQrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^>x[#YWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^?u[#[WrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^@r^#ZWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#f,Y#f#gAn#g#o,Y#o;'S#{;'S;=`$d<%lO#{UAs^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#i,Y#i#j<s#j#o,Y#o;'S#{;'S;=`$d<%lO#{UBvU!ZQrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~C_O#l~",
tokenizers: [operatorTokenizer, 1, 2, 3, tokenizer, new LocalTokenGroup("[~RP!O!PU~ZO#Q~~", 11)],
topRules: {"Program":[0,25]},
specialized: [{term: 20, get: (value: any, stack: any) => (specializeKeyword(value, stack) << 1), external: specializeKeyword},{term: 20, get: (value: keyof typeof spec_Identifier) => spec_Identifier[value] || -1}],
tokenPrec: 1582
tokenPrec: 1705
})

View File

@ -752,7 +752,7 @@ Assign
EqEq ==
Number 5
colon :
Block
ThenBlock
Boolean true
keyword end
keyword end
@ -794,7 +794,7 @@ Assign
EqEq ==
Number 5
colon :
Block
ThenBlock
Boolean true
keyword end
keyword end

View File

@ -12,7 +12,7 @@ describe('if/elseif/else', () => {
EqEq ==
Number 1
colon :
Block
SingleLineThenBlock
String
StringFragment cool
keyword end
@ -26,7 +26,7 @@ describe('if/elseif/else', () => {
keyword if
Identifier x
colon :
Block
SingleLineThenBlock
Number 2
keyword end
`)
@ -44,7 +44,7 @@ describe('if/elseif/else', () => {
Lt <
Number 9
colon :
Block
ThenBlock
FunctionCallOrIdentifier
Identifier yes
keyword end
@ -61,13 +61,13 @@ describe('if/elseif/else', () => {
keyword if
Identifier with-else
colon :
Block
ThenBlock
FunctionCallOrIdentifier
Identifier x
ElseExpr
keyword else
colon :
Block
ThenBlock
FunctionCallOrIdentifier
Identifier y
keyword end
@ -84,14 +84,14 @@ describe('if/elseif/else', () => {
keyword if
Identifier with-elseif
colon :
Block
ThenBlock
FunctionCallOrIdentifier
Identifier x
ElseIfExpr
keyword elseif
Identifier another-condition
colon :
Block
ThenBlock
FunctionCallOrIdentifier
Identifier y
keyword end
@ -112,27 +112,27 @@ describe('if/elseif/else', () => {
keyword if
Identifier with-elseif-else
colon :
Block
ThenBlock
FunctionCallOrIdentifier
Identifier x
ElseIfExpr
keyword elseif
Identifier another-condition
colon :
Block
ThenBlock
FunctionCallOrIdentifier
Identifier y
ElseIfExpr
keyword elseif
Identifier yet-another-condition
colon :
Block
ThenBlock
FunctionCallOrIdentifier
Identifier z
ElseExpr
keyword else
colon :
Block
ThenBlock
FunctionCallOrIdentifier
Identifier oh-no
keyword end
@ -148,7 +148,7 @@ describe('if/elseif/else', () => {
keyword if
Boolean true
colon :
Block
SingleLineThenBlock
Number 2
keyword end
`)
@ -162,7 +162,7 @@ describe('while', () => {
keyword while
Boolean true
colon :
Block
SingleLineBlock
Boolean true
keyword end`)
})
@ -176,7 +176,7 @@ describe('while', () => {
Gt >
Number 0
colon :
Block
SingleLineBlock
Boolean true
keyword end`)
})
@ -203,7 +203,7 @@ describe('while', () => {
Lt <
Number 1000
colon :
Block
SingleLineBlock
Boolean true
keyword end`)
})
@ -217,7 +217,7 @@ describe('while', () => {
keyword while
Boolean true
colon :
Block
MultiLineBlock
Boolean true
keyword end`)
})
@ -234,7 +234,7 @@ describe('while', () => {
Gt >
Number 0
colon :
Block
MultiLineBlock
Boolean true
keyword end`)
})
@ -264,7 +264,7 @@ describe('while', () => {
Lt <
Number 1000
colon :
Block
MultiLineBlock
Boolean true
keyword end`)
})

View File

@ -12,14 +12,14 @@ describe('try/catch/finally/throw', () => {
TryExpr
keyword try
colon :
Block
TryBlock
FunctionCallOrIdentifier
Identifier risky-operation
CatchExpr
keyword catch
Identifier err
colon :
Block
TryBlock
FunctionCall
Identifier handle-error
PositionalArg
@ -37,13 +37,13 @@ describe('try/catch/finally/throw', () => {
TryExpr
keyword try
colon :
Block
TryBlock
FunctionCallOrIdentifier
Identifier do-work
FinallyExpr
keyword finally
colon :
Block
TryBlock
FunctionCallOrIdentifier
Identifier cleanup
keyword end
@ -61,14 +61,14 @@ describe('try/catch/finally/throw', () => {
TryExpr
keyword try
colon :
Block
TryBlock
FunctionCallOrIdentifier
Identifier risky-operation
CatchExpr
keyword catch
Identifier err
colon :
Block
TryBlock
FunctionCall
Identifier handle-error
PositionalArg
@ -76,7 +76,7 @@ describe('try/catch/finally/throw', () => {
FinallyExpr
keyword finally
colon :
Block
TryBlock
FunctionCallOrIdentifier
Identifier cleanup
keyword end
@ -91,17 +91,15 @@ describe('try/catch/finally/throw', () => {
TryExpr
keyword try
colon :
Block
FunctionCall
Identifier parse-number
PositionalArg
Identifier input
FunctionCall
Identifier parse-number
PositionalArg
Identifier input
CatchExpr
keyword catch
Identifier err
colon :
Block
Number 0
Number 0
keyword end
`)
})
@ -111,21 +109,18 @@ describe('try/catch/finally/throw', () => {
TryExpr
keyword try
colon :
Block
FunctionCallOrIdentifier
Identifier work
FunctionCallOrIdentifier
Identifier work
CatchExpr
keyword catch
Identifier err
colon :
Block
Number 0
Number 0
FinallyExpr
keyword finally
colon :
Block
FunctionCallOrIdentifier
Identifier cleanup
FunctionCallOrIdentifier
Identifier cleanup
keyword end
`)
})
@ -169,15 +164,13 @@ describe('try/catch/finally/throw', () => {
TryExpr
keyword try
colon :
Block
FunctionCallOrIdentifier
Identifier work
FunctionCallOrIdentifier
Identifier work
CatchExpr
keyword catch
Identifier err
colon :
Block
Number 0
Number 0
keyword end
`)
})
@ -206,7 +199,7 @@ describe('function-level exception handling', () => {
keyword catch
Identifier e
colon :
Block
TryBlock
FunctionCallOrIdentifier
Identifier empty-string
keyword end
@ -234,7 +227,7 @@ describe('function-level exception handling', () => {
FinallyExpr
keyword finally
colon :
Block
TryBlock
FunctionCallOrIdentifier
Identifier close-resources
keyword end
@ -266,7 +259,7 @@ describe('function-level exception handling', () => {
keyword catch
Identifier err
colon :
Block
TryBlock
FunctionCall
Identifier log
PositionalArg
@ -276,7 +269,7 @@ describe('function-level exception handling', () => {
FinallyExpr
keyword finally
colon :
Block
TryBlock
FunctionCallOrIdentifier
Identifier cleanup
keyword end