switch back to using ==

This commit is contained in:
Chris Wanstrath 2025-10-29 11:18:47 -07:00
parent fd197a2dfc
commit 34305b473e
8 changed files with 70 additions and 68 deletions

View File

@ -366,7 +366,7 @@ export class Compiler {
const opValue = input.slice(op.from, op.to)
switch (opValue) {
case '=':
case '==':
instructions.push(...leftInstructions, ...rightInstructions, ['EQ'])
break

View File

@ -111,7 +111,7 @@ describe('compiler', () => {
expect(`(10 > 20)`).toEvaluateTo(false)
expect(`(4 <= 9)`).toEvaluateTo(true)
expect(`(15 >= 20)`).toEvaluateTo(false)
expect(`(7 = 7)`).toEvaluateTo(true)
expect(`(7 == 7)`).toEvaluateTo(true)
expect(`(5 != 5)`).toEvaluateTo(false)
expect(`('shave' and 'haircut')`).toEvaluateTo('haircut')
expect(`(false and witness)`).toEvaluateTo(false)

View File

@ -8,6 +8,7 @@ const operators: Array<Operator> = [
{ str: '>=', tokenName: 'Gte' },
{ str: '<=', tokenName: 'Lte' },
{ str: '!=', tokenName: 'Neq' },
{ str: '==', tokenName: 'EqEq' },
// // Single-char operators
{ str: '*', tokenName: 'Star' },

View File

@ -6,7 +6,7 @@
@top Program { item* }
@external tokens operatorTokenizer from "./operatorTokenizer" { Star, Slash, Plus, Minus, And, Or, Eq, Neq, Lt, Lte, Gt, Gte, Modulo }
@external tokens operatorTokenizer from "./operatorTokenizer" { Star, Slash, Plus, Minus, And, Or, Eq, EqEq, Neq, Lt, Lte, Gt, Gte, Modulo }
@tokens {
@precedence { Number Regex }
@ -132,7 +132,7 @@ SingleLineThenBlock {
}
ConditionalOp {
expression !comparison Eq expression |
expression !comparison EqEq expression |
expression !comparison Neq expression |
expression !comparison Lt expression |
expression !comparison Lte expression |

View File

@ -7,46 +7,47 @@ export const
And = 5,
Or = 6,
Eq = 7,
Neq = 8,
Lt = 9,
Lte = 10,
Gt = 11,
Gte = 12,
Modulo = 13,
Identifier = 14,
AssignableIdentifier = 15,
Word = 16,
IdentifierBeforeDot = 17,
Do = 18,
Program = 19,
PipeExpr = 20,
FunctionCall = 21,
DotGet = 22,
Number = 23,
ParenExpr = 24,
FunctionCallOrIdentifier = 25,
BinOp = 26,
String = 27,
StringFragment = 28,
Interpolation = 29,
EscapeSeq = 30,
Boolean = 31,
Regex = 32,
Dict = 33,
NamedArg = 34,
NamedArgPrefix = 35,
FunctionDef = 36,
Params = 37,
colon = 38,
keyword = 53,
Underscore = 40,
Array = 41,
Null = 42,
ConditionalOp = 43,
PositionalArg = 44,
IfExpr = 46,
SingleLineThenBlock = 48,
ThenBlock = 49,
ElseIfExpr = 50,
ElseExpr = 52,
Assign = 54
EqEq = 8,
Neq = 9,
Lt = 10,
Lte = 11,
Gt = 12,
Gte = 13,
Modulo = 14,
Identifier = 15,
AssignableIdentifier = 16,
Word = 17,
IdentifierBeforeDot = 18,
Do = 19,
Program = 20,
PipeExpr = 21,
FunctionCall = 22,
DotGet = 23,
Number = 24,
ParenExpr = 25,
FunctionCallOrIdentifier = 26,
BinOp = 27,
String = 28,
StringFragment = 29,
Interpolation = 30,
EscapeSeq = 31,
Boolean = 32,
Regex = 33,
Dict = 34,
NamedArg = 35,
NamedArgPrefix = 36,
FunctionDef = 37,
Params = 38,
colon = 39,
keyword = 54,
Underscore = 41,
Array = 42,
Null = 43,
ConditionalOp = 44,
PositionalArg = 45,
IfExpr = 47,
SingleLineThenBlock = 49,
ThenBlock = 50,
ElseIfExpr = 51,
ElseExpr = 53,
Assign = 55

View File

@ -4,24 +4,24 @@ import {operatorTokenizer} from "./operatorTokenizer"
import {tokenizer, specializeKeyword} from "./tokenizer"
import {trackScope} from "./scopeTracker"
import {highlighting} from "./highlight"
const spec_Identifier = {__proto__:null,end:78, null:84, if:94, elseif:102, else:106}
const spec_Identifier = {__proto__:null,end:80, null:86, if:96, elseif:104, else:108}
export const parser = LRParser.deserialize({
version: 14,
states: "3UQYQbOOO!ZOpO'#CrO#mQcO'#CuO$jOSO'#CwO$xQbO'#EUOOQ`'#DQ'#DQOOQa'#C}'#C}O%{QbO'#DVO'QQcO'#DyOOQa'#Dy'#DyO(lQcO'#DxO(yQRO'#CvO)[QcO'#DtO)sQbO'#CtOOQ`'#Du'#DuO*kQbO'#DtO*yQbO'#E[OOQ`'#D['#D[O+nQRO'#DdOOQ`'#Dt'#DtO+sQQO'#DsOOQ`'#Ds'#DsOOQ`'#De'#DeQYQbOOO+{ObO,59^O,TQbO'#DOOOQa'#Dx'#DxOOQ`'#DY'#DYOOQ`'#EZ'#EZOOQ`'#Dl'#DlO,_QbO,59]O,rQbO'#CyO,zQWO'#CzOOOO'#D{'#D{OOOO'#Df'#DfO-`OSO,59cOOQa,59c,59cOOQ`'#Dh'#DhO-nQbO'#DRO-vQQO,5:pOOQ`'#Dg'#DgO-{QbO,59qO.SQQO,59iOOQa,59q,59qO._QbO,59qO*yQbO,59bO*yQbO,59bO*yQbO,59bO.iQRO,59`O/YQRO'#CvO/vQRO,59`O0XQRO,59`O0SQQO,59`O0dQQO,59`O0lQbO'#DmO0wQbO,59[O1tQRO,5:vO1{QRO,5:vO2WQbO,5:OOOQ`,5:_,5:_OOQ`-E7c-E7cOOQa1G.x1G.xOOQ`,59j,59jOOQ`-E7j-E7jOOOO,59e,59eOOOO,59f,59fOOOO-E7d-E7dOOQa1G.}1G.}OOQ`-E7f-E7fO2bQbO1G0[OOQ`-E7e-E7eO2oQQO1G/TOOQa1G/]1G/]O2zQbO1G/]OOQO'#Dj'#DjO2oQQO1G/TOOQa1G/T1G/TOOQ`'#Dk'#DkO2zQbO1G/]OOQa1G.|1G.|O3mQcO1G.|O3wQcO1G.|O4RQcO1G.|OOQa1G.z1G.zO*yQbO,59sO*yQbO,59sO*yQbO,59sO!`QbO'#CuO&SQbO'#CqOOQ`,5:X,5:XOOQ`-E7k-E7kO4mQbO1G0bOOQ`1G/j1G/jO4zQbO7+%vO5PQbO7+%wO5aQQO7+$oOOQa7+$o7+$oO5lQbO7+$wOOQa7+$w7+$wOOQO-E7h-E7hOOQ`-E7i-E7iOOQP1G/_1G/_O6eQRO1G/_O6lQRO1G/_O6zQRO1G/_OOQ`'#D^'#D^O7RQbO7+%|O7WQbO7+%}OOQ`<<Ib<<IbOOQ`'#Di'#DiO7nQQO'#DiO7sQbO'#EWO8ZQbO<<IcOOQa<<HZ<<HZOOQa<<Hc<<HcOOQ`<<Ih<<IhOOQ`'#D_'#D_O8`QbO<<IiOOQ`,5:T,5:TOOQ`-E7g-E7gOOQ`AN>}AN>}O*yQbO'#D`OOQ`'#Dn'#DnO8kQbOAN?TO8vQQO'#DbOOQ`AN?TAN?TO8{QbOAN?TO9QQRO,59zO9XQRO,59zOOQ`-E7l-E7lOOQ`G24oG24oO9dQbOG24oO9iQQO,59|O9nQQO1G/fOOQ`LD*ZLD*ZO5PQbO1G/hO7WQbO7+%QOOQ`7+%S7+%SOOQ`<<Hl<<Hl",
stateData: "9v~O!eOS!fOS~O^QO_bO`XOaPObSOgXOoXOpXOzXO!P`O!k]O!nRO!uUO!vVO!weO~O!jhO~O^jO`XOaPObSOgXOoXOpXOsiOxkOzXO!k]O!nRO!uUO!vVO}iX!wiX#QiX!|iXwiX~OP!lXQ!lXR!lXS!lX]!lXT!lXU!lXV!lXW!lXX!lXY!lXZ!lX[!lX~P!`OlqO!ntO!poO!qpO~O^uOvuP~O^jO`XOaPOgXOoXOpXOsiOzXO!k]O!nRO!uUO!vVO!wxO~O!{{O~P%QO^jO`XOaPObSOgXOoXOpXOsiOxkOzXO!k]O!nRO!uUO!vVO~OP!mXQ!mXR!mXS!mX]!mX!w!mX#Q!mXT!mXU!mXV!mXW!mXX!mXY!mXZ!mX[!mX!|!mXw!mX~P&SOP!lXQ!lXR!lXS!lX]!lX~O!w!hX#Q!hXw!hX~P(ZOP!OOQ!OOR!POS!PO]}O~OP!OOQ!OOR!POS!PO!w!hX#Q!hXw!hX~O^QO`XOaPObSOgXOoXOpXOzXO!k]O!nRO!uUO!vVO~O}!WO!w!hX#Q!hXw!hX~O^jO`XOaPOgXOoXOpXOzXO!k]O!nRO!uUO!vVO~OV![O~O!w!]O#Q!]O~O^!_Og!_O~ObSOx!`O~P*yO}ea!wea#Qea!|eawea~P&SO^!bO!k]O~O!n!cO!p!cO!q!cO!r!cO!s!cO!t!cO~OlqO!n!eO!poO!qpO~O^uOvuX~Ov!gO~O!{!jO~P%QOsiO!w!lO!{!nO~O!w!oO!{!jO~P*yO!|!uOT!lXU!lXV!lXW!lXX!lXY!lXZ!lX[!lX~P(ZOT!wOU!xOV!vOW!vOX!vOY!vOZ!vO[!vO~P(yOP!OOQ!OOR!POS!PO!|!uO~OT!wOU!xO!|!uO~O}!WO!|!uO~O^!yOaPO!k]O~O}!WO!wda#Qda!|dawda~OT!wOU!xOV!vOW!vOX!vOY!vOZ!vO[!vO~Ov!}O~P1YOT!wOU!xOv!}O~O_bO!P`O~P)sO_bO!P`O!w#QO~P)sOsiO!w!lO!{#SO~O!w!oO!{#UO~P*yO]}ORjiSji!wji#Qji!|jiwji~OPjiQji~P3UOP!OOQ!OO~P3UOP!OOQ!OORjiSji!wji#Qji!|jiwji~O_bO!P`O!w#_O~P)sOw#`O~O_bO!P`O!w#aOw!zP~P)sOsiO!w!lO!{#eO~O!w!oO!{#fO~P*yOV!vOW!vOX!vOY!vOZ!vO[!vOT{i!|{iv{i~OU!xO~P5vOU!xOT{i!|{iv{i~OU{i~P5vOw#gO~O_bO!P`O!w#aOw!zP!T!zP!V!zP~P)sO!w#jO~O_bO!P`O!w#aOw!zX!T!zX!V!zX~P)sOw#lO~Ow#qO!T#mO!V#pO~Ow#vO!T#mO!V#pO~Ov#xO~Ow#vO~Ov#yO~P1YOT!wOU!xOv#yO~Ow#zO~O!w#{O~O!w#|O~Ogp~",
goto: ".o#QPPPPPPPPPPPPPPPPPPPP#R#b#pP$h#b%c%xP&k&kPP%x&oP'S'mPPP%xP'p(PP(WP(d(g(pP(tP(W(z)Q)W)^)d)m)w*R*[*cPPPP*i*m+RPP+e,tP-kPPPPPPPP-o-o.SPP.[.c.cdcOg![!g!}#Q#_#c#{#|R!U]i^O]g!W![!g!}#Q#_#c#{#|fQO]g![!g!}#Q#_#c#{#|xjQVW`iny|}!O!P!k!p!v!w!x!y!z#T#mR!y!WfWO]g![!g!}#Q#_#c#{#|xXQVW`iny|}!O!P!k!p!v!w!x!y!z#T#mQ!boR!z!Wd[Og![!g!}#Q#_#c#{#|Q!S]Q!q!OR!t!P!aXOQVW]`giny|}!O!P![!g!k!p!v!w!x!y!z!}#Q#T#_#c#m#{#|TqRsYlQWn!y!zQzVQ!iyX!lz!i!m#RdcOg![!g!}#Q#_#c#{#|YkQWn!y!zQ!U]R!`iRwSQ!T]Q!Z`Q#X!xQ#Z!wR#t#mZlQWn!y!zecOg![!g!}#Q#_#c#{#|R#^!}Q#i#_Q#}#{R$O#|T#n#i#oQ#r#iR#w#oQgOR!^gQsRR!dsQyVR!hyQvSR!fvW#c#Q#_#{#|R#k#cQ!mzQ#R!iT#V!m#RQ!p|Q#T!kT#W!p#TWnQW!y!zR!anS!X_!VR!|!XQ#o#iR#u#oTfOgSdOgQ#O![Q#P!gQ#]!}Z#b#Q#_#c#{#|d_Og![!g!}#Q#_#c#{#|Q!V]R!{!WdZOg![!g!}#Q#_#c#{#|YkQWn!y!zQ|VQ!R]Q!Y`Q!`iQ!kyW!o|!k!p#TQ!q}Q!r!OQ!s!PQ#X!vQ#Y!wQ#[!xR#s#mdYOg![!g!}#Q#_#c#{#|xjQVW`iny|}!O!P!k!p!v!w!x!y!z#T#mR!Q]TrRssTOQW]gin![!g!y!z!}#Q#_#c#{#|Q#d#QV#h#_#{#|ZmQWn!y!zeaOg![!g!}#Q#_#c#{#|",
nodeNames: "⚠ Star Slash Plus Minus And Or Eq Neq Lt Lte Gt Gte Modulo Identifier AssignableIdentifier Word IdentifierBeforeDot Do Program PipeExpr FunctionCall DotGet Number ParenExpr FunctionCallOrIdentifier BinOp String StringFragment Interpolation EscapeSeq Boolean Regex Dict NamedArg NamedArgPrefix FunctionDef Params colon keyword Underscore Array Null ConditionalOp PositionalArg operator IfExpr keyword SingleLineThenBlock ThenBlock ElseIfExpr keyword ElseExpr keyword Assign",
maxTerm: 94,
states: "3UQYQbOOO!ZOpO'#CsO#mQcO'#CvO$jOSO'#CxO$xQbO'#EVOOQ`'#DR'#DROOQa'#DO'#DOO%{QbO'#DWO'QQcO'#DzOOQa'#Dz'#DzO(lQcO'#DyO(yQRO'#CwO)[QcO'#DuO)sQbO'#CuOOQ`'#Dv'#DvO*kQbO'#DuO*yQbO'#E]OOQ`'#D]'#D]O+nQRO'#DeOOQ`'#Du'#DuO+sQQO'#DtOOQ`'#Dt'#DtOOQ`'#Df'#DfQYQbOOO+{ObO,59_O,TQbO'#DPOOQa'#Dy'#DyOOQ`'#DZ'#DZOOQ`'#E['#E[OOQ`'#Dm'#DmO,_QbO,59^O,rQbO'#CzO,zQWO'#C{OOOO'#D|'#D|OOOO'#Dg'#DgO-`OSO,59dOOQa,59d,59dOOQ`'#Di'#DiO-nQbO'#DSO-vQQO,5:qOOQ`'#Dh'#DhO-{QbO,59rO.SQQO,59jOOQa,59r,59rO._QbO,59rO*yQbO,59cO*yQbO,59cO*yQbO,59cO.iQRO,59aO/YQRO'#CwO/vQRO,59aO0XQRO,59aO0SQQO,59aO0dQQO,59aO0lQbO'#DnO0wQbO,59]O1tQRO,5:wO1{QRO,5:wO2WQbO,5:POOQ`,5:`,5:`OOQ`-E7d-E7dOOQa1G.y1G.yOOQ`,59k,59kOOQ`-E7k-E7kOOOO,59f,59fOOOO,59g,59gOOOO-E7e-E7eOOQa1G/O1G/OOOQ`-E7g-E7gO2bQbO1G0]OOQ`-E7f-E7fO2oQQO1G/UOOQa1G/^1G/^O2zQbO1G/^OOQO'#Dk'#DkO2oQQO1G/UOOQa1G/U1G/UOOQ`'#Dl'#DlO2zQbO1G/^OOQa1G.}1G.}O3mQcO1G.}O3wQcO1G.}O4RQcO1G.}OOQa1G.{1G.{O*yQbO,59tO*yQbO,59tO*yQbO,59tO!`QbO'#CvO&SQbO'#CrOOQ`,5:Y,5:YOOQ`-E7l-E7lO4mQbO1G0cOOQ`1G/k1G/kO4zQbO7+%wO5PQbO7+%xO5aQQO7+$pOOQa7+$p7+$pO5lQbO7+$xOOQa7+$x7+$xOOQO-E7i-E7iOOQ`-E7j-E7jOOQP1G/`1G/`O6eQRO1G/`O6lQRO1G/`O6zQRO1G/`OOQ`'#D_'#D_O7RQbO7+%}O7WQbO7+&OOOQ`<<Ic<<IcOOQ`'#Dj'#DjO7nQQO'#DjO7sQbO'#EXO8ZQbO<<IdOOQa<<H[<<H[OOQa<<Hd<<HdOOQ`<<Ii<<IiOOQ`'#D`'#D`O8`QbO<<IjOOQ`,5:U,5:UOOQ`-E7h-E7hOOQ`AN?OAN?OO*yQbO'#DaOOQ`'#Do'#DoO8kQbOAN?UO8vQQO'#DcOOQ`AN?UAN?UO8{QbOAN?UO9QQRO,59{O9XQRO,59{OOQ`-E7m-E7mOOQ`G24pG24pO9dQbOG24pO9iQQO,59}O9nQQO1G/gOOQ`LD*[LD*[O5PQbO1G/iO7WQbO7+%ROOQ`7+%T7+%TOOQ`<<Hm<<Hm",
stateData: "9v~O!fOS!gOS~O_QO`bOaXObPOcSOhXOpXOqXO{XO!Q`O!l]O!oRO!vUO!wVO!xeO~O!khO~O_jOaXObPOcSOhXOpXOqXOtiOykO{XO!l]O!oRO!vUO!wVO!OjX!xjX#RjX!}jXxjX~OP!mXQ!mXR!mXS!mX^!mXT!mXU!mXW!mXX!mXY!mXZ!mX[!mX]!mX~P!`OmqO!otO!qoO!rpO~O_uOwvP~O_jOaXObPOhXOpXOqXOtiO{XO!l]O!oRO!vUO!wVO!xxO~O!|{O~P%QO_jOaXObPOcSOhXOpXOqXOtiOykO{XO!l]O!oRO!vUO!wVO~OP!nXQ!nXR!nXS!nX^!nX!x!nX#R!nXT!nXU!nXW!nXX!nXY!nXZ!nX[!nX]!nX!}!nXx!nX~P&SOP!mXQ!mXR!mXS!mX^!mX~O!x!iX#R!iXx!iX~P(ZOP!OOQ!OOR!POS!PO^}O~OP!OOQ!OOR!POS!PO!x!iX#R!iXx!iX~O_QOaXObPOcSOhXOpXOqXO{XO!l]O!oRO!vUO!wVO~O!O!WO!x!iX#R!iXx!iX~O_jOaXObPOhXOpXOqXO{XO!l]O!oRO!vUO!wVO~OV![O~O!x!]O#R!]O~O_!_Oh!_O~OcSOy!`O~P*yO!Ofa!xfa#Rfa!}faxfa~P&SO_!bO!l]O~O!o!cO!q!cO!r!cO!s!cO!t!cO!u!cO~OmqO!o!eO!qoO!rpO~O_uOwvX~Ow!gO~O!|!jO~P%QOtiO!x!lO!|!nO~O!x!oO!|!jO~P*yO!}!uOT!mXU!mXW!mXX!mXY!mXZ!mX[!mX]!mX~P(ZOT!wOU!xOW!vOX!vOY!vOZ!vO[!vO]!vO~P(yOP!OOQ!OOR!POS!PO!}!uO~OT!wOU!xO!}!uO~O!O!WO!}!uO~O_!yObPO!l]O~O!O!WO!xea#Rea!}eaxea~OT!wOU!xOW!vOX!vOY!vOZ!vO[!vO]!vO~Ow!}O~P1YOT!wOU!xOw!}O~O`bO!Q`O~P)sO`bO!Q`O!x#QO~P)sOtiO!x!lO!|#SO~O!x!oO!|#UO~P*yO^}ORkiSki!xki#Rki!}kixki~OPkiQki~P3UOP!OOQ!OO~P3UOP!OOQ!OORkiSki!xki#Rki!}kixki~O`bO!Q`O!x#_O~P)sOx#`O~O`bO!Q`O!x#aOx!{P~P)sOtiO!x!lO!|#eO~O!x!oO!|#fO~P*yOW!vOX!vOY!vOZ!vO[!vO]!vOT|i!}|iw|i~OU!xO~P5vOU!xOT|i!}|iw|i~OU|i~P5vOx#gO~O`bO!Q`O!x#aOx!{P!U!{P!W!{P~P)sO!x#jO~O`bO!Q`O!x#aOx!{X!U!{X!W!{X~P)sOx#lO~Ox#qO!U#mO!W#pO~Ox#vO!U#mO!W#pO~Ow#xO~Ox#vO~Ow#yO~P1YOT!wOU!xOw#yO~Ox#zO~O!x#{O~O!x#|O~Ohq~",
goto: ".p#RPPPPPPPPPPPPPPPPPPPPP#S#c#qP$i#c%d%yP&l&lPP%y&pP'T'nPPP%yP'q(QP(XP(e(h(qP(uP(X({)R)X)_)e)n)x*S*]*dPPPP*j*n+SPP+f,uP-lPPPPPPPP-p-p.TPP.].d.ddcOg![!g!}#Q#_#c#{#|R!U]i^O]g!W![!g!}#Q#_#c#{#|fQO]g![!g!}#Q#_#c#{#|xjQVW`iny|}!O!P!k!p!v!w!x!y!z#T#mR!y!WfWO]g![!g!}#Q#_#c#{#|xXQVW`iny|}!O!P!k!p!v!w!x!y!z#T#mQ!boR!z!Wd[Og![!g!}#Q#_#c#{#|Q!S]Q!q!OR!t!P!aXOQVW]`giny|}!O!P![!g!k!p!v!w!x!y!z!}#Q#T#_#c#m#{#|TqRsYlQWn!y!zQzVQ!iyX!lz!i!m#RdcOg![!g!}#Q#_#c#{#|YkQWn!y!zQ!U]R!`iRwSQ!T]Q!Z`Q#X!xQ#Z!wR#t#mZlQWn!y!zecOg![!g!}#Q#_#c#{#|R#^!}Q#i#_Q#}#{R$O#|T#n#i#oQ#r#iR#w#oQgOR!^gQsRR!dsQyVR!hyQvSR!fvW#c#Q#_#{#|R#k#cQ!mzQ#R!iT#V!m#RQ!p|Q#T!kT#W!p#TWnQW!y!zR!anS!X_!VR!|!XQ#o#iR#u#oTfOgSdOgQ#O![Q#P!gQ#]!}Z#b#Q#_#c#{#|d_Og![!g!}#Q#_#c#{#|Q!V]R!{!WdZOg![!g!}#Q#_#c#{#|YkQWn!y!zQ|VQ!R]Q!Y`Q!`iQ!kyW!o|!k!p#TQ!q}Q!r!OQ!s!PQ#X!vQ#Y!wQ#[!xR#s#mdYOg![!g!}#Q#_#c#{#|xjQVW`iny|}!O!P!k!p!v!w!x!y!z#T#mR!Q]TrRssTOQW]gin![!g!y!z!}#Q#_#c#{#|Q#d#QV#h#_#{#|ZmQWn!y!zeaOg![!g!}#Q#_#c#{#|",
nodeNames: "⚠ Star Slash Plus Minus And Or Eq EqEq Neq Lt Lte Gt Gte Modulo Identifier AssignableIdentifier Word IdentifierBeforeDot Do Program PipeExpr FunctionCall DotGet Number ParenExpr FunctionCallOrIdentifier BinOp String StringFragment Interpolation EscapeSeq Boolean Regex Dict NamedArg NamedArgPrefix FunctionDef Params colon keyword Underscore Array Null ConditionalOp PositionalArg operator IfExpr keyword SingleLineThenBlock ThenBlock ElseIfExpr keyword ElseExpr keyword Assign",
maxTerm: 95,
context: trackScope,
nodeProps: [
["closedBy", 38,"end"]
["closedBy", 39,"end"]
],
propSources: [highlighting],
skippedNodes: [0],
repeatNodeCount: 10,
tokenData: "AO~R|OX#{XY$jYZ%TZp#{pq$jqs#{st%ntu'Vuw#{wx'[xy'ayz'zz{#{{|(e|}#{}!O(e!O!P#{!P!Q+X!Q![)S![!]3t!]!^%T!^!}#{!}#O4_#O#P6T#P#Q6Y#Q#R#{#R#S6s#S#T#{#T#Y7^#Y#Z8l#Z#b7^#b#c<z#c#f7^#f#g=q#g#h7^#h#i>h#i#o7^#o#p#{#p#q@`#q;'S#{;'S;=`$d<%l~#{~O#{~~@yS$QUlSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{S$gP;=`<%l#{^$qUlS!eYOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U%[UlS!wQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{^%uZlS!fYOY%nYZ#{Zt%ntu&huw%nwx&hx#O%n#O#P&h#P;'S%n;'S;=`'P<%lO%nY&mS!fYOY&hZ;'S&h;'S;=`&y<%lO&hY&|P;=`<%l&h^'SP;=`<%l%n~'[O!p~~'aO!n~U'hUlS!kQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(RUlS!|QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(jWlSOt#{uw#{x!Q#{!Q![)S![#O#{#P;'S#{;'S;=`$d<%lO#{U)ZYlSgQOt#{uw#{x!O#{!O!P)y!P!Q#{!Q![)S![#O#{#P;'S#{;'S;=`$d<%lO#{U*OWlSOt#{uw#{x!Q#{!Q![*h![#O#{#P;'S#{;'S;=`$d<%lO#{U*oWlSgQOt#{uw#{x!Q#{!Q![*h![#O#{#P;'S#{;'S;=`$d<%lO#{U+^WlSOt#{uw#{x!P#{!P!Q+v!Q#O#{#P;'S#{;'S;=`$d<%lO#{U+{^lSOY,wYZ#{Zt,wtu-zuw,wwx-zx!P,w!P!Q#{!Q!},w!}#O2m#O#P0Y#P;'S,w;'S;=`3n<%lO,wU-O^lSpQOY,wYZ#{Zt,wtu-zuw,wwx-zx!P,w!P!Q0o!Q!},w!}#O2m#O#P0Y#P;'S,w;'S;=`3n<%lO,wQ.PXpQOY-zZ!P-z!P!Q.l!Q!}-z!}#O/Z#O#P0Y#P;'S-z;'S;=`0i<%lO-zQ.oP!P!Q.rQ.wUpQ#Z#[.r#]#^.r#a#b.r#g#h.r#i#j.r#m#n.rQ/^VOY/ZZ#O/Z#O#P/s#P#Q-z#Q;'S/Z;'S;=`0S<%lO/ZQ/vSOY/ZZ;'S/Z;'S;=`0S<%lO/ZQ0VP;=`<%l/ZQ0]SOY-zZ;'S-z;'S;=`0i<%lO-zQ0lP;=`<%l-zU0tWlSOt#{uw#{x!P#{!P!Q1^!Q#O#{#P;'S#{;'S;=`$d<%lO#{U1eblSpQOt#{uw#{x#O#{#P#Z#{#Z#[1^#[#]#{#]#^1^#^#a#{#a#b1^#b#g#{#g#h1^#h#i#{#i#j1^#j#m#{#m#n1^#n;'S#{;'S;=`$d<%lO#{U2r[lSOY2mYZ#{Zt2mtu/Zuw2mwx/Zx#O2m#O#P/s#P#Q,w#Q;'S2m;'S;=`3h<%lO2mU3kP;=`<%l2mU3qP;=`<%l,wU3{UlSvQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U4fW!vQlSOt#{uw#{x!_#{!_!`5O!`#O#{#P;'S#{;'S;=`$d<%lO#{U5TVlSOt#{uw#{x#O#{#P#Q5j#Q;'S#{;'S;=`$d<%lO#{U5qU!uQlSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~6YO!q~U6aU!{QlSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U6zUlSxQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U7cYlSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#o7^#o;'S#{;'S;=`$d<%lO#{U8YUsQlSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U8qZlSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#U9d#U#o7^#o;'S#{;'S;=`$d<%lO#{U9i[lSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#`7^#`#a:_#a#o7^#o;'S#{;'S;=`$d<%lO#{U:d[lSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#g7^#g#h;Y#h#o7^#o;'S#{;'S;=`$d<%lO#{U;_[lSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#X7^#X#Y<T#Y#o7^#o;'S#{;'S;=`$d<%lO#{U<[YoQlSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#o7^#o;'S#{;'S;=`$d<%lO#{^=RY!rWlSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#o7^#o;'S#{;'S;=`$d<%lO#{^=xY!tWlSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#o7^#o;'S#{;'S;=`$d<%lO#{^>o[!sWlSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#f7^#f#g?e#g#o7^#o;'S#{;'S;=`$d<%lO#{U?j[lSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#i7^#i#j;Y#j#o7^#o;'S#{;'S;=`$d<%lO#{U@gU}QlSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~AOO#Q~",
tokenizers: [operatorTokenizer, 1, 2, 3, tokenizer, new LocalTokenGroup("[~RP!O!PU~ZO!j~~", 11)],
topRules: {"Program":[0,19]},
specialized: [{term: 14, get: (value: any, stack: any) => (specializeKeyword(value, stack) << 1), external: specializeKeyword},{term: 14, get: (value: keyof typeof spec_Identifier) => spec_Identifier[value] || -1}],
tokenData: "AO~R|OX#{XY$jYZ%TZp#{pq$jqs#{st%ntu'Vuw#{wx'[xy'ayz'zz{#{{|(e|}#{}!O(e!O!P#{!P!Q+X!Q![)S![!]3t!]!^%T!^!}#{!}#O4_#O#P6T#P#Q6Y#Q#R#{#R#S6s#S#T#{#T#Y7^#Y#Z8l#Z#b7^#b#c<z#c#f7^#f#g=q#g#h7^#h#i>h#i#o7^#o#p#{#p#q@`#q;'S#{;'S;=`$d<%l~#{~O#{~~@yS$QUmSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{S$gP;=`<%l#{^$qUmS!fYOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U%[UmS!xQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{^%uZmS!gYOY%nYZ#{Zt%ntu&huw%nwx&hx#O%n#O#P&h#P;'S%n;'S;=`'P<%lO%nY&mS!gYOY&hZ;'S&h;'S;=`&y<%lO&hY&|P;=`<%l&h^'SP;=`<%l%n~'[O!q~~'aO!o~U'hUmS!lQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(RUmS!}QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(jWmSOt#{uw#{x!Q#{!Q![)S![#O#{#P;'S#{;'S;=`$d<%lO#{U)ZYmShQOt#{uw#{x!O#{!O!P)y!P!Q#{!Q![)S![#O#{#P;'S#{;'S;=`$d<%lO#{U*OWmSOt#{uw#{x!Q#{!Q![*h![#O#{#P;'S#{;'S;=`$d<%lO#{U*oWmShQOt#{uw#{x!Q#{!Q![*h![#O#{#P;'S#{;'S;=`$d<%lO#{U+^WmSOt#{uw#{x!P#{!P!Q+v!Q#O#{#P;'S#{;'S;=`$d<%lO#{U+{^mSOY,wYZ#{Zt,wtu-zuw,wwx-zx!P,w!P!Q#{!Q!},w!}#O2m#O#P0Y#P;'S,w;'S;=`3n<%lO,wU-O^mSqQOY,wYZ#{Zt,wtu-zuw,wwx-zx!P,w!P!Q0o!Q!},w!}#O2m#O#P0Y#P;'S,w;'S;=`3n<%lO,wQ.PXqQOY-zZ!P-z!P!Q.l!Q!}-z!}#O/Z#O#P0Y#P;'S-z;'S;=`0i<%lO-zQ.oP!P!Q.rQ.wUqQ#Z#[.r#]#^.r#a#b.r#g#h.r#i#j.r#m#n.rQ/^VOY/ZZ#O/Z#O#P/s#P#Q-z#Q;'S/Z;'S;=`0S<%lO/ZQ/vSOY/ZZ;'S/Z;'S;=`0S<%lO/ZQ0VP;=`<%l/ZQ0]SOY-zZ;'S-z;'S;=`0i<%lO-zQ0lP;=`<%l-zU0tWmSOt#{uw#{x!P#{!P!Q1^!Q#O#{#P;'S#{;'S;=`$d<%lO#{U1ebmSqQOt#{uw#{x#O#{#P#Z#{#Z#[1^#[#]#{#]#^1^#^#a#{#a#b1^#b#g#{#g#h1^#h#i#{#i#j1^#j#m#{#m#n1^#n;'S#{;'S;=`$d<%lO#{U2r[mSOY2mYZ#{Zt2mtu/Zuw2mwx/Zx#O2m#O#P/s#P#Q,w#Q;'S2m;'S;=`3h<%lO2mU3kP;=`<%l2mU3qP;=`<%l,wU3{UmSwQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U4fW!wQmSOt#{uw#{x!_#{!_!`5O!`#O#{#P;'S#{;'S;=`$d<%lO#{U5TVmSOt#{uw#{x#O#{#P#Q5j#Q;'S#{;'S;=`$d<%lO#{U5qU!vQmSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~6YO!r~U6aU!|QmSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U6zUmSyQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U7cYmSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#o7^#o;'S#{;'S;=`$d<%lO#{U8YUtQmSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U8qZmSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#U9d#U#o7^#o;'S#{;'S;=`$d<%lO#{U9i[mSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#`7^#`#a:_#a#o7^#o;'S#{;'S;=`$d<%lO#{U:d[mSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#g7^#g#h;Y#h#o7^#o;'S#{;'S;=`$d<%lO#{U;_[mSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#X7^#X#Y<T#Y#o7^#o;'S#{;'S;=`$d<%lO#{U<[YpQmSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#o7^#o;'S#{;'S;=`$d<%lO#{^=RY!sWmSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#o7^#o;'S#{;'S;=`$d<%lO#{^=xY!uWmSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#o7^#o;'S#{;'S;=`$d<%lO#{^>o[!tWmSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#f7^#f#g?e#g#o7^#o;'S#{;'S;=`$d<%lO#{U?j[mSOt#{uw#{x!_#{!_!`8R!`#O#{#P#T#{#T#i7^#i#j;Y#j#o7^#o;'S#{;'S;=`$d<%lO#{U@gU!OQmSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~AOO#R~",
tokenizers: [operatorTokenizer, 1, 2, 3, tokenizer, new LocalTokenGroup("[~RP!O!PU~ZO!k~~", 11)],
topRules: {"Program":[0,20]},
specialized: [{term: 15, get: (value: any, stack: any) => (specializeKeyword(value, stack) << 1), external: specializeKeyword},{term: 15, get: (value: keyof typeof spec_Identifier) => spec_Identifier[value] || -1}],
tokenPrec: 1139
})

View File

@ -598,7 +598,7 @@ describe('Conditional ops', () => {
test('or can be chained', () => {
expect(`
is-positive = do x:
if x = 3 or x = 4 or x = 5:
if x == 3 or x == 4 or x == 5:
true
end
end
@ -617,17 +617,17 @@ Assign
ConditionalOp
ConditionalOp
Identifier x
Eq =
EqEq ==
Number 3
Or or
ConditionalOp
Identifier x
Eq =
EqEq ==
Number 4
Or or
ConditionalOp
Identifier x
Eq =
EqEq ==
Number 5
colon :
ThenBlock
@ -640,7 +640,7 @@ Assign
test('and can be chained', () => {
expect(`
is-positive = do x:
if x = 3 and x = 4 and x = 5:
if x == 3 and x == 4 and x == 5:
true
end
end
@ -659,17 +659,17 @@ Assign
ConditionalOp
ConditionalOp
Identifier x
Eq =
EqEq ==
Number 3
And and
ConditionalOp
Identifier x
Eq =
EqEq ==
Number 4
And and
ConditionalOp
Identifier x
Eq =
EqEq ==
Number 5
colon :
ThenBlock

View File

@ -4,12 +4,12 @@ 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' end`).toMatchTree(`
expect(`if y == 1: 'cool' end`).toMatchTree(`
IfExpr
keyword if
ConditionalOp
Identifier y
Eq =
EqEq ==
Number 1
colon :
SingleLineThenBlock