From 0d1f1323791684a01c599fea6743315f2b678840 Mon Sep 17 00:00:00 2001 From: Chris Wanstrath Date: Mon, 3 Nov 2025 20:05:27 -0800 Subject: [PATCH] no more single vs multiline blocks --- src/compiler/compiler.ts | 3 +- src/compiler/utils.ts | 2 +- src/parser/shrimp.grammar | 38 +++++------------- src/parser/shrimp.terms.ts | 19 +++++---- src/parser/shrimp.ts | 18 ++++----- src/parser/tests/basics.test.ts | 4 +- src/parser/tests/control-flow.test.ts | 36 +++++++++--------- src/parser/tests/exceptions.test.ts | 55 +++++++++++++++------------ 8 files changed, 80 insertions(+), 95 deletions(-) diff --git a/src/compiler/compiler.ts b/src/compiler/compiler.ts index f872e17..86cb600 100644 --- a/src/compiler/compiler.ts +++ b/src/compiler/compiler.ts @@ -389,8 +389,7 @@ export class Compiler { return instructions } - case terms.MultiLineBlock: - case terms.SingleLineBlock: { + case terms.Block: { const children = getAllChildren(node) const instructions: ProgramItem[] = [] diff --git a/src/compiler/utils.ts b/src/compiler/utils.ts index 5738cac..e151daa 100644 --- a/src/compiler/utils.ts +++ b/src/compiler/utils.ts @@ -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 MultiLineBlock 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) { diff --git a/src/parser/shrimp.grammar b/src/parser/shrimp.grammar index e8787cb..ce0fa45 100644 --- a/src/parser/shrimp.grammar +++ b/src/parser/shrimp.grammar @@ -81,15 +81,11 @@ pipeOperand { } WhileExpr { - while (ConditionalOp | expression) colon (newlineOrSemicolon MultiLineBlock | SingleLineBlock) end + while (ConditionalOp | expression) colon Block end } -SingleLineBlock { - consumeToTerminator -} - -MultiLineBlock { - block +Block { + consumeToTerminator | newlineOrSemicolon block } FunctionCallOrIdentifier { @@ -121,43 +117,27 @@ FunctionDef { } IfExpr { - singleLineIf | multilineIf -} - -singleLineIf { - if (ConditionalOp | expression) colon SingleLineBlock end -} - -multilineIf { - if (ConditionalOp | expression) colon newlineOrSemicolon MultiLineBlock ElseIfExpr* ElseExpr? end + if (ConditionalOp | expression) colon Block ElseIfExpr* ElseExpr? end } ElseIfExpr { - elseif (ConditionalOp | expression) colon newlineOrSemicolon MultiLineBlock + elseif (ConditionalOp | expression) colon Block } ElseExpr { - else colon newlineOrSemicolon MultiLineBlock + else colon Block } TryExpr { - singleLineTry | multilineTry -} - -singleLineTry { - try colon consumeToTerminator CatchExpr? FinallyExpr? end -} - -multilineTry { - try colon newlineOrSemicolon MultiLineBlock CatchExpr? FinallyExpr? end + try colon Block CatchExpr? FinallyExpr? end } CatchExpr { - catch Identifier colon (newlineOrSemicolon MultiLineBlock | consumeToTerminator) + catch Identifier colon Block } FinallyExpr { - finally colon (newlineOrSemicolon MultiLineBlock | consumeToTerminator) + finally colon Block } Throw { diff --git a/src/parser/shrimp.terms.ts b/src/parser/shrimp.terms.ts index 743e237..a844f1f 100644 --- a/src/parser/shrimp.terms.ts +++ b/src/parser/shrimp.terms.ts @@ -47,19 +47,18 @@ export const Null = 45, colon = 46, CatchExpr = 47, - keyword = 70, - MultiLineBlock = 49, + keyword = 69, + Block = 49, FinallyExpr = 50, Underscore = 53, Array = 54, ConditionalOp = 55, PositionalArg = 56, WhileExpr = 58, - SingleLineBlock = 60, - TryExpr = 61, - Throw = 63, - IfExpr = 65, - ElseIfExpr = 67, - ElseExpr = 69, - CompoundAssign = 71, - Assign = 72 + TryExpr = 60, + Throw = 62, + IfExpr = 64, + ElseIfExpr = 66, + ElseExpr = 68, + CompoundAssign = 70, + Assign = 71 diff --git a/src/parser/shrimp.ts b/src/parser/shrimp.ts index 84be190..7a852b9 100644 --- a/src/parser/shrimp.ts +++ b/src/parser/shrimp.ts @@ -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:124, throw:128, if:132, elseif:136, else:140} +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: ":jQYQbOOO#wQcO'#C{O$tOSO'#C}OOQa'#DT'#DTO%}QbO'#DdO'`QcO'#E^OOQa'#E^'#E^O(cQcO'#E^O)eQcO'#E]O)xQRO'#C|O+UQcO'#EXO+fQcO'#EXO+pQbO'#CzO,hOpO'#CxOOQ`'#EY'#EYO,mQbO'#EXOOQ`'#Dk'#DkOOQ`'#Do'#DoO,tQRO'#DuOOQ`'#EX'#EXO-YQQO'#EWOOQ`'#EW'#EWOOQ`'#Dw'#DwQYQbOOO-bQbO'#DWO-mQbO'#DhO.bQQO'#EmO-mQbO'#DmO-mQbO'#EoO.gQbO'#DUOOQa'#E]'#E]OOQ`'#Df'#DfOOQ`'#El'#ElOOQ`'#EP'#EPO.qQbO,59cO/eQbO'#DPO/mQWO'#DQOOOO'#E`'#E`OOOO'#Dx'#DxO0ROSO,59iOOQa,59i,59iOOQ`'#Dy'#DyO0aQbO,5:OO0hQQO,59oOOQa,5:O,5:OO0sQbO,5:OO0}QbO,5:bO-mQbO,59hO-mQbO,59hO-mQbO,59hO-mQbO,5:PO-mQbO,5:PO-mQbO,5:PO1bQRO,59fO1iQRO,59fO1zQRO,59fO1uQQO,59fO2VQQO,59fO2_ObO,59dO2jQbO'#EQO2uQbO,59bO0}QbO,5:aOOQ`,5:r,5:rOOQ`-E7u-E7uOOQ`'#Dz'#DzO3^QbO'#DXO3iQbO'#DYOOQO'#D{'#D{O3aQQO'#DXO3wQQO,59rO4hQRO,5:SO4oQRO,5:SO4zQbO,5;XO5bQcO,5:XO6WQcO,5:XO6hQcO,5:XO6rQRO,5;ZO6yQRO,5;ZOOQ`,59p,59pOOQ`-E7}-E7}OOOO,59k,59kOOOO,59l,59lOOOO-E7v-E7vOOQa1G/T1G/TOOQ`-E7w-E7wO7UQQO1G/ZOOQa1G/j1G/jO7aQbO1G/jOOQO'#D}'#D}O7UQQO1G/ZOOQa1G/Z1G/ZOOQ`'#EO'#EOO7aQbO1G/jOOQ`1G/|1G/|OOQa1G/S1G/SO8YQcO1G/SO8dQcO1G/SO8nQcO1G/SOOQa1G/k1G/kO:^QcO1G/kO:eQcO1G/kO:lQcO1G/kOOQa1G/Q1G/QOOQa1G/O1G/OO!dQbO'#C{O:sQbO'#CwOOQ`,5:l,5:lOOQ`-E8O-E8OOOQ`1G/{1G/{OOQ`-E7x-E7xO;QQQO,59sOOQO,59t,59tOOQO-E7y-E7yO;YQbO1G/^O;pQbO1G/nOPQbO7+$xO[QbO7+%YO>uQbO7+%YO>zQbO'#D]O?PQQO'#D`OOQ`7+&_7+&_O?UQbO7+&_O?ZQbO7+&_OOQ`'#D|'#D|O?cQQO'#D|O?hQbO'#EiOOQ`'#D_'#D_O@_QbO7+&`O@jQbO7+&aO@oQbO7+&bOOQa<OAN>OOCXQbOAN>OOC^QbOAN>OOOQ`AN>`AN>`OCfQbO1G/cO>[QbO1G/fOOQ`1G/f1G/fOOQ`AN?eAN?eOOQ`AN?fAN?fOC|QbOAN?fOOQ`'#ER'#ERODRQbOAN?hO-mQbO'#DqOD^QQO'#DsOOQ`AN?hAN?hODcQbOAN?hOOQ`G23jG23jODhQbOG23jODmQbO7+$}OOQ`7+$}7+$}OOQ`7+%Q7+%QOOQ`G25QG25QOOQ`-E8P-E8POOQ`G25SG25SOEZQbOG25SOE`QRO,5:]OEgQRO,5:]OErQQO,5:_OOQ`LD)ULD)UOOQ`<[QbO1G/yO@oQbO7+%cOOQ`7+%e7+%eOOQ`<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<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!xYOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U%[UrS#[QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{^%uZrS!yYOY%nYZ#{Zt%ntu&huw%nwx&hx#O%n#O#P&h#P;'S%n;'S;=`'P<%lO%nY&mS!yYOY&hZ;'S&h;'S;=`&y<%lO&hY&|P;=`<%l&h^'SP;=`<%l%n~'[O#T~~'aO#R~U'hUrS#OQOt#{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#ZQrSOt#{uw#{x!_#{!_!`7e!`#O#{#P;'S#{;'S;=`$d<%lO#{U7jVrSOt#{uw#{x#O#{#P#Q8P#Q;'S#{;'S;=`$d<%lO#{U8WU#YQrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~8oO#U~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#hx[#VWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^?u[#XWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^@r^#WWrSOt#{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#jq#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#hx[#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 (specializeKeyword(value, stack) << 1), external: specializeKeyword},{term: 20, get: (value: keyof typeof spec_Identifier) => spec_Identifier[value] || -1}], - tokenPrec: 1700 + tokenPrec: 1582 }) diff --git a/src/parser/tests/basics.test.ts b/src/parser/tests/basics.test.ts index 47be1bd..b4092a9 100644 --- a/src/parser/tests/basics.test.ts +++ b/src/parser/tests/basics.test.ts @@ -752,7 +752,7 @@ Assign EqEq == Number 5 colon : - MultiLineBlock + Block Boolean true keyword end keyword end @@ -794,7 +794,7 @@ Assign EqEq == Number 5 colon : - MultiLineBlock + Block Boolean true keyword end keyword end diff --git a/src/parser/tests/control-flow.test.ts b/src/parser/tests/control-flow.test.ts index 69eb903..9319682 100644 --- a/src/parser/tests/control-flow.test.ts +++ b/src/parser/tests/control-flow.test.ts @@ -12,7 +12,7 @@ describe('if/elseif/else', () => { EqEq == Number 1 colon : - SingleLineBlock + Block String StringFragment cool keyword end @@ -26,7 +26,7 @@ describe('if/elseif/else', () => { keyword if Identifier x colon : - SingleLineBlock + Block Number 2 keyword end `) @@ -44,7 +44,7 @@ describe('if/elseif/else', () => { Lt < Number 9 colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier yes keyword end @@ -61,13 +61,13 @@ describe('if/elseif/else', () => { keyword if Identifier with-else colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier x ElseExpr keyword else colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier y keyword end @@ -84,14 +84,14 @@ describe('if/elseif/else', () => { keyword if Identifier with-elseif colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier x ElseIfExpr keyword elseif Identifier another-condition colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier y keyword end @@ -112,27 +112,27 @@ describe('if/elseif/else', () => { keyword if Identifier with-elseif-else colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier x ElseIfExpr keyword elseif Identifier another-condition colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier y ElseIfExpr keyword elseif Identifier yet-another-condition colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier z ElseExpr keyword else colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier oh-no keyword end @@ -148,7 +148,7 @@ describe('if/elseif/else', () => { keyword if Boolean true colon : - SingleLineBlock + 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`) }) diff --git a/src/parser/tests/exceptions.test.ts b/src/parser/tests/exceptions.test.ts index 105bab0..e89c80e 100644 --- a/src/parser/tests/exceptions.test.ts +++ b/src/parser/tests/exceptions.test.ts @@ -12,14 +12,14 @@ describe('try/catch/finally/throw', () => { TryExpr keyword try colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier risky-operation CatchExpr keyword catch Identifier err colon : - MultiLineBlock + Block FunctionCall Identifier handle-error PositionalArg @@ -37,13 +37,13 @@ describe('try/catch/finally/throw', () => { TryExpr keyword try colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier do-work FinallyExpr keyword finally colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier cleanup keyword end @@ -61,14 +61,14 @@ describe('try/catch/finally/throw', () => { TryExpr keyword try colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier risky-operation CatchExpr keyword catch Identifier err colon : - MultiLineBlock + Block FunctionCall Identifier handle-error PositionalArg @@ -76,7 +76,7 @@ describe('try/catch/finally/throw', () => { FinallyExpr keyword finally colon : - MultiLineBlock + 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 : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier empty-string keyword end @@ -227,7 +234,7 @@ describe('function-level exception handling', () => { FinallyExpr keyword finally colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier close-resources keyword end @@ -259,7 +266,7 @@ describe('function-level exception handling', () => { keyword catch Identifier err colon : - MultiLineBlock + Block FunctionCall Identifier log PositionalArg @@ -269,7 +276,7 @@ describe('function-level exception handling', () => { FinallyExpr keyword finally colon : - MultiLineBlock + Block FunctionCallOrIdentifier Identifier cleanup keyword end