From 63ee57e7f0169bcb844b1df6e59b70a390dface4 Mon Sep 17 00:00:00 2001 From: Chris Wanstrath Date: Thu, 6 Nov 2025 13:32:31 -0800 Subject: [PATCH] curly -> Curly --- src/parser/shrimp.grammar | 4 +- src/parser/shrimp.terms.ts | 86 ++++++++++++++++---------------- src/parser/shrimp.ts | 18 +++---- src/parser/tests/strings.test.ts | 15 +++--- src/parser/tokenizer.ts | 6 +-- 5 files changed, 66 insertions(+), 63 deletions(-) diff --git a/src/parser/shrimp.grammar b/src/parser/shrimp.grammar index e658096..01d82ab 100644 --- a/src/parser/shrimp.grammar +++ b/src/parser/shrimp.grammar @@ -41,7 +41,7 @@ finally { @specialize[@name=keyword] } throw { @specialize[@name=keyword] } null { @specialize[@name=Null] } -@external tokens tokenizer from "./tokenizer" { Identifier, AssignableIdentifier, Word, IdentifierBeforeDot, curlyString } +@external tokens tokenizer from "./tokenizer" { Identifier, AssignableIdentifier, Word, IdentifierBeforeDot, CurlyString } @external specialize {Identifier} specializeKeyword from "./tokenizer" { Do } @precedence { @@ -234,7 +234,7 @@ expression { } String { - "'" stringContent* "'" | curlyString + "'" stringContent* "'" | CurlyString } } diff --git a/src/parser/shrimp.terms.ts b/src/parser/shrimp.terms.ts index beab2bb..fc03a61 100644 --- a/src/parser/shrimp.terms.ts +++ b/src/parser/shrimp.terms.ts @@ -31,46 +31,46 @@ export const AssignableIdentifier = 29, Word = 30, IdentifierBeforeDot = 31, - curlyString = 95, - Do = 32, - Comment = 33, - Program = 34, - PipeExpr = 35, - WhileExpr = 37, - keyword = 79, - ConditionalOp = 39, - ParenExpr = 40, - FunctionCallWithNewlines = 41, - DotGet = 42, - Number = 43, - PositionalArg = 44, - FunctionDef = 45, - Params = 46, - NamedParam = 47, - NamedArgPrefix = 48, - String = 49, - StringFragment = 50, - Interpolation = 51, - EscapeSeq = 52, - Boolean = 53, - Null = 54, - colon = 55, - CatchExpr = 56, - Block = 58, - FinallyExpr = 59, - Underscore = 62, - NamedArg = 63, - IfExpr = 64, - FunctionCall = 66, - ElseIfExpr = 67, - ElseExpr = 69, - FunctionCallOrIdentifier = 70, - BinOp = 71, - Regex = 72, - Dict = 73, - Array = 74, - FunctionCallWithBlock = 75, - TryExpr = 76, - Throw = 78, - CompoundAssign = 80, - Assign = 81 + CurlyString = 32, + Do = 33, + Comment = 34, + Program = 35, + PipeExpr = 36, + WhileExpr = 38, + keyword = 80, + ConditionalOp = 40, + ParenExpr = 41, + FunctionCallWithNewlines = 42, + DotGet = 43, + Number = 44, + PositionalArg = 45, + FunctionDef = 46, + Params = 47, + NamedParam = 48, + NamedArgPrefix = 49, + String = 50, + StringFragment = 51, + Interpolation = 52, + EscapeSeq = 53, + Boolean = 54, + Null = 55, + colon = 56, + CatchExpr = 57, + Block = 59, + FinallyExpr = 60, + Underscore = 63, + NamedArg = 64, + IfExpr = 65, + FunctionCall = 67, + ElseIfExpr = 68, + ElseExpr = 70, + FunctionCallOrIdentifier = 71, + BinOp = 72, + Regex = 73, + Dict = 74, + Array = 75, + FunctionCallWithBlock = 76, + TryExpr = 77, + Throw = 79, + CompoundAssign = 81, + Assign = 82 diff --git a/src/parser/shrimp.ts b/src/parser/shrimp.ts index 47b13e6..d7a0ea2 100644 --- a/src/parser/shrimp.ts +++ b/src/parser/shrimp.ts @@ -4,24 +4,24 @@ import {operatorTokenizer} from "./operatorTokenizer" import {tokenizer, specializeKeyword} from "./tokenizer" import {trackScope} from "./parserScopeContext" import {highlighting} from "./highlight" -const spec_Identifier = {__proto__:null,while:76, null:108, catch:114, finally:120, end:122, if:130, else:136, try:154, throw:158} +const spec_Identifier = {__proto__:null,while:78, null:110, catch:116, finally:122, end:124, if:132, else:138, try:156, throw:160} export const parser = LRParser.deserialize({ version: 14, - states: "TQcO,5:hO?cQcO,5:hO@PQcO,5:hOOQa1G/^1G/^OOOO,59{,59{OOOO,59|,59|OOOO-E8T-E8TOOQa1G/e1G/eOOQ`,5:X,5:XOOQ`-E8W-E8WOOQa1G/{1G/{OA{QcO1G/{OBVQcO1G/{OCeQcO1G/{OCoQcO1G/{OC|QcO1G/{OOQa1G/Z1G/ZOE_QcO1G/ZOEfQcO1G/ZOEmQcO1G/ZOFlQcO1G/ZOEtQcO1G/ZOOQ`-E8Q-E8QOGSQRO1G/[OG^QQO1G/[OGcQQO1G/[OGkQQO1G/[OGvQRO1G/[OG}QRO1G/[OHUQbO,59qOH`QQO1G/[OOQa1G/[1G/[OHhQQO1G/}OOQa1G0O1G0OOHsQbO1G0OOOQO'#E['#E[OHhQQO1G/}OOQa1G/}1G/}OOQ`'#E]'#E]OHsQbO1G0OOH}QbO1G0VOIiQbO1G0UOJTQbO'#DhOJfQbO'#DhOJyQbO1G0POOQ`-E8P-E8POOQ`,5:m,5:mOOQ`-E8R-E8ROKUQQO,59vOOQO,59w,59wOOQO-E8S-E8SOK^QbO1G/aO:SQbO1G/tO:SQbO1G/XOKeQbO1G0QOKpQQO7+$vOOQa7+$v7+$vOKxQQO1G/]OLQQQO7+%iOOQa7+%i7+%iOL]QbO7+%jOOQa7+%j7+%jOOQO-E8Y-E8YOOQ`-E8Z-E8ZOOQ`'#EW'#EWOLgQQO'#EWOLoQbO'#EqOOQ`,5:S,5:SOMSQbO'#DfOMXQQO'#DiOOQ`7+%k7+%kOM^QbO7+%kOMcQbO7+%kOMkQbO7+${OMyQbO7+${ONZQbO7+%`ONcQbO7+$sOOQ`7+%l7+%lONhQbO7+%lONmQbO7+%lOOQa<qAN>qOOQ`AN>RAN>RO!!wQbOAN>RO!!|QbOAN>ROOQ`-E8X-E8XOOQ`AN>fAN>fO!#UQbOAN>fO2dQbO,5:]O:SQbO,5:_OOQ`AN>rAN>rPHUQbO'#ESOOQ`7+%W7+%WOOQ`G23mG23mO!#ZQbOG23mP!!ZQbO'#DqOOQ`G24QG24QO!#`QQO1G/wOOQ`1G/y1G/yOOQ`LD)XLD)XO:SQbO7+%cOOQ`<qOT!OOU!POj!QOt!pa#Z!pa#l!pa!Z!pa!^!pa!_!pa#h!pa!f!pa~O^yOR!iiS!iid!iie!iif!iig!iih!iii!iit!ii#Z!ii#l!ii#h!ii!Z!ii!^!ii!_!ii!f!ii~OP!iiQ!ii~P@tOPzOQzO~P@tOPzOQzOd!iie!iif!iig!iih!iii!iit!ii#Z!ii#l!ii#h!ii!Z!ii!^!ii!_!ii!f!ii~OR!iiS!ii~PBaOR{OS{O^yO~PBaOR{OS{O~PBaOW}OX}OY}OZ}O[}O]}OTwijwitwi#Zwi#lwi#hwi!Xwi!Zwi!^wi!_wi!fwi~OU!PO~PDWOU!PO~PDjOUwi~PDWOT!OOU!POjwitwi#Zwi#lwi#hwi!Xwi!Zwi!^wi!_wi!fwi~OW}OX}OY}OZ}O[}O]}O~PEtO#Z!RO#h$RO~P*[O#h$RO~O#h$ROt#VX~O!X!dO#h$ROt#VX~O#h$RO~P.gO#h$RO~P7mOpgO!`sO~P,wO#Z!RO#h$RO~O!QtO#Z#lO#k$UO~O#Z#oO#k$WO~P3[Ot!gO#Z!si#l!si!Z!si!^!si!_!si#h!si!f!si~Ot!gO#Z!ri#l!ri!Z!ri!^!ri!_!ri#h!ri!f!ri~Ot!gO!Z![X!^![X!_![X!f![X~O#Z$ZO!Z#eP!^#eP!_#eP!f#eP~P8xO!Z$_O!^$`O!_$aO~O!Q!kO!X!Oa~O#Z$eO~P8xO!Z$_O!^$`O!_$hO~O#Z!RO#h$kO~O#Z!RO#hyi~O!QtO#Z#lO#k$nO~O#Z#oO#k$oO~P3[Ot!gO#Z$pO~O#Z$ZO!Z#eX!^#eX!_#eX!f#eX~P8xOl$rO~O!X$sO~O!_$tO~O!^$`O!_$tO~Ot!gO!Z$_O!^$`O!_$vO~O#Z$ZO!Z#eP!^#eP!_#eP~P8xO!_$}O!f$|O~O!_%PO~O!_%QO~O!^$`O!_%QO~OpgO!`sO#hyq~P,wO#Z!RO#hyq~O!X%VO~O!_%XO~O!_%YO~O!^$`O!_%YO~O!Z$_O!^$`O!_%YO~O!_%^O!f$|O~O!X%aO!c%`O~O!_%^O~O!_%bO~OpgO!`sO#hyy~P,wO!_%eO~O!^$`O!_%eO~O!_%hO~O!_%kO~O!X%lO~O{!j~", - goto: "8g#hPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#iP$SP$i%g&u&{P(V(c)])`P)fP*m*mPPP*qP*}+gPPP+}#iP,g-QP-U-[-qP.h/l$S$SP$SP$S$S0r0x1U1x2O2Y2`2g2m2w2}3XPPPP3c3g4[6QPPP7[P7lPPPPP7p7v7|raOf!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lQ!XXR#b!SwaOXf!S!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lr_Of!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lQ![XS!ph%`Q!uiQ!ykQ#X!PQ#Z!OQ#^!QR#e!SvTOfh!b!c!d!g!v#t#|#}$O$]$e$s%V%`%a%l!W[STZiktwyz{|}!O!P!Q!T!U!^!a!o#f#k#p$V$l%T%cS!UX!SQ!zlR!{mQ!WXR#a!SrSOf!b!c!d!g!v#t#|#}$O$]$e$s%V%a%l!WxSTZiktwyz{|}!O!P!Q!T!U!^!a!o#f#k#p$V$l%T%cS!TX!ST!oh%`euSTw!T!U!o#f$l%T%craOf!b!c!d!g!v#t#|#}$O$]$e$s%V%a%ldsSTw!T!U!o#f$l%T%cQ!XXQ#PtR#b!SR!ngX!lg!j!m#y#S[OSTXZfhiktwyz{|}!O!P!Q!S!T!U!^!a!b!c!d!g!o!v#f#k#p#t#|#}$O$V$]$e$l$s%T%V%`%a%c%lR#z!kToQqQ$c#uQ$j$PQ$x$dR%[$yQ#u!dQ$P!vQ$f#}Q$g$OQ%W$sQ%d%VQ%j%aR%m%lQ$b#uQ$i$PQ$u$cQ$w$dQ%R$jS%Z$x$yR%f%[duSTw!T!U!o#f$l%T%cQ!_ZQ#i!^X#l!_#i#m$TvUOXf!S!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lT!rh%`T$z$f${Q%O$fR%_${wUOXf!S!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lrWOf!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lQ!VXQ!xkQ#RzQ#U{Q#W|R#`!S#T[OSTXZfhiktwyz{|}!O!P!Q!S!T!U!^!a!b!c!d!g!o!v#f#k#p#t#|#}$O$V$]$e$l$s%T%V%`%a%c%l![[STZhiktwyz{|}!O!P!Q!T!U!^!a!o#f#k#p$V$l%T%`%cw]OXf!S!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lQfOR!hf^!ec!]#q#r#s$[$dR#v!eQ!SXQ!^Z`#_!S!^#f#g$Q$l%T%cS#f!T!US#g!V![S$Q#`#eQ$l$SR%T$mQ!jgR#x!jQ!mgQ#y!jT#{!m#yQqQR!}qS$]#t$eR$q$]Q$m$SR%U$mYwST!T!U!oR#QwQ${$fR%]${Q#m!_Q$T#iT$X#m$TQ#p!aQ$V#kT$Y#p$VTeOfScOfS!]X!SQ#q!bQ#r!c`#s!d!v#}$O$s%V%a%lQ#w!gU$[#t$]$eR$d#|vVOXf!S!b!c!d!g!v#t#|#}$O$]$e$s%V%a%ldsSTw!T!U!o#f$l%T%cQ!aZS!qh%`Q!tiQ!wkQ#PtQ#RyQ#SzQ#T{Q#V|Q#X}Q#Y!OQ#[!PQ#]!QQ#k!^X#o!a#k#p$Vr^Of!b!c!d!g!v#t#|#}$O$]$e$s%V%a%l![xSTZhiktwyz{|}!O!P!Q!T!U!^!a!o#f#k#p$V$l%T%`%cQ!ZXR#d!S[vSTw!T!U!oQ$S#fV%S$l%T%cTpQqQ$^#tR$y$eQ!shR%i%`rbOf!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lQ!YXR#c!S", - nodeNames: "⚠ Star Slash Plus Minus And Or Eq EqEq Neq Lt Lte Gt Gte Modulo PlusEq MinusEq StarEq SlashEq ModuloEq Band Bor Bxor Shl Shr Ushr NullishCoalesce NullishEq Identifier AssignableIdentifier Word IdentifierBeforeDot Do Comment Program PipeExpr operator WhileExpr keyword ConditionalOp ParenExpr FunctionCall DotGet Number PositionalArg FunctionDef Params NamedParam NamedArgPrefix String StringFragment Interpolation EscapeSeq Boolean Null colon CatchExpr keyword Block FinallyExpr keyword keyword Underscore NamedArg IfExpr keyword FunctionCall ElseIfExpr keyword ElseExpr FunctionCallOrIdentifier BinOp Regex Dict Array FunctionCallWithBlock TryExpr keyword Throw keyword CompoundAssign Assign", + states: "TQcO,5:iO?cQcO,5:iO@PQcO,5:iOOQa1G/_1G/_OOOO,59|,59|OOOO,59},59}OOOO-E8U-E8UOOQa1G/f1G/fOOQ`,5:Y,5:YOOQ`-E8X-E8XOOQa1G/|1G/|OA{QcO1G/|OBVQcO1G/|OCeQcO1G/|OCoQcO1G/|OC|QcO1G/|OOQa1G/[1G/[OE_QcO1G/[OEfQcO1G/[OEmQcO1G/[OFlQcO1G/[OEtQcO1G/[OOQ`-E8R-E8ROGSQRO1G/]OG^QQO1G/]OGcQQO1G/]OGkQQO1G/]OGvQRO1G/]OG}QRO1G/]OHUQbO,59rOH`QQO1G/]OOQa1G/]1G/]OHhQQO1G0OOOQa1G0P1G0POHsQbO1G0POOQO'#E]'#E]OHhQQO1G0OOOQa1G0O1G0OOOQ`'#E^'#E^OHsQbO1G0POH}QbO1G0WOIiQbO1G0VOJTQbO'#DiOJfQbO'#DiOJyQbO1G0QOOQ`-E8Q-E8QOOQ`,5:n,5:nOOQ`-E8S-E8SOKUQQO,59wOOQO,59x,59xOOQO-E8T-E8TOK^QbO1G/bO:SQbO1G/uO:SQbO1G/YOKeQbO1G0ROKpQQO7+$wOOQa7+$w7+$wOKxQQO1G/^OLQQQO7+%jOOQa7+%j7+%jOL]QbO7+%kOOQa7+%k7+%kOOQO-E8Z-E8ZOOQ`-E8[-E8[OOQ`'#EX'#EXOLgQQO'#EXOLoQbO'#EqOOQ`,5:T,5:TOMSQbO'#DgOMXQQO'#DjOOQ`7+%l7+%lOM^QbO7+%lOMcQbO7+%lOMkQbO7+$|OMyQbO7+$|ONZQbO7+%aONcQbO7+$tOOQ`7+%m7+%mONhQbO7+%mONmQbO7+%mOOQa<rAN>rOOQ`AN>SAN>SO!!wQbOAN>SO!!|QbOAN>SOOQ`-E8Y-E8YOOQ`AN>gAN>gO!#UQbOAN>gO2dQbO,5:^O:SQbO,5:`OOQ`AN>sAN>sPHUQbO'#ETOOQ`7+%X7+%XOOQ`G23nG23nO!#ZQbOG23nP!!ZQbO'#DrOOQ`G24RG24RO!#`QQO1G/xOOQ`1G/z1G/zOOQ`LD)YLD)YO:SQbO7+%dOOQ`<qOT!OOU!POj!QOu!qa#Z!qa#l!qa![!qa!_!qa!`!qa#h!qa!g!qa~O^yOR!jiS!jid!jie!jif!jig!jih!jii!jiu!ji#Z!ji#l!ji#h!ji![!ji!_!ji!`!ji!g!ji~OP!jiQ!ji~P@tOPzOQzO~P@tOPzOQzOd!jie!jif!jig!jih!jii!jiu!ji#Z!ji#l!ji#h!ji![!ji!_!ji!`!ji!g!ji~OR!jiS!ji~PBaOR{OS{O^yO~PBaOR{OS{O~PBaOW}OX}OY}OZ}O[}O]}OTxijxiuxi#Zxi#lxi#hxi!Yxi![xi!_xi!`xi!gxi~OU!PO~PDWOU!PO~PDjOUxi~PDWOT!OOU!POjxiuxi#Zxi#lxi#hxi!Yxi![xi!_xi!`xi!gxi~OW}OX}OY}OZ}O[}O]}O~PEtO#Z!RO#h$RO~P*[O#h$RO~O#h$ROu#VX~O!Y!dO#h$ROu#VX~O#h$RO~P.gO#h$RO~P7mOqgO!asO~P,wO#Z!RO#h$RO~O!RtO#Z#lO#k$UO~O#Z#oO#k$WO~P3[Ou!gO#Z!ti#l!ti![!ti!_!ti!`!ti#h!ti!g!ti~Ou!gO#Z!si#l!si![!si!_!si!`!si#h!si!g!si~Ou!gO![!]X!_!]X!`!]X!g!]X~O#Z$ZO![#eP!_#eP!`#eP!g#eP~P8xO![$_O!_$`O!`$aO~O!R!kO!Y!Pa~O#Z$eO~P8xO![$_O!_$`O!`$hO~O#Z!RO#h$kO~O#Z!RO#hzi~O!RtO#Z#lO#k$nO~O#Z#oO#k$oO~P3[Ou!gO#Z$pO~O#Z$ZO![#eX!_#eX!`#eX!g#eX~P8xOl$rO~O!Y$sO~O!`$tO~O!_$`O!`$tO~Ou!gO![$_O!_$`O!`$vO~O#Z$ZO![#eP!_#eP!`#eP~P8xO!`$}O!g$|O~O!`%PO~O!`%QO~O!_$`O!`%QO~OqgO!asO#hzq~P,wO#Z!RO#hzq~O!Y%VO~O!`%XO~O!`%YO~O!_$`O!`%YO~O![$_O!_$`O!`%YO~O!`%^O!g$|O~O!Y%aO!d%`O~O!`%^O~O!`%bO~OqgO!asO#hzy~P,wO!`%eO~O!_$`O!`%eO~O!`%hO~O!`%kO~O!Y%lO~O|!k~", + goto: "8g#hPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#iP$SP$i%g&u&{P(V(c)])`P)fP*m*mPPP*qP*}+gPPP+}#iP,g-QP-U-[-qP.h/l$S$SP$SP$S$S0r0x1U1x2O2Y2`2g2m2w2}3XPPP3c3g4[6QPPP7[P7lPPPPP7p7v7|raOf!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lQ!XXR#b!SwaOXf!S!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lr_Of!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lQ![XS!ph%`Q!uiQ!ykQ#X!PQ#Z!OQ#^!QR#e!SvTOfh!b!c!d!g!v#t#|#}$O$]$e$s%V%`%a%l!W[STZiktwyz{|}!O!P!Q!T!U!^!a!o#f#k#p$V$l%T%cS!UX!SQ!zlR!{mQ!WXR#a!SrSOf!b!c!d!g!v#t#|#}$O$]$e$s%V%a%l!WxSTZiktwyz{|}!O!P!Q!T!U!^!a!o#f#k#p$V$l%T%cS!TX!ST!oh%`euSTw!T!U!o#f$l%T%craOf!b!c!d!g!v#t#|#}$O$]$e$s%V%a%ldsSTw!T!U!o#f$l%T%cQ!XXQ#PtR#b!SR!ngX!lg!j!m#y#S[OSTXZfhiktwyz{|}!O!P!Q!S!T!U!^!a!b!c!d!g!o!v#f#k#p#t#|#}$O$V$]$e$l$s%T%V%`%a%c%lR#z!kToQqQ$c#uQ$j$PQ$x$dR%[$yQ#u!dQ$P!vQ$f#}Q$g$OQ%W$sQ%d%VQ%j%aR%m%lQ$b#uQ$i$PQ$u$cQ$w$dQ%R$jS%Z$x$yR%f%[duSTw!T!U!o#f$l%T%cQ!_ZQ#i!^X#l!_#i#m$TvUOXf!S!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lT!rh%`T$z$f${Q%O$fR%_${wUOXf!S!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lrWOf!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lQ!VXQ!xkQ#RzQ#U{Q#W|R#`!S#T[OSTXZfhiktwyz{|}!O!P!Q!S!T!U!^!a!b!c!d!g!o!v#f#k#p#t#|#}$O$V$]$e$l$s%T%V%`%a%c%l![[STZhiktwyz{|}!O!P!Q!T!U!^!a!o#f#k#p$V$l%T%`%cw]OXf!S!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lQfOR!hf^!ec!]#q#r#s$[$dR#v!eQ!SXQ!^Z`#_!S!^#f#g$Q$l%T%cS#f!T!US#g!V![S$Q#`#eQ$l$SR%T$mQ!jgR#x!jQ!mgQ#y!jT#{!m#yQqQR!}qS$]#t$eR$q$]Q$m$SR%U$mYwST!T!U!oR#QwQ${$fR%]${Q#m!_Q$T#iT$X#m$TQ#p!aQ$V#kT$Y#p$VTeOfScOfS!]X!SQ#q!bQ#r!c`#s!d!v#}$O$s%V%a%lQ#w!gU$[#t$]$eR$d#|vVOXf!S!b!c!d!g!v#t#|#}$O$]$e$s%V%a%ldsSTw!T!U!o#f$l%T%cQ!aZS!qh%`Q!tiQ!wkQ#PtQ#RyQ#SzQ#T{Q#V|Q#X}Q#Y!OQ#[!PQ#]!QQ#k!^X#o!a#k#p$Vr^Of!b!c!d!g!v#t#|#}$O$]$e$s%V%a%l![xSTZhiktwyz{|}!O!P!Q!T!U!^!a!o#f#k#p$V$l%T%`%cQ!ZXR#d!S[vSTw!T!U!oQ$S#fV%S$l%T%cTpQqQ$^#tR$y$eQ!shR%i%`rbOf!b!c!d!g!v#t#|#}$O$]$e$s%V%a%lQ!YXR#c!S", + nodeNames: "⚠ Star Slash Plus Minus And Or Eq EqEq Neq Lt Lte Gt Gte Modulo PlusEq MinusEq StarEq SlashEq ModuloEq Band Bor Bxor Shl Shr Ushr NullishCoalesce NullishEq Identifier AssignableIdentifier Word IdentifierBeforeDot CurlyString Do Comment Program PipeExpr operator WhileExpr keyword ConditionalOp ParenExpr FunctionCall DotGet Number PositionalArg FunctionDef Params NamedParam NamedArgPrefix String StringFragment Interpolation EscapeSeq Boolean Null colon CatchExpr keyword Block FinallyExpr keyword keyword Underscore NamedArg IfExpr keyword FunctionCall ElseIfExpr keyword ElseExpr FunctionCallOrIdentifier BinOp Regex Dict Array FunctionCallWithBlock TryExpr keyword Throw keyword CompoundAssign Assign", maxTerm: 120, context: trackScope, nodeProps: [ - ["closedBy", 55,"end"] + ["closedBy", 56,"end"] ], propSources: [highlighting], - skippedNodes: [0,33], + skippedNodes: [0,34], repeatNodeCount: 12, - tokenData: "IS~R}OX$OXY$mYZ%WZp$Opq$mqs$Ost%qtu'Yuw$Owx'_xy'dyz'}z{$O{|(h|}$O}!O(h!O!P$O!P!Q0o!Q!R)Y!R![+w![!]9[!]!^%W!^!}$O!}#O9u#O#P;k#P#Q;p#Q#R$O#R#S`#Z#be_!SSOt$Ouw$Ox}$O}!O`#Z#be_!TSOt$Ouw$Ox}$O}!O (specializeKeyword(value, stack) << 1), external: specializeKeyword},{term: 28, get: (value: keyof typeof spec_Identifier) => spec_Identifier[value] || -1}], tokenPrec: 2229 }) diff --git a/src/parser/tests/strings.test.ts b/src/parser/tests/strings.test.ts index 288315b..22f780b 100644 --- a/src/parser/tests/strings.test.ts +++ b/src/parser/tests/strings.test.ts @@ -131,27 +131,30 @@ describe('string escape sequences', () => { describe('curly strings', () => { test('work on one line', () => { expect('{ one two three }').toMatchTree(` - String one two three + String + CurlyString { one two three } `) }) test('work on multiple lines', () => { - expect(`{ + expect(`{ one two three }`).toMatchTree(` - String + String + CurlyString { one two - three `) + three }`) }) test('can contain other curlies', () => { expect(`{ { one } two { three } }`).toMatchTree(` - String { one } + String + CurlyString { { one } two - { three } `) + { three } }`) }) }) \ No newline at end of file diff --git a/src/parser/tokenizer.ts b/src/parser/tokenizer.ts index 0189033..cb2d210 100644 --- a/src/parser/tokenizer.ts +++ b/src/parser/tokenizer.ts @@ -1,5 +1,5 @@ import { ExternalTokenizer, InputStream, Stack } from '@lezer/lr' -import { Identifier, AssignableIdentifier, Word, IdentifierBeforeDot, Do, curlyString } from './shrimp.terms' +import { Identifier, AssignableIdentifier, Word, IdentifierBeforeDot, Do, CurlyString } from './shrimp.terms' // doobie doobie do (we need the `do` keyword to know when we're defining params) export function specializeKeyword(ident: string) { @@ -164,7 +164,7 @@ const consumeRestOfWord = (input: InputStream, startPos: number, canBeWord: bool } const consumeCurlyString = (input: InputStream, stack: Stack) => { - if (!stack.canShift(curlyString)) return + if (!stack.canShift(CurlyString)) return let depth = 0 let pos = 0 @@ -185,7 +185,7 @@ const consumeCurlyString = (input: InputStream, stack: Stack) => { pos++ } - input.acceptToken(curlyString, pos) + input.acceptToken(CurlyString, pos) } // Check if this identifier is in scope (for property access detection)