Compare commits

...

4 Commits

7 changed files with 57 additions and 19 deletions

View File

@ -303,7 +303,8 @@ export class Compiler {
return instructions
}
case terms.ThenBlock: {
case terms.ThenBlock:
case terms.SingleLineThenBlock: {
const instructions = getAllChildren(node)
.map((child) => this.#compileNode(child, input))
.flat()
@ -468,7 +469,11 @@ export class Compiler {
}
default:
throw new CompilerError(`Unsupported syntax node: ${node.type.name}`, node.from, node.to)
throw new CompilerError(
`Compiler doesn't know how to handle a "${node.type.name}" node.`,
node.from,
node.to
)
}
}
}

View File

@ -141,7 +141,7 @@ describe('compiler', () => {
})
test('single line if', () => {
expect(`if 3 < 9: shire`).toEvaluateTo('shire')
expect(`if 3 < 9: shire end`).toEvaluateTo('shire')
})
})

View File

@ -2,7 +2,7 @@
@context trackScope from "./scopeTracker"
@skip { space }
@skip { space | comment }
@top Program { item* }
@ -18,6 +18,7 @@
newlineOrSemicolon { "\n" | ";" }
eof { @eof }
space { " " | "\t" }
comment { "#" ![\n]* }
leftParen { "(" }
rightParen { ")" }
colon[closedBy="end", @name="colon"] { ":" }
@ -104,7 +105,7 @@ IfExpr {
}
singleLineIf {
@specialize[@name=keyword]<Identifier, "if"> (ConditionalOp | expression) colon ThenBlock { consumeToTerminator }
@specialize[@name=keyword]<Identifier, "if"> (ConditionalOp | expression) colon SingleLineThenBlock @specialize[@name=keyword]<Identifier, "end">
}
multilineIf {
@ -123,6 +124,10 @@ ThenBlock {
block
}
SingleLineThenBlock {
consumeToTerminator
}
ConditionalOp {
expression Eq expression |
expression Neq expression |

View File

@ -41,6 +41,7 @@ export const
NamedArg = 40,
NamedArgPrefix = 41,
IfExpr = 43,
SingleLineThenBlock = 45,
ThenBlock = 46,
ElseIfExpr = 47,
ElseExpr = 49,

View File

@ -7,11 +7,11 @@ import {highlighting} from "./highlight"
const spec_Identifier = {__proto__:null,do:52, end:58, null:74, if:88, elseif:96, else:100}
export const parser = LRParser.deserialize({
version: 14,
states: ".jQVQbOOO#XQcO'#CrO$RQRO'#CsO$aQcO'#DmO$xQbO'#DsOOQ`'#Cu'#CuO%QQbO'#CqO%rOSO'#CzOOQa'#Dq'#DqO&QOpO'#DSO&VQcO'#DpOOQ`'#Dn'#DnO&nQbO'#DmO&|QbO'#EQOOQ`'#DX'#DXO'kQRO'#DaOOQ`'#Dm'#DmO'pQQO'#DlOOQ`'#Dl'#DlOOQ`'#Db'#DbQVQbOOOOQa'#Dp'#DpOOQ`'#Cp'#CpO'xQbO'#DUOOQ`'#Do'#DoOOQ`'#Dc'#DcO(SQbO,59ZO&|QbO,59_O&|QbO,59_OOQ`'#Dd'#DdO(pQbO'#CwO(xQQO,5:_O)iQRO'#CsO)yQRO,59]O*[QRO,59]O*VQQO,59]O+VQQO,59]O+_QbO'#C|O+gQWO'#C}OOOO'#Dy'#DyOOOO'#Df'#DfO+{OSO,59fOOQa,59f,59fO,ZO`O,59nO,`QbO'#DgO,eQbO,59YO,vQRO,5:lO,}QQO,5:lO-SQbO,59{OOQ`,5:W,5:WOOQ`-E7`-E7`OOQ`,59p,59pOOQ`-E7a-E7aOOQa1G.y1G.yO-^QcO1G.yOOQ`-E7b-E7bO-xQbO1G/yO&|QbO,59`O&|QbO,59`OOQa1G.w1G.wOOOO,59h,59hOOOO,59i,59iOOOO-E7d-E7dOOQa1G/Q1G/QOOQa1G/Y1G/YO!QQbO'#CrOOQ`,5:R,5:ROOQ`-E7e-E7eO.VQbO1G0WOOQ`1G/g1G/gO.dQbO7+%eO.iQbO7+%fOOQO1G.z1G.zO.vQRO1G.zOOQ`'#DZ'#DZOOQ`7+%r7+%rO/QQbO7+%sOOQ`<<IP<<IPO/eQQO'#DeO/jQbO'#DvO/}QbO<<IQOOQ`'#D['#D[O0SQbO<<I_OOQ`,5:P,5:POOQ`-E7c-E7cOOQ`AN>lAN>lO&|QbO'#D]OOQ`'#Dh'#DhO0_QbOAN>yO0jQQO'#D_OOQ`AN>yAN>yO0oQbOAN>yO0tQRO,59wO0{QQO,59wOOQ`-E7f-E7fOOQ`G24eG24eO1QQbOG24eO1VQQO,59yO1[QQO1G/cOOQ`LD*PLD*PO.iQbO1G/eO/QQbO7+$}OOQ`7+%P7+%POOQ`<<Hi<<Hi",
stateData: "1d~O!_OS~O]PO^_O_WO`XOjSOrWOsWOtWOuWO|]O!fUO!ibO!lVO~O]eO_WO`XOjSOrWOsWOtWOuWOwfOygO!fUO!lVOzfX!ifX!vfX!kfXmfX~OP!dXQ!dXR!dXS!dXT!dXU!dXV!dXW!dXX!dXY!dXZ!dX[!dX~P!QOPkOQkORlOSlO~OPkOQkORlOSlO!i!aX!v!aXm!aX~O^mOlkP~O]PO_WO`XOjSOrWOsWOtWOuWO!fUO!lVO~OowO!lzO!nuO!ovO~O!s{O~OP!dXQ!dXR!dXS!dX!i!aX!v!aXm!aX~Oz|O!i!aX!v!aXm!aX~O]eO_WO`XOrWOsWOtWOuWO!fUO!lVO~OV!QO~O!i!RO!v!RO~OjSOw!TO~P&|OjSOwfOygOzca!ica!vca!kcamca~P&|O^mOlkX~Ol!YO~OT![OU![OV!ZOW!ZOX!ZOY!ZOZ!ZO[!ZO~OPkOQkORlOSlO~P(}OPkOQkORlOSlO!k!]O~O!k!]OP!dXQ!dXR!dXS!dXT!dXU!dXV!dXW!dXX!dXY!dXZ!dX[!dX~Oz|O!k!]O~O]!^O!fUO~O!l!_O!n!_O!o!_O!p!_O!q!_O!r!_O~OowO!l!aO!nuO!ovO~O]!bO~O]!cO~Oz|O!iba!vba!kbamba~Ol!fO~P(}Ol!fO~O^_O|]O~P%QOPkOQkORgiSgi!igi!vgi!kgimgi~O^_O|]O!i!iO~P%QO^_O|]O!i!nO~P%QOm!oO~O^_O|]Om!jP~P%QO!khilhi~P(}O^_O|]Om!jP!Q!jP!S!jP~P%QO!i!uO~O^_O|]Om!jX!Q!jX!S!jX~P%QOm!wO~Om!|O!Q!xO!S!{O~Om#RO!Q!xO!S!{O~Ol#TO~Om#RO~Ol#UO~P(}Ol#UO~Om#VO~O!i#WO~O!i#XO~Ort~",
goto: "+q!vPPPPPPPPPPPPPPPPPP!w#W#f#k#W$V$l$xP%aPP%dP%{%{PPPP&PP#fPP&jP&v&y'SP'WP&j'^'d'k'q'z(Q(XPPP(_(c(w)Z)`*ZP*v*vP+XPP+aPPPPPP+e+ed`Od!Q!Y!f!i!n!q#W#XRsUiZOUd|!Q!Y!f!i!n!q#W#XVhPj!czWOPU]dgjkl!Q!Y!Z![!c!f!i!n!q!x#W#XR!^udROd!Q!Y!f!i!n!q#W#XQqUQ!VkR!WlQsUQ!P]Q!j![R#P!xd`Od!Q!Y!f!i!n!q#W#XUfPj!cQsUR!TgRoS{WOPU]dgjkl!Q!Y!Z![!c!f!i!n!q!x#W#XTwVydYOd!Q!Y!f!i!n!q#W#XgePU]gjkl!Z![!c!xe`Od!Q!Y!f!i!n!q#W#XR!m!fQ!t!nQ#Y#WR#Z#XT!y!t!zQ!}!tR#S!zQdOR!SdSjP!cR!UjQnSR!XnW!q!i!n#W#XR!v!qQyVR!`yS}[tR!e}Q!z!tR#Q!zTcOdSaOdQ!g!QQ!h!YQ!l!fZ!p!i!n!q#W#Xd[Od!Q!Y!f!i!n!q#W#XQtUR!d|ViPj!cdQOd!Q!Y!f!i!n!q#W#XUfPj!cQpUQ!O]Q!TgQ!VkQ!WlQ!j!ZQ!k![R#O!xdYOd!Q!Y!f!i!n!q#W#XdeP]gjkl!Z![!c!xRrUoTOPUdgj!Q!Y!c!f!i!n!q#W#XQ!r!iV!s!n#W#XTxVye^Od!Q!Y!f!i!n!q#W#X",
nodeNames: "⚠ Star Slash Plus Minus And Or Eq Neq Lt Lte Gt Gte Identifier AssignableIdentifier Word IdentifierBeforeDot Program PipeExpr FunctionCall PositionalArg ParenExpr FunctionCallOrIdentifier BinOp ConditionalOp FunctionDef keyword Params colon keyword String StringFragment Interpolation EscapeSeq Number Boolean Regex Null DotGet Underscore NamedArg NamedArgPrefix operator IfExpr keyword ThenBlock ThenBlock ElseIfExpr keyword ElseExpr keyword Assign",
maxTerm: 84,
states: ".pQYQbOOO#[QcO'#CrO$UQRO'#CsO$dQcO'#DnO${QbO'#DtOOQ`'#Cu'#CuO%TQbO'#CqO%uOSO'#CzOOQa'#Dr'#DrO&TOpO'#DSO&YQcO'#DqOOQ`'#Do'#DoO&qQbO'#DnO'PQbO'#EROOQ`'#DX'#DXO'nQRO'#DaOOQ`'#Dn'#DnO'sQQO'#DmOOQ`'#Dm'#DmOOQ`'#Db'#DbQYQbOOOOQa'#Dq'#DqOOQ`'#Cp'#CpO'{QbO'#DUOOQ`'#Dp'#DpOOQ`'#Dc'#DcO(VQbO,59ZO'PQbO,59_O'PQbO,59_OOQ`'#Dd'#DdO(sQbO'#CwO({QQO,5:`O)lQRO'#CsO)|QRO,59]O*_QRO,59]O*YQQO,59]O+YQQO,59]O+bQbO'#C|O+jQWO'#C}OOOO'#Dz'#DzOOOO'#Df'#DfO,OOSO,59fOOQa,59f,59fO,^O`O,59nO,cQbO'#DgO,hQbO,59YO,yQRO,5:mO-QQQO,5:mO-VQbO,59{OOQ`,5:X,5:XOOQ`-E7`-E7`OOQ`,59p,59pOOQ`-E7a-E7aOOQa1G.y1G.yO-aQcO1G.yOOQ`-E7b-E7bO-{QbO1G/zO'PQbO,59`O'PQbO,59`OOQa1G.w1G.wOOOO,59h,59hOOOO,59i,59iOOOO-E7d-E7dOOQa1G/Q1G/QOOQa1G/Y1G/YO!TQbO'#CrOOQ`,5:R,5:ROOQ`-E7e-E7eO.YQbO1G0XOOQ`1G/g1G/gO.gQbO7+%fO.lQbO7+%gOOQO1G.z1G.zO.yQRO1G.zOOQ`'#DZ'#DZO/TQbO7+%sO/YQbO7+%tOOQ`<<IQ<<IQO/mQQO'#DeO/rQbO'#DwO0VQbO<<IROOQ`<<I_<<I_OOQ`'#D['#D[O0[QbO<<I`OOQ`,5:P,5:POOQ`-E7c-E7cOOQ`AN>mAN>mO'PQbO'#D]OOQ`'#Dh'#DhO0gQbOAN>zO0rQQO'#D_OOQ`AN>zAN>zO0wQbOAN>zO0|QRO,59wO1TQQO,59wOOQ`-E7f-E7fOOQ`G24fG24fO1YQbOG24fO1_QQO,59yO1dQQO1G/cOOQ`LD*QLD*QO.lQbO1G/eO/YQbO7+$}OOQ`7+%P7+%POOQ`<<Hi<<Hi",
stateData: "1l~O!_OS!`OS~O]PO^_O_WO`XOjSOrWOsWOtWOuWO|]O!gUO!jbO!mVO~O]eO_WO`XOjSOrWOsWOtWOuWOwfOygO!gUO!mVOzfX!jfX!wfX!lfXmfX~OP!eXQ!eXR!eXS!eXT!eXU!eXV!eXW!eXX!eXY!eXZ!eX[!eX~P!TOPkOQkORlOSlO~OPkOQkORlOSlO!j!bX!w!bXm!bX~O^mOlkP~O]PO_WO`XOjSOrWOsWOtWOuWO!gUO!mVO~OowO!mzO!ouO!pvO~O!t{O~OP!eXQ!eXR!eXS!eX!j!bX!w!bXm!bX~Oz|O!j!bX!w!bXm!bX~O]eO_WO`XOrWOsWOtWOuWO!gUO!mVO~OV!QO~O!j!RO!w!RO~OjSOw!TO~P'POjSOwfOygOzca!jca!wca!lcamca~P'PO^mOlkX~Ol!YO~OT![OU![OV!ZOW!ZOX!ZOY!ZOZ!ZO[!ZO~OPkOQkORlOSlO~P)QOPkOQkORlOSlO!l!]O~O!l!]OP!eXQ!eXR!eXS!eXT!eXU!eXV!eXW!eXX!eXY!eXZ!eX[!eX~Oz|O!l!]O~O]!^O!gUO~O!m!_O!o!_O!p!_O!q!_O!r!_O!s!_O~OowO!m!aO!ouO!pvO~O]!bO~O]!cO~Oz|O!jba!wba!lbamba~Ol!fO~P)QOl!fO~O^_O|]O~P%TOPkOQkORgiSgi!jgi!wgi!lgimgi~O^_O|]O!j!iO~P%TO^_O|]O!j!nO~P%TOm!oO~O^_O|]Om!kP~P%TO!lhilhi~P)QOm!sO~O^_O|]Om!kP!Q!kP!S!kP~P%TO!j!vO~O^_O|]Om!kX!Q!kX!S!kX~P%TOm!xO~Om!}O!Q!yO!S!|O~Om#SO!Q!yO!S!|O~Ol#UO~Om#SO~Ol#VO~P)QOl#VO~Om#WO~O!j#XO~O!j#YO~Ort~",
goto: "+r!wPPPPPPPPPPPPPPPPPP!x#X#g#l#X$W$m$yP%bPP%eP%|%|PPPP&QP#gPP&kP&w&z'TP'XP&k'_'e'l'r'{(R(YPPPP(`(d(x)[)a*[P*w*wP+YPP+bPPPPPP+f+fd`Od!Q!Y!f!i!n!q#X#YRsUiZOUd|!Q!Y!f!i!n!q#X#YVhPj!czWOPU]dgjkl!Q!Y!Z![!c!f!i!n!q!y#X#YR!^udROd!Q!Y!f!i!n!q#X#YQqUQ!VkR!WlQsUQ!P]Q!j![R#Q!yd`Od!Q!Y!f!i!n!q#X#YUfPj!cQsUR!TgRoS{WOPU]dgjkl!Q!Y!Z![!c!f!i!n!q!y#X#YTwVydYOd!Q!Y!f!i!n!q#X#YgePU]gjkl!Z![!c!ye`Od!Q!Y!f!i!n!q#X#YR!m!fQ!u!nQ#Z#XR#[#YT!z!u!{Q#O!uR#T!{QdOR!SdSjP!cR!UjQnSR!XnW!q!i!n#X#YR!w!qQyVR!`yS}[tR!e}Q!{!uR#R!{TcOdSaOdQ!g!QQ!h!YQ!l!fZ!p!i!n!q#X#Yd[Od!Q!Y!f!i!n!q#X#YQtUR!d|ViPj!cdQOd!Q!Y!f!i!n!q#X#YUfPj!cQpUQ!O]Q!TgQ!VkQ!WlQ!j!ZQ!k![R#P!ydYOd!Q!Y!f!i!n!q#X#YdeP]gjkl!Z![!c!yRrUoTOPUdgj!Q!Y!c!f!i!n!q#X#YQ!r!iV!t!n#X#YTxVye^Od!Q!Y!f!i!n!q#X#Y",
nodeNames: "⚠ Star Slash Plus Minus And Or Eq Neq Lt Lte Gt Gte Identifier AssignableIdentifier Word IdentifierBeforeDot Program PipeExpr FunctionCall PositionalArg ParenExpr FunctionCallOrIdentifier BinOp ConditionalOp FunctionDef keyword Params colon keyword String StringFragment Interpolation EscapeSeq Number Boolean Regex Null DotGet Underscore NamedArg NamedArgPrefix operator IfExpr keyword SingleLineThenBlock ThenBlock ElseIfExpr keyword ElseExpr keyword Assign",
maxTerm: 85,
context: trackScope,
nodeProps: [
["closedBy", 28,"end"]
@ -19,9 +19,9 @@ export const parser = LRParser.deserialize({
propSources: [highlighting],
skippedNodes: [0],
repeatNodeCount: 7,
tokenData: "<}~RyOX#rXY$aYZ$zZp#rpq$aqt#rtu%euw#rwx%jxy%oyz&Yz{#r{|&s|}#r}!O&s!O!P#r!P!Q)g!Q!['b![!]2S!]!^$z!^#O#r#O#P2m#P#R#r#R#S2r#S#T#r#T#Y3]#Y#Z4k#Z#b3]#b#c8y#c#f3]#f#g9p#g#h3]#h#i:g#i#o3]#o#p#r#p#q<_#q;'S#r;'S;=`$Z<%l~#r~O#r~~<xS#wUoSOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rS$^P;=`<%l#r^$hUoS!_YOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU%RUoS!iQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#r~%jO!n~~%oO!l~U%vUoS!fQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU&aUoS!kQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU&xWoSOt#ruw#rx!Q#r!Q!['b![#O#r#P;'S#r;'S;=`$Z<%lO#rU'iYoSrQOt#ruw#rx!O#r!O!P(X!P!Q#r!Q!['b![#O#r#P;'S#r;'S;=`$Z<%lO#rU(^WoSOt#ruw#rx!Q#r!Q![(v![#O#r#P;'S#r;'S;=`$Z<%lO#rU(}WoSrQOt#ruw#rx!Q#r!Q![(v![#O#r#P;'S#r;'S;=`$Z<%lO#rU)lWoSOt#ruw#rx!P#r!P!Q*U!Q#O#r#P;'S#r;'S;=`$Z<%lO#rU*Z^oSOY+VYZ#rZt+Vtu,Yuw+Vwx,Yx!P+V!P!Q#r!Q!}+V!}#O0{#O#P.h#P;'S+V;'S;=`1|<%lO+VU+^^oStQOY+VYZ#rZt+Vtu,Yuw+Vwx,Yx!P+V!P!Q.}!Q!}+V!}#O0{#O#P.h#P;'S+V;'S;=`1|<%lO+VQ,_XtQOY,YZ!P,Y!P!Q,z!Q!},Y!}#O-i#O#P.h#P;'S,Y;'S;=`.w<%lO,YQ,}P!P!Q-QQ-VUtQ#Z#[-Q#]#^-Q#a#b-Q#g#h-Q#i#j-Q#m#n-QQ-lVOY-iZ#O-i#O#P.R#P#Q,Y#Q;'S-i;'S;=`.b<%lO-iQ.USOY-iZ;'S-i;'S;=`.b<%lO-iQ.eP;=`<%l-iQ.kSOY,YZ;'S,Y;'S;=`.w<%lO,YQ.zP;=`<%l,YU/SWoSOt#ruw#rx!P#r!P!Q/l!Q#O#r#P;'S#r;'S;=`$Z<%lO#rU/sboStQOt#ruw#rx#O#r#P#Z#r#Z#[/l#[#]#r#]#^/l#^#a#r#a#b/l#b#g#r#g#h/l#h#i#r#i#j/l#j#m#r#m#n/l#n;'S#r;'S;=`$Z<%lO#rU1Q[oSOY0{YZ#rZt0{tu-iuw0{wx-ix#O0{#O#P.R#P#Q+V#Q;'S0{;'S;=`1v<%lO0{U1yP;=`<%l0{U2PP;=`<%l+VU2ZUoSlQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#r~2rO!o~U2yUoSwQOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU3bYoSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#o3]#o;'S#r;'S;=`$Z<%lO#rU4XUyQoSOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#rU4pZoSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#U5c#U#o3]#o;'S#r;'S;=`$Z<%lO#rU5h[oSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#`3]#`#a6^#a#o3]#o;'S#r;'S;=`$Z<%lO#rU6c[oSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#g3]#g#h7X#h#o3]#o;'S#r;'S;=`$Z<%lO#rU7^[oSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#X3]#X#Y8S#Y#o3]#o;'S#r;'S;=`$Z<%lO#rU8ZYsQoSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#o3]#o;'S#r;'S;=`$Z<%lO#r^9QY!pWoSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#o3]#o;'S#r;'S;=`$Z<%lO#r^9wY!rWoSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#o3]#o;'S#r;'S;=`$Z<%lO#r^:n[!qWoSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#f3]#f#g;d#g#o3]#o;'S#r;'S;=`$Z<%lO#rU;i[oSOt#ruw#rx!_#r!_!`4Q!`#O#r#P#T#r#T#i3]#i#j7X#j#o3]#o;'S#r;'S;=`$Z<%lO#rU<fUzQoSOt#ruw#rx#O#r#P;'S#r;'S;=`$Z<%lO#r~<}O!v~",
tokenizers: [operatorTokenizer, 1, 2, 3, tokenizer, new LocalTokenGroup("[~RP!O!PU~ZO!s~~", 11)],
tokenData: ">i~RzOX#uXY$dYZ$}Zp#upq$dqs#ust%htu'Puw#uwx'Uxy'Zyz'tz{#u{|(_|}#u}!O(_!O!P#u!P!Q+R!Q![(|![!]3n!]!^$}!^#O#u#O#P4X#P#R#u#R#S4^#S#T#u#T#Y4w#Y#Z6V#Z#b4w#b#c:e#c#f4w#f#g;[#g#h4w#h#i<R#i#o4w#o#p#u#p#q=y#q;'S#u;'S;=`$^<%l~#u~O#u~~>dS#zUoSOt#uuw#ux#O#u#P;'S#u;'S;=`$^<%lO#uS$aP;=`<%l#u^$kUoS!_YOt#uuw#ux#O#u#P;'S#u;'S;=`$^<%lO#uU%UUoS!jQOt#uuw#ux#O#u#P;'S#u;'S;=`$^<%lO#u^%oZoS!`YOY%hYZ#uZt%htu&buw%hwx&bx#O%h#O#P&b#P;'S%h;'S;=`&y<%lO%hY&gS!`YOY&bZ;'S&b;'S;=`&s<%lO&bY&vP;=`<%l&b^&|P;=`<%l%h~'UO!o~~'ZO!m~U'bUoS!gQOt#uuw#ux#O#u#P;'S#u;'S;=`$^<%lO#uU'{UoS!lQOt#uuw#ux#O#u#P;'S#u;'S;=`$^<%lO#uU(dWoSOt#uuw#ux!Q#u!Q![(|![#O#u#P;'S#u;'S;=`$^<%lO#uU)TYoSrQOt#uuw#ux!O#u!O!P)s!P!Q#u!Q![(|![#O#u#P;'S#u;'S;=`$^<%lO#uU)xWoSOt#uuw#ux!Q#u!Q![*b![#O#u#P;'S#u;'S;=`$^<%lO#uU*iWoSrQOt#uuw#ux!Q#u!Q![*b![#O#u#P;'S#u;'S;=`$^<%lO#uU+WWoSOt#uuw#ux!P#u!P!Q+p!Q#O#u#P;'S#u;'S;=`$^<%lO#uU+u^oSOY,qYZ#uZt,qtu-tuw,qwx-tx!P,q!P!Q#u!Q!},q!}#O2g#O#P0S#P;'S,q;'S;=`3h<%lO,qU,x^oStQOY,qYZ#uZt,qtu-tuw,qwx-tx!P,q!P!Q0i!Q!},q!}#O2g#O#P0S#P;'S,q;'S;=`3h<%lO,qQ-yXtQOY-tZ!P-t!P!Q.f!Q!}-t!}#O/T#O#P0S#P;'S-t;'S;=`0c<%lO-tQ.iP!P!Q.lQ.qUtQ#Z#[.l#]#^.l#a#b.l#g#h.l#i#j.l#m#n.lQ/WVOY/TZ#O/T#O#P/m#P#Q-t#Q;'S/T;'S;=`/|<%lO/TQ/pSOY/TZ;'S/T;'S;=`/|<%lO/TQ0PP;=`<%l/TQ0VSOY-tZ;'S-t;'S;=`0c<%lO-tQ0fP;=`<%l-tU0nWoSOt#uuw#ux!P#u!P!Q1W!Q#O#u#P;'S#u;'S;=`$^<%lO#uU1_boStQOt#uuw#ux#O#u#P#Z#u#Z#[1W#[#]#u#]#^1W#^#a#u#a#b1W#b#g#u#g#h1W#h#i#u#i#j1W#j#m#u#m#n1W#n;'S#u;'S;=`$^<%lO#uU2l[oSOY2gYZ#uZt2gtu/Tuw2gwx/Tx#O2g#O#P/m#P#Q,q#Q;'S2g;'S;=`3b<%lO2gU3eP;=`<%l2gU3kP;=`<%l,qU3uUoSlQOt#uuw#ux#O#u#P;'S#u;'S;=`$^<%lO#u~4^O!p~U4eUoSwQOt#uuw#ux#O#u#P;'S#u;'S;=`$^<%lO#uU4|YoSOt#uuw#ux!_#u!_!`5l!`#O#u#P#T#u#T#o4w#o;'S#u;'S;=`$^<%lO#uU5sUyQoSOt#uuw#ux#O#u#P;'S#u;'S;=`$^<%lO#uU6[ZoSOt#uuw#ux!_#u!_!`5l!`#O#u#P#T#u#T#U6}#U#o4w#o;'S#u;'S;=`$^<%lO#uU7S[oSOt#uuw#ux!_#u!_!`5l!`#O#u#P#T#u#T#`4w#`#a7x#a#o4w#o;'S#u;'S;=`$^<%lO#uU7}[oSOt#uuw#ux!_#u!_!`5l!`#O#u#P#T#u#T#g4w#g#h8s#h#o4w#o;'S#u;'S;=`$^<%lO#uU8x[oSOt#uuw#ux!_#u!_!`5l!`#O#u#P#T#u#T#X4w#X#Y9n#Y#o4w#o;'S#u;'S;=`$^<%lO#uU9uYsQoSOt#uuw#ux!_#u!_!`5l!`#O#u#P#T#u#T#o4w#o;'S#u;'S;=`$^<%lO#u^:lY!qWoSOt#uuw#ux!_#u!_!`5l!`#O#u#P#T#u#T#o4w#o;'S#u;'S;=`$^<%lO#u^;cY!sWoSOt#uuw#ux!_#u!_!`5l!`#O#u#P#T#u#T#o4w#o;'S#u;'S;=`$^<%lO#u^<Y[!rWoSOt#uuw#ux!_#u!_!`5l!`#O#u#P#T#u#T#f4w#f#g=O#g#o4w#o;'S#u;'S;=`$^<%lO#uU=T[oSOt#uuw#ux!_#u!_!`5l!`#O#u#P#T#u#T#i4w#i#j8s#j#o4w#o;'S#u;'S;=`$^<%lO#uU>QUzQoSOt#uuw#ux#O#u#P;'S#u;'S;=`$^<%lO#u~>iO!w~",
tokenizers: [operatorTokenizer, 1, 2, 3, tokenizer, new LocalTokenGroup("[~RP!O!PU~ZO!t~~", 11)],
topRules: {"Program":[0,17]},
specialized: [{term: 13, get: (value: keyof typeof spec_Identifier) => spec_Identifier[value] || -1}],
tokenPrec: 753
tokenPrec: 761
})

View File

@ -348,3 +348,27 @@ describe('DotGet whitespace sensitivity', () => {
expect('readme.txt').toMatchTree(`Word readme.txt`)
})
})
describe('Comments', () => {
test('are barely there', () => {
expect(`x = 5 # one banana\ny = 2 # two bananas`).toMatchTree(`
Assign
AssignableIdentifier x
Eq =
Number 5
Assign
AssignableIdentifier y
Eq =
Number 2`)
expect('# some comment\nbasename = 5 # very astute\n basename / prop\n# good info').toMatchTree(`
Assign
AssignableIdentifier basename
Eq =
Number 5
BinOp
Identifier basename
Slash /
Identifier prop`)
})
})

View File

@ -4,7 +4,7 @@ import '../shrimp.grammar' // Importing this so changes cause it to retest!
describe('if/elseif/else', () => {
test('parses single line if', () => {
expect(`if y = 1: 'cool'`).toMatchTree(`
expect(`if y = 1: 'cool' end`).toMatchTree(`
IfExpr
keyword if
ConditionalOp
@ -12,12 +12,13 @@ describe('if/elseif/else', () => {
Eq =
Number 1
colon :
ThenBlock
SingleLineThenBlock
String
StringFragment cool
keyword end
`)
expect('a = if x: 2').toMatchTree(`
expect('a = if x: 2 end').toMatchTree(`
Assign
AssignableIdentifier a
Eq =
@ -25,8 +26,9 @@ describe('if/elseif/else', () => {
keyword if
Identifier x
colon :
ThenBlock
SingleLineThenBlock
Number 2
keyword end
`)
})
@ -138,7 +140,7 @@ describe('if/elseif/else', () => {
})
test('does not parse identifiers that start with if', () => {
expect('iffy = if true: 2').toMatchTree(`
expect('iffy = if true: 2 end').toMatchTree(`
Assign
AssignableIdentifier iffy
Eq =
@ -146,8 +148,9 @@ describe('if/elseif/else', () => {
keyword if
Boolean true
colon :
ThenBlock
SingleLineThenBlock
Number 2
keyword end
`)
})
})