Compare commits

...

3 Commits

8 changed files with 95 additions and 137 deletions

View File

@ -389,11 +389,7 @@ export class Compiler {
return instructions
}
case terms.MultiLineBlock:
case terms.SingleLineBlock:
case terms.ThenBlock:
case terms.SingleLineThenBlock:
case terms.TryBlock: {
case terms.Block: {
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 TryBlock or statement
// First child is always 'try' keyword, second is colon, third is Block or statement
const [tryKeyword, _colon, tryBlock, ...rest] = children
if (!tryKeyword || !tryBlock) {

View File

@ -25,9 +25,19 @@
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 }
@ -47,7 +57,6 @@ item {
newlineOrSemicolon // allow blank lines
}
consumeToTerminator {
PipeExpr |
WhileExpr |
@ -72,23 +81,11 @@ pipeOperand {
}
WhileExpr {
singleLineWhileExpr | multiLineWhileExpr
while (ConditionalOp | expression) colon Block end
}
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">
Block {
consumeToTerminator | newlineOrSemicolon block
}
FunctionCallOrIdentifier {
@ -107,7 +104,6 @@ arg {
PositionalArg | NamedArg
}
PositionalArg {
expression | FunctionDef | Underscore
}
@ -117,71 +113,35 @@ NamedArg {
}
FunctionDef {
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">
Do Params colon (consumeToTerminator | newlineOrSemicolon block) CatchExpr? FinallyExpr? end
}
IfExpr {
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">
if (ConditionalOp | expression) colon Block ElseIfExpr* ElseExpr? end
}
ElseIfExpr {
@specialize[@name=keyword]<Identifier, "elseif"> (ConditionalOp | expression) colon newlineOrSemicolon ThenBlock
elseif (ConditionalOp | expression) colon Block
}
ElseExpr {
@specialize[@name=keyword]<Identifier, "else"> colon newlineOrSemicolon ThenBlock
}
ThenBlock {
block
}
SingleLineThenBlock {
consumeToTerminator
else colon Block
}
TryExpr {
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">
try colon Block CatchExpr? FinallyExpr? end
}
CatchExpr {
@specialize[@name=keyword]<Identifier, "catch"> Identifier colon (newlineOrSemicolon TryBlock | consumeToTerminator)
catch Identifier colon Block
}
FinallyExpr {
@specialize[@name=keyword]<Identifier, "finally"> colon (newlineOrSemicolon TryBlock | consumeToTerminator)
}
TryBlock {
block
finally colon Block
}
Throw {
@specialize[@name=keyword]<Identifier, "throw"> (BinOp | ConditionalOp | expression)
throw (BinOp | ConditionalOp | expression)
}
ConditionalOp {
@ -200,7 +160,7 @@ Params {
}
NamedParam {
NamedArgPrefix (String | Number | Boolean | @specialize[@name=Null]<Identifier, "null">)
NamedArgPrefix (String | Number | Boolean | null)
}
Assign {
@ -238,7 +198,6 @@ expression {
}
String { "'" stringContent* "'" }
}
stringContent {
@ -274,7 +233,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 | @specialize[@name=Null]<Identifier, "null">
ParenExpr | Word | String | Number | Boolean | Regex | Dict | Array | null
}
block {

View File

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

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:126, throw:130, if:134, elseif:142, else:146}
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}
export const parser = LRParser.deserialize({
version: 14,
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,
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,
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!{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)],
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)],
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: 1705
tokenPrec: 1582
})

View File

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

View File

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

View File

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