allow if expr in parens

This commit is contained in:
Chris Wanstrath 2025-11-05 13:18:54 -08:00
parent 6112d7e5a2
commit 5f46346213
4 changed files with 56 additions and 40 deletions

View File

@ -188,7 +188,7 @@ BinOp {
} }
ParenExpr { ParenExpr {
leftParen (ambiguousFunctionCall | BinOp | expressionWithoutIdentifier | ConditionalOp | PipeExpr | FunctionDef) rightParen leftParen (IfExpr | ambiguousFunctionCall | BinOp | expressionWithoutIdentifier | ConditionalOp | PipeExpr | FunctionDef) rightParen
} }
expression { expression {

View File

@ -30,36 +30,36 @@ export const
DotGet = 28, DotGet = 28,
Number = 29, Number = 29,
ParenExpr = 30, ParenExpr = 30,
FunctionCallOrIdentifier = 31, IfExpr = 31,
BinOp = 32, keyword = 69,
String = 33, ConditionalOp = 33,
StringFragment = 34, String = 34,
Interpolation = 35, StringFragment = 35,
EscapeSeq = 36, Interpolation = 36,
Boolean = 37, EscapeSeq = 37,
Regex = 38, Boolean = 38,
Dict = 39, Regex = 39,
NamedArg = 40, Dict = 40,
NamedArgPrefix = 41, NamedArg = 41,
FunctionDef = 42, NamedArgPrefix = 42,
Params = 43, FunctionDef = 43,
NamedParam = 44, Params = 44,
Null = 45, NamedParam = 45,
colon = 46, Null = 46,
CatchExpr = 47, colon = 47,
keyword = 68, CatchExpr = 48,
Block = 49, Block = 50,
FinallyExpr = 50, FinallyExpr = 51,
Underscore = 53, Underscore = 54,
Array = 54, Array = 55,
ConditionalOp = 55, ElseIfExpr = 56,
PositionalArg = 56, ElseExpr = 58,
WhileExpr = 58, FunctionCallOrIdentifier = 59,
FunctionCallWithBlock = 60, BinOp = 60,
TryExpr = 61, PositionalArg = 61,
Throw = 63, WhileExpr = 63,
IfExpr = 65, FunctionCallWithBlock = 65,
ElseIfExpr = 67, TryExpr = 66,
ElseExpr = 69, Throw = 68,
CompoundAssign = 70, CompoundAssign = 70,
Assign = 71 Assign = 71

View File

@ -4,24 +4,24 @@ import {operatorTokenizer} from "./operatorTokenizer"
import {tokenizer, specializeKeyword} from "./tokenizer" import {tokenizer, specializeKeyword} from "./tokenizer"
import {trackScope} from "./scopeTracker" import {trackScope} from "./scopeTracker"
import {highlighting} from "./highlight" 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, else:136} const spec_Identifier = {__proto__:null,if:64, null:92, catch:98, finally:104, end:106, else:114, while:128, try:134, throw:138}
export const parser = LRParser.deserialize({ export const parser = LRParser.deserialize({
version: 14, version: 14,
states: "9[QYQbOOO#zQcO'#C{O$zOSO'#C}OOQa'#DT'#DTO&TQbO'#DdO'iQcO'#E]OOQa'#E]'#E]O(oQcO'#E]O)qQcO'#E[O*XQRO'#C|O+hQcO'#EWO+xQcO'#EWO,SQbO'#CzO,zOpO'#CxOOQ`'#EX'#EXO-PQbO'#EWO-ZQRO'#DtOOQ`'#EW'#EWO-oQQO'#EVOOQ`'#EV'#EVOOQ`'#Dv'#DvQYQbOOO-wQbO'#DWO.SQbO'#DhO.wQQO'#DkO.SQbO'#DmO.|QbO'#DoO/qQbO'#DUOOQa'#E['#E[OOQ`'#Df'#DfOOQ`'#Ek'#EkOOQ`'#EO'#EOO/{QbO,59cO0uQbO'#DPO0}QWO'#DQOOOO'#E_'#E_OOOO'#Dw'#DwO1cOSO,59iOOQa,59i,59iOOQ`'#Dx'#DxO1qQbO,5:OO1xQQO,59oOOQa,5:O,5:OO2TQbO,5:OO2_QbO,5:aO.SQbO,59hO.SQbO,59hO.SQbO,59hO.SQbO,5:PO.SQbO,5:PO.SQbO,5:PO2rQRO,59fO2yQRO,59fO3[QRO,59fO3VQQO,59fO3gQQO,59fO3oObO,59dO3zQbO'#EPO4VQbO,59bO4qQbO,5:UO2_QbO,5:`OOQ`,5:q,5:qOOQ`-E7t-E7tOOQ`'#Dy'#DyO5XQbO'#DXO5dQbO'#DYOOQO'#Dz'#DzO5[QQO'#DXO5rQQO,59rO6cQRO,5:SO6jQRO,5:SO4qQbO,5:VO6uQcO,5:XO7qQcO,5:XO8RQcO,5:XO8]QcO'#E[O8dQRO'#ElO8kQRO'#ElOOQO'#El'#ElO8vQQO,5:ZOOQ`,59p,59pOOQ`-E7|-E7|OOOO,59k,59kOOOO,59l,59lOOOO-E7u-E7uOOQa1G/T1G/TOOQ`-E7v-E7vO8{QQO1G/ZOOQa1G/j1G/jO9WQbO1G/jOOQO'#D|'#D|O8{QQO1G/ZOOQa1G/Z1G/ZOOQ`'#D}'#D}O9WQbO1G/jOOQ`1G/{1G/{OOQa1G/S1G/SO:SQcO1G/SO:^QcO1G/SO:hQcO1G/SOOQa1G/k1G/kO<^QcO1G/kO<eQcO1G/kO<lQcO1G/kOOQa1G/Q1G/QOOQa1G/O1G/OO<sQbO'#C{O=jQbO'#CwOOQ`,5:k,5:kOOQ`-E7}-E7}OOQ`'#D_'#D_O=wQbO'#D_O>kQbO1G/pOOQ`1G/z1G/zOOQ`-E7w-E7wO>vQQO,59sOOQO,59t,59tOOQO-E7x-E7xO?OQbO1G/^O4qQbO1G/nO?fQbO1G/qO4qQbO1G/uO?qQQO7+$uOOQa7+$u7+$uO?|QbO7+%UOOQa7+%U7+%UOOQO-E7z-E7zOOQ`-E7{-E7{OOQ`'#D{'#D{O@WQQO'#D{O@]QbO'#EhOOQ`,59y,59yOAPQbO'#D]OAUQQO'#D`OOQ`7+%[7+%[OAZQbO7+%[OA`QbO7+%[OAhQbO7+$xOAsQbO7+$xOBdQbO7+%YOOQ`7+%]7+%]OBiQbO7+%]OBnQbO7+%]OBvQbO7+%aOOQa<<Ha<<HaOOQa<<Hp<<HpOOQ`,5:g,5:gOOQ`-E7y-E7yOCOQQO,59wO4qQbO,59zOOQ`<<Hv<<HvOCTQbO<<HvOOQ`<<Hd<<HdOCYQbO<<HdOC_QbO<<HdOCgQbO<<HdOOQ`<<Ht<<HtOOQ`<<Hw<<HwOCrQbO<<HwOOQ`'#EQ'#EQOCwQbO<<H{ODPQbO'#DsOOQ`<<H{<<H{ODXQbO<<H{O4qQbO1G/cOOQ`1G/f1G/fOOQ`AN>bAN>bOOQ`AN>OAN>OOD^QbOAN>OODcQbOAN>OOOQ`AN>cAN>cOOQ`-E8O-E8OOOQ`AN>gAN>gODkQbOAN>gO.|QbO,5:]O4qQbO,5:_OOQ`7+$}7+$}OOQ`G23jG23jODpQbOG23jPDSQbO'#DqOOQ`G24RG24RODuQQO1G/wOOQ`1G/y1G/yOOQ`LD)ULD)UO4qQbO7+%cOOQ`<<H}<<H}", states: "9[QYQbOOO!dOSO'#DOOOQa'#DU'#DUO#mQbO'#DeO%RQcO'#E^OOQa'#E^'#E^O&XQcO'#E^O'ZQcO'#E]O'qQcO'#E]O)^QRO'#C}O*mQcO'#EWO*wQcO'#EWO+XQbO'#CzO,SOpO'#CxOOQ`'#EX'#EXO,XQbO'#EWO,cQRO'#DtOOQ`'#EW'#EWO,wQQO'#EVOOQ`'#EV'#EVOOQ`'#Dv'#DvQYQbOOO-PQbO'#DXO-[QbO'#C{O.PQbO'#DmO.tQQO'#DpO.PQbO'#DrO.yQbO'#DQO/RQWO'#DROOOO'#E`'#E`OOOO'#Dw'#DwO/gOSO,59jOOQa,59j,59jOOQ`'#Dx'#DxO/uQbO,5:PO/|QbO'#DVO0WQQO,59pOOQa,5:P,5:PO0cQbO,5:POOQa'#E]'#E]OOQ`'#Dk'#DkOOQ`'#El'#ElOOQ`'#EP'#EPO0mQbO,59cO1gQbO,5:aO.PQbO,59iO.PQbO,59iO.PQbO,59iO.PQbO,5:UO.PQbO,5:UO.PQbO,5:UO1wQRO,59fO2OQRO,59fO2ZQRO,59fO2UQQO,59fO2lQQO,59fO2tObO,59dO3PQbO'#EQO3[QbO,59bO3vQbO,5:ZO1gQbO,5:`OOQ`,5:q,5:qOOQ`-E7t-E7tOOQ`'#Dy'#DyO4ZQbO'#DYO4fQbO'#DZOOQO'#Dz'#DzO4^QQO'#DYO4tQQO,59sO4yQcO'#E]O6_QRO'#E[O6fQRO'#E[OOQO'#E['#E[O6qQQO,59gO6vQRO,5:XO6}QRO,5:XO3vQbO,5:[O7YQcO,5:^O8UQcO,5:^O8`QcO,5:^OOOO,59l,59lOOOO,59m,59mOOOO-E7u-E7uOOQa1G/U1G/UOOQ`-E7v-E7vO8pQQO1G/[OOQa1G/k1G/kO8{QbO1G/kOOQ`,59q,59qOOQO'#D|'#D|O8pQQO1G/[OOQa1G/[1G/[OOQ`'#D}'#D}O8{QbO1G/kOOQ`-E7}-E7}OOQ`1G/{1G/{OOQa1G/T1G/TO:WQcO1G/TO:_QcO1G/TO:fQcO1G/TOOQa1G/p1G/pO;_QcO1G/pO;iQcO1G/pO;sQcO1G/pOOQa1G/Q1G/QOOQa1G/O1G/OO<hQbO'#DiO=_QbO'#CwOOQ`,5:l,5:lOOQ`-E8O-E8OOOQ`'#D`'#D`O=lQbO'#D`O>]QbO1G/uOOQ`1G/z1G/zOOQ`-E7w-E7wO>hQQO,59tOOQO,59u,59uOOQO-E7x-E7xO>pQbO1G/_O3vQbO1G/RO3vQbO1G/sO?TQbO1G/vO?`QQO7+$vOOQa7+$v7+$vO?kQbO7+%VOOQa7+%V7+%VOOQO-E7z-E7zOOQ`-E7{-E7{OOQ`'#D{'#D{O?uQQO'#D{O?zQbO'#EiOOQ`,59z,59zO@kQbO'#D^O@pQQO'#DaOOQ`7+%a7+%aO@uQbO7+%aO@zQbO7+%aOASQbO7+$yOA_QbO7+$yOA{QbO7+$mOBTQbO7+%_OOQ`7+%b7+%bOBYQbO7+%bOB_QbO7+%bOOQa<<Hb<<HbOOQa<<Hq<<HqOOQ`,5:g,5:gOOQ`-E7y-E7yOBgQQO,59xO3vQbO,59{OOQ`<<H{<<H{OBlQbO<<H{OOQ`<<He<<HeOBqQbO<<HeOBvQbO<<HeOCOQbO<<HeOOQ`'#EO'#EOOCZQbO<<HXOCcQbO'#DhOOQ`<<HX<<HXOCkQbO<<HXOOQ`<<Hy<<HyOOQ`<<H|<<H|OCpQbO<<H|O3vQbO1G/dOOQ`1G/g1G/gOOQ`AN>gAN>gOOQ`AN>PAN>POCuQbOAN>POCzQbOAN>POOQ`-E7|-E7|OOQ`AN=sAN=sODSQbOAN=sO-[QbO,5:QO3vQbO,5:SOOQ`AN>hAN>hOOQ`7+%O7+%OOOQ`G23kG23kODXQbOG23kPD^QbO'#DfOOQ`G23_G23_ODcQQO1G/lOOQ`1G/n1G/nOOQ`LD)VLD)VO3vQbO7+%WOOQ`<<Hr<<Hr",
stateData: "D}~O!wOS!xOS~OdPOe`OfUOg]OhfOmUOuUOvUO}UO!]gO!`hO!biO!djO!}[O#QQO#XRO#YSO#ZcO~OdlOfUOg]OhfOmUOuUOvUOykO}UO!VmO!}[O#QQO#XRO#YSOT#OXU#OXW#OXX#OXY#OXZ#OX[#OX]#OX~OP#OXQ#OXR#OXS#OX^#OX!OoX!ZoX#ZoX#aoX#^oX!QoX!ToX!UoX!foX~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#a#PX!Q#PX!T#PX!U#PX!f#PX~OdlOfUOg]OhfOmUOuUOvUOykO}UO!VmO!}[O#QQO#XRO#YSO#^#PX!O#PX~P&[OV|O~P&[OP#OXQ#OXR#OXS#OXT#OXU#OXW#OXX#OXY#OXZ#OX[#OX]#OX^#OX~O#Z!zX#a!zX!Q!zX!T!zX!U!zX!f!zX~P(vOP!OOQ!OOR!POS!POT!ROU!SOW!QOX!QOY!QOZ!QO[!QO]!QO^}O~O#Z!zX#a!zX!Q!zX!T!zX!U!zX!f!zX~OP!OOQ!OOR!POS!PO~P+SOT!ROU!SO~P+SOdPOfUOg]OhfOmUOuUOvUO}UO!}[O#QQO#XRO#YSO~O!|!YO~O!O!]O!Z!ZO~P+SOV|O_!^O`!^Oa!^Ob!^Oc!^O~O#Z!_O#a!_O~Od!aOy!cO!O{P~OdlOfUOg]OmUOuUOvUO}UO!}[O#QQO#XRO#YSO~O!O!iO~Od!mOfUOg]OmUOuUOvUO}UO!}[O#QQO#XRO#YSO~OhfO!V!rO~P.SOhfOykO!VmO!Oka!Zka#Zka#aka#^ka!Qka!Tka!Uka!fka~P.SOd!tO!}[O~O#Q!uO#S!uO#T!uO#U!uO#V!uO#W!uO~OrsO#Q!wO#SqO#TrO~O#]!zO~P%YOykO#Z!|O#]#OO~O#Z#PO#]!zO~P.SOe`O!]gO!`hO!biO!djO~P,SO#^#[O~P(vOP!OOQ!OOR!POS!PO#^#[O~OT!ROU!SO#^#[O~O!Z!ZO#^#[O~Od#]Om#]O!}[O~Od#^Og]O!}[O~O!Z!ZO#Zja#aja#^ja!Qja!Tja!Uja!fja~Oe`O!]gO!`hO!biO!djO#Z#cO~P,SOd!aOy!cO!O{X~Om#hOu#hO}#hO#QQO~O!O#jO~OT!ROU!SOW!QOX!QOY!QOZ!QO[!QO]!QO~O!O#kO~P5wOT!ROU!SO!O#kO~O#Z!aa#a!aa!Q!aa!T!aa!U!aa!f!aa~P*XO#Z!aa#a!aa!Q!aa!T!aa!U!aa!f!aa~OP!OOQ!OOR!POS!PO~P7]OT!ROU!SO~P7]O!O#OX~P!dO!O#`X~P5wOT!ROU!SO!O#`X~O!O#mO~OykO#Z!|O#]#oO~O#Z#PO#]#qO~P.SO^}ORpiSpi#Zpi#api#^pi!Qpi!Tpi!Upi!fpi~OPpiQpi~P9bOP!OOQ!OO~P9bOP!OOQ!OORpiSpi#Zpi#api#^pi!Qpi!Tpi!Upi!fpi~OW!QOX!QOY!QOZ!QO[!QO]!QOT!Xi#Z!Xi#a!Xi#^!Xi!O!Xi!Q!Xi!T!Xi!U!Xi!f!Xi~OU!SO~P;]OU!SO~P;oOU!Xi~P;]OhfOykO!VmO!ZoX#ZoX#aoX#^oX!QoX!ToX!UoX!foX~P.SOhfOykO!VmO~P.SOe`O!]gO!`hO!biO!djO#Z#tO!Q#[P!T#[P!U#[P!f#[P~P,SO!Q#xO!T#yO!U#zO~Oy!cO!O{a~Oe`O!]gO!`hO!biO!djO#Z$OO~P,SO!Q#xO!T#yO!U$QO~OykO#Z!|O#]$UO~O#Z#PO#]$VO~P.SO#Z$WO~Oe`O!]gO!`hO!biO!djO#Z#tO!Q#[X!T#[X!U#[X!f#[X~P,SOd$YO~O!O$ZO~O!U$[O~O!T#yO!U$[O~O!Q#xO!T#yO!U$^O~Oe`O!]gO!`hO!biO!djO#Z#tO!Q#[P!T#[P!U#[P~P,SO!U$bO~O!U$cO~O!T#yO!U$cO~O!U$hO!f$gO~O!O$jO~O!U$lO~O!U$mO~O!T#yO!U$mO~O!Q#xO!T#yO!U$mO~O!U$pO~O!U$rO!f$gO~O!O$uO!d$tO~O!U$rO~O!U$wO~O!T#yO!U$wO~O!U$zO~O!U$}O~O!O%OO~Omv~", stateData: "Dk~O!wOS!xOS~OdWOe`OfTOg]OhfOmTOpgOvTOwTO!OTO!bhO!eiO!gjO!}[O#RPO#YQO#ZRO#[cO~OsmO#RpO#TkO#UlO~OdwOfTOg]OmTOvTOwTOzsO!OTO!}[O#RPO#YQO#ZRO#[qO~O#^uO~P!rOP#QXQ#QXR#QXS#QXT#QXU#QXW#QXX#QXY#QXZ#QX[#QX]#QX^#QX#[#QX#a#QX!R#QX!U#QX!V#QX!Z#QX~OdwOfTOg]OhfOmTOvTOwTOzsO!OTO!WxO!}[O#RPO#YQO#ZRO#_#QX!P#QX~P#tOV|O~P#tOP#PXQ#PXR#PXS#PXT#PXU#PXW#PXX#PXY#PXZ#PX[#PX]#PX^#PX~O#[!zX#a!zX!R!zX!U!zX!V!zX!Z!zX~P&`OdwOfTOg]OhfOmTOvTOwTOzsO!OTO!WxO!}[O#RPO#YQO#ZRO!P!]X!`!]X#[!]X#a!]X#_!]X!R!]X!U!]X!V!]X!Z!]X~P&`OP!ROQ!ROR!SOS!SOT!OOU!POW}OX}OY}OZ}O[}O]}O^!QO~O#[!zX#a!zX!R!zX!U!zX!V!zX!Z!zX~OT!OOU!PO~P*XOP!ROQ!ROR!SOS!SO~P*XOdWOfTOg]OhfOmTOpgOvTOwTO!OTO!}[O#RPO#YQO#ZRO~O!|!YO~O!P!]O!`!ZO~P*XOV|O_!^O`!^Oa!^Ob!^Oc!^O~O#[!_O#a!_O~Od!aOz!cO!P|P~Od!gOfTOg]OmTOvTOwTO!OTO!}[O#RPO#YQO#ZRO~OdwOfTOg]OmTOvTOwTO!OTO!}[O#RPO#YQO#ZRO~O!P!nO~Od!rO!}[O~O#R!sO#T!sO#U!sO#V!sO#W!sO#X!sO~OsmO#R!uO#TkO#UlO~O#^!xO~P!rOhfO!W!zO~P.POzsO#[!{O#^!}O~O#[#OO#^!xO~P.POhfOzsO!WxO!Pka!`ka#[ka#aka#_ka!Rka!Uka!Vka!Zka~P.POe`O!bhO!eiO!gjO~P+XO#_#[O~P&`OT!OOU!PO#_#[O~OP!ROQ!ROR!SOS!SO#_#[O~O!`!ZO#_#[O~Od#]Om#]O!}[O~Od#^Og]O!}[O~O!`!ZO#[ja#aja#_ja!Rja!Uja!Vja!Zja~Oe`O!bhO!eiO!gjO#[#cO~P+XOd!aOz!cO!P|X~Om#hOv#hO!O#hO#RPO~O!P#jO~OhfOzsO!WxOT#PXU#PXW#PXX#PXY#PXZ#PX[#PX]#PX!P#PX~P.POT!OOU!POW}OX}OY}OZ}O[}O]}O~O!P#OX~P5sOT!OOU!PO!P#OX~O!P#kO~O!P#lO~P5sOT!OOU!PO!P#lO~O#[!fa#a!fa!R!fa!U!fa!V!fa!Z!fa~P)^O#[!fa#a!fa!R!fa!U!fa!V!fa!Z!fa~OT!OOU!PO~P7pOP!ROQ!ROR!SOS!SO~P7pOzsO#[!{O#^#oO~O#[#OO#^#qO~P.POW}OX}OY}OZ}O[}O]}OTqi#[qi#aqi#_qi!Pqi!Rqi!Uqi!Vqi!Zqi~OU!PO~P9VOU!PO~P9iOUqi~P9VO^!QOR!^iS!^i#[!^i#a!^i#_!^i!R!^i!U!^i!V!^i!Z!^i~OP!^iQ!^i~P:mOP!ROQ!RO~P:mOP!ROQ!ROR!^iS!^i#[!^i#a!^i#_!^i!R!^i!U!^i!V!^i!Z!^i~OhfOzsO!WxO!`!]X#[!]X#a!]X#_!]X!R!]X!U!]X!V!]X!Z!]X~P.POhfOzsO!WxO~P.POe`O!bhO!eiO!gjO#[#tO!R#]P!U#]P!V#]P!Z#]P~P+XO!R#xO!U#yO!V#zO~Oz!cO!P|a~Oe`O!bhO!eiO!gjO#[$OO~P+XO!R#xO!U#yO!V$RO~OzsO#[!{O#^$UO~O#[#OO#^$VO~P.PO#[$WO~Oe`O!bhO!eiO!gjO#[#tO!R#]X!U#]X!V#]X!Z#]X~P+XOd$YO~O!P$ZO~O!V$[O~O!U#yO!V$[O~O!R#xO!U#yO!V$^O~Oe`O!bhO!eiO!gjO#[#tO!R#]P!U#]P!V#]P~P+XO!V$eO!Z$dO~O!V$gO~O!V$hO~O!U#yO!V$hO~O!P$jO~O!V$lO~O!V$mO~O!U#yO!V$mO~O!R#xO!U#yO!V$mO~O!V$qO!Z$dO~Op$sO!P$tO~O!V$qO~O!V$uO~O!V$wO~O!U#yO!V$wO~O!V$zO~O!V$}O~Op$sO~O!P%OO~Omw~",
goto: "4x#aPPPPPPPPPPPPPPPPPPPPPPPPPP#b#w$aP%d&k'P'oP(n(nPP(r)nP*S*t*wPP*}P+Z+sPPP,Z-X.OP.WP.W.WP.WP.WP.jP.n.W.W.t.z/Q/W/^/h/o/y0T0_0fPPPP0l0p1^PP1v3`P4`PPPPPPPP4dPP4j4rpaOe|!]!^!i#c#j#k#m#v$O$Z$j$u%OR!W[t^O[e|!Z!]!^!i#c#j#k#m#v$O$Z$j$u%OT!pj$trPO[e|!]!^!i#c#j#k#m#v$O$Z$j$u%OzlPSTgikpx{}!O!P!Q!R!S!m!{#Q#^#_#pS!mj$tR#^!ZvTO[ej|!]!^!i#c#j#k#m#v$O$Z$j$t$u%OzUPSTgikpx{}!O!P!Q!R!S!m!{#Q#^#_#pQ!tqQ#]!YR#_!Zu^O[e|!Z!]!^!i#c#j#k#m#v$O$Z$j$u%OpYOe|!]!^!i#c#j#k#m#v$O$Z$j$u%OQ!U[Q!kiQ#S!OR#V!P!rUOPST[egijkpx{|}!O!P!Q!R!S!]!^!i!m!{#Q#^#_#c#j#k#m#p#v$O$Z$j$t$u%OR#h!cTsQu!sUOPST[egijkpx{|}!O!P!Q!R!S!]!^!i!m!{#Q#^#_#c#j#k#m#p#v$O$Z$j$t$u%O[nPTp!m#^#_QySQ!yxX!|y!y!}#npaOe|!]!^!i#c#j#k#m#v$O$Z$j$u%O[mPTp!m#^#_Q!W[R!rkR!ffX!df!b!e#gQ#|#dQ$S#lQ$`#}R$o$aQ#d!]Q#l!iQ$P#kQ$T#mQ$k$ZQ$v$jQ$|$uR%P%OQ#{#dQ$R#lQ$]#|Q$_#}Q$d$SS$n$`$aR$x$o!QUPST[gijkpx{}!O!P!Q!R!S!m!{#Q#^#_#p$tqVOe|!]!^!i#c#j#k#m#v$O$Z$j$u%OpZOe|!]!^!i#c#j#k#m#v$O$Z$j$u%OQ!V[Q!hgQ!liS!oj$tQ#W!SR#Y!R]nPTp!m#^#_qaOe|!]!^!i#c#j#k#m#v$O$Z$j$u%OT$e$T$fQ$i$TR$s$fQeOR!`eQuQR!vuQxSR!xxQ!bfR#f!bQ!efQ#g!bT#i!e#gS#v#c$OR$X#vQ!}yQ#n!yT#r!}#nQ#Q{Q#p!{T#s#Q#pYpPT!m#^#_R!spS![_!XR#a![Q$f$TR$q$fTdOeSbOeQ#R|`#b!]!i#k#m$Z$j$u%OQ#e!^U#u#c#v$OR#}#jp_Oe|!]!^!i#c#j#k#m#v$O$Z$j$u%OQ!X[R#`!ZrXO[e|!]!^!i#c#j#k#m#v$O$Z$j$u%O[mPTp!m#^#_Q{SQ!ggQ!jiS!nj$tQ!rkQ!{xW#P{!{#Q#pQ#S}Q#T!OQ#U!PQ#W!QQ#X!RR#Z!SpWOe|!]!^!i#c#j#k#m#v$O$Z$j$u%O!OlPSTgijkpx{}!O!P!Q!R!S!m!{#Q#^#_#p$tR!T[TtQuQ#w#cR$a$O]oPTp!m#^#_Q!qjR${$t", goto: "4x#aPPPPPPPPPPPPPPPPPPPPPPPPPP#b#w$aP%d#bP&k'bP(a(aPP(e)aP)u*g*jPP*pP*|+fPPP+|,zP-O-U-j.YP.bP.b.bP.bP.b.b.t.z/Q/W/^/h/o/y0T0Z0ePPPP0l0p1^PP1v1|3fP4fPPPPPPPP4jPP4ppaOe|!]!^!n#c#j#k#l#v$O$Z$j$t%OR!W[t^O[e|!Z!]!^!n#c#j#k#l#v$O$Z$j$t%OT!jg$srWO[e|!]!^!n#c#j#k#l#v$O$Z$j$t%OzwRSWhjrsv{}!O!P!Q!R!S!g!y#P#^#_#pS!gg$sR#^!ZvSO[eg|!]!^!n#c#j#k#l#v$O$Z$j$s$t%OzTRSWhjrsv{}!O!P!Q!R!S!g!y#P#^#_#pQ!rkQ#]!YR#_!ZpYOe|!]!^!n#c#j#k#l#v$O$Z$j$t%OQ!U[S!ig$sQ!mhQ!pjQ#S!PR#U!O!rTORSW[eghjrsv{|}!O!P!Q!R!S!]!^!g!n!y#P#^#_#c#j#k#l#p#v$O$Z$j$s$t%OR#h!cTmPo!sTORSW[eghjrsv{|}!O!P!Q!R!S!]!^!g!n!y#P#^#_#c#j#k#l#p#v$O$Z$j$s$t%OQtR[ySW{!g#^#_Q!wrX!{t!w!|#npaOe|!]!^!n#c#j#k#l#v$O$Z$j$t%O[xSW{!g#^#_Q!W[R!zsR!ffX!df!b!e#gQ#|#dQ$T#mQ$`#}R$o$aQ#d!]Q#m!nQ$P#kQ$Q#lQ$k$ZQ$v$jQ$|$tR%P%OQ#{#dQ$S#mQ$]#|Q$_#}Q$i$TS$n$`$aR$x$o!QTRSW[ghjrsv{}!O!P!Q!R!S!g!y#P#^#_#p$sqUOe|!]!^!n#c#j#k#l#v$O$Z$j$t%OT$b$P$cQ$f$PR$r$cu^O[e|!Z!]!^!n#c#j#k#l#v$O$Z$j$t%OpZOe|!]!^!n#c#j#k#l#v$O$Z$j$t%OQ!V[Q!qjQ#W!RR#Z!S]ySW{!g#^#_qaOe|!]!^!n#c#j#k#l#v$O$Z$j$t%OQeOR!`eQoPR!toQrRR!vrQ!bfR#f!bQ!efQ#g!bT#i!e#gS#v#c$OR$X#vQ!|tQ#n!wT#r!|#nQ#PvQ#p!yT#s#P#pQ$c$PR$p$cY{SW!g#^#_R#Q{S![_!XR#a![TdOeSbOeQ#R|`#b!]!n#k#l$Z$j$t%OQ#e!^U#u#c#v$OR#}#jp_Oe|!]!^!n#c#j#k#l#v$O$Z$j$t%OQ!X[R#`!ZQ!kgR${$srXO[e|!]!^!n#c#j#k#l#v$O$Z$j$t%OQvR[xSW{!g#^#_S!hg$sQ!lhQ!ojQ!yrQ!zsW#Ov!y#P#pQ#S}Q#T!OQ#V!PQ#W!QQ#X!RR#Y!SpVOe|!]!^!n#c#j#k#l#v$O$Z$j$t%O!OwRSWghjrsv{}!O!P!Q!R!S!g!y#P#^#_#p$sR!T[TnPoQ#w#cR$a$O]zSW{!g#^#_",
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 FunctionCallWithBlock TryExpr keyword Throw keyword IfExpr keyword ElseIfExpr keyword ElseExpr CompoundAssign Assign", 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 IfExpr keyword ConditionalOp String StringFragment Interpolation EscapeSeq Boolean Regex Dict NamedArg NamedArgPrefix FunctionDef Params NamedParam Null colon CatchExpr keyword Block FinallyExpr keyword keyword Underscore Array ElseIfExpr keyword ElseExpr FunctionCallOrIdentifier BinOp PositionalArg operator WhileExpr keyword FunctionCallWithBlock TryExpr keyword Throw keyword CompoundAssign Assign",
maxTerm: 109, maxTerm: 109,
context: trackScope, context: trackScope,
nodeProps: [ nodeProps: [
["closedBy", 46,"end"] ["closedBy", 47,"end"]
], ],
propSources: [highlighting], propSources: [highlighting],
skippedNodes: [0], skippedNodes: [0],
repeatNodeCount: 11, 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!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#a~", 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$QUsSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{S$gP;=`<%l#{^$qUsS!wYOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U%[UsS#[QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{^%uZsS!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#T~~'aO#R~U'hUsS!}QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(RUsS#_QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(jWsSOt#{uw#{x!Q#{!Q![)S![#O#{#P;'S#{;'S;=`$d<%lO#{U)ZYsSmQOt#{uw#{x!O#{!O!P)y!P!Q#{!Q![)S![#O#{#P;'S#{;'S;=`$d<%lO#{U*OWsSOt#{uw#{x!Q#{!Q![*h![#O#{#P;'S#{;'S;=`$d<%lO#{U*oWsSmQOt#{uw#{x!Q#{!Q![*h![#O#{#P;'S#{;'S;=`$d<%lO#{U+^^sSOt#{uw#{x}#{}!O,Y!O!Q#{!Q![)S![!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{U,_[sSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{U-[UzQsSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U-sWsSOt#{uw#{x!P#{!P!Q.]!Q#O#{#P;'S#{;'S;=`$d<%lO#{U.b^sSOY/^YZ#{Zt/^tu0auw/^wx0ax!P/^!P!Q#{!Q!}/^!}#O5S#O#P2o#P;'S/^;'S;=`6T<%lO/^U/e^sSwQOY/^YZ#{Zt/^tu0auw/^wx0ax!P/^!P!Q3U!Q!}/^!}#O5S#O#P2o#P;'S/^;'S;=`6T<%lO/^Q0fXwQOY0aZ!P0a!P!Q1R!Q!}0a!}#O1p#O#P2o#P;'S0a;'S;=`3O<%lO0aQ1UP!P!Q1XQ1^UwQ#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;=`<%l0aU3ZWsSOt#{uw#{x!P#{!P!Q3s!Q#O#{#P;'S#{;'S;=`$d<%lO#{U3zbsSwQOt#{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[sSOY5SYZ#{Zt5Stu1puw5Swx1px#O5S#O#P2Y#P#Q/^#Q;'S5S;'S;=`5}<%lO5SU6QP;=`<%l5SU6WP;=`<%l/^U6bUsS!PQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U6{W#ZQsSOt#{uw#{x!_#{!_!`7e!`#O#{#P;'S#{;'S;=`$d<%lO#{U7jVsSOt#{uw#{x#O#{#P#Q8P#Q;'S#{;'S;=`$d<%lO#{U8WU#YQsSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~8oO#U~U8vU#^QsSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U9aUsS!WQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U9x]sSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#U:q#U#o,Y#o;'S#{;'S;=`$d<%lO#{U:v^sSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#`,Y#`#a;r#a#o,Y#o;'S#{;'S;=`$d<%lO#{U;w^sSOt#{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^sSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#X,Y#X#Y=t#Y#o,Y#o;'S#{;'S;=`$d<%lO#{U={[vQsSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^>x[#VWsSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^?u[#XWsSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^@r^#WWsSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#f,Y#f#gAn#g#o,Y#o;'S#{;'S;=`$d<%lO#{UAs^sSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#i,Y#i#j<s#j#o,Y#o;'S#{;'S;=`$d<%lO#{UBvU!`QsSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~C_O#a~",
tokenizers: [operatorTokenizer, 1, 2, 3, tokenizer, new LocalTokenGroup("[~RP!O!PU~ZO!|~~", 11)], tokenizers: [operatorTokenizer, 1, 2, 3, tokenizer, new LocalTokenGroup("[~RP!O!PU~ZO!|~~", 11)],
topRules: {"Program":[0,25]}, 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}], 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: 1652 tokenPrec: 1634
}) })

View File

@ -237,6 +237,22 @@ describe('if/else if/else', () => {
keyword end keyword end
`) `)
}) })
test('allows if/else in parens', () => {
expect(`eh? = (if true: true end)`).toMatchTree(`
Assign
AssignableIdentifier eh?
Eq =
ParenExpr
IfExpr
keyword if
Boolean true
colon :
Block
Boolean true
keyword end
`)
})
}) })
describe('while', () => { describe('while', () => {