diff --git a/src/parser/shrimp.grammar b/src/parser/shrimp.grammar index 1f321b2..f95f93d 100644 --- a/src/parser/shrimp.grammar +++ b/src/parser/shrimp.grammar @@ -25,9 +25,19 @@ Underscore { "_" } Regex { "//" (![/\\\n[] | "\\" ![\n] | "[" (![\n\\\]] | "\\" ![\n])* "]")+ ("//" $[gimsuy]*)? } // Stolen from the lezer JavaScript grammar "|"[@name=operator] - } +end { @specialize[@name=keyword] } +while { @specialize[@name=keyword] } +if { @specialize[@name=keyword] } +else { @specialize[@name=keyword] } +elseif { @specialize[@name=keyword] } +try { @specialize[@name=keyword] } +catch { @specialize[@name=keyword] } +finally { @specialize[@name=keyword] } +throw { @specialize[@name=keyword] } +null { @specialize[@name=Null] } + @external tokens tokenizer from "./tokenizer" { Identifier, AssignableIdentifier, Word, IdentifierBeforeDot } @external specialize {Identifier} specializeKeyword from "./tokenizer" { Do } @@ -47,7 +57,6 @@ item { newlineOrSemicolon // allow blank lines } - consumeToTerminator { PipeExpr | WhileExpr | @@ -72,7 +81,7 @@ pipeOperand { } WhileExpr { - singleLineWhileExpr | multiLineWhileExpr + while (ConditionalOp | expression) colon (newlineOrSemicolon MultiLineBlock | SingleLineBlock) end } SingleLineBlock { @@ -83,14 +92,6 @@ MultiLineBlock { block } -singleLineWhileExpr { - @specialize[@name=keyword] (ConditionalOp | expression) colon SingleLineBlock @specialize[@name=keyword] -} - -multiLineWhileExpr { - @specialize[@name=keyword] (ConditionalOp | expression) colon newlineOrSemicolon MultiLineBlock @specialize[@name=keyword] -} - FunctionCallOrIdentifier { DotGet | Identifier } @@ -107,7 +108,6 @@ arg { PositionalArg | NamedArg } - PositionalArg { expression | FunctionDef | Underscore } @@ -117,15 +117,7 @@ NamedArg { } FunctionDef { - singleLineFunctionDef | multilineFunctionDef -} - -singleLineFunctionDef { - Do Params colon consumeToTerminator CatchExpr? FinallyExpr? @specialize[@name=keyword] -} - -multilineFunctionDef { - Do Params colon newlineOrSemicolon block CatchExpr? FinallyExpr? @specialize[@name=keyword] + Do Params colon (consumeToTerminator | newlineOrSemicolon block) CatchExpr? FinallyExpr? end } IfExpr { @@ -133,19 +125,19 @@ IfExpr { } singleLineIf { - @specialize[@name=keyword] (ConditionalOp | expression) colon SingleLineThenBlock @specialize[@name=keyword] + if (ConditionalOp | expression) colon SingleLineThenBlock end } multilineIf { - @specialize[@name=keyword] (ConditionalOp | expression) colon newlineOrSemicolon ThenBlock ElseIfExpr* ElseExpr? @specialize[@name=keyword] + if (ConditionalOp | expression) colon newlineOrSemicolon ThenBlock ElseIfExpr* ElseExpr? end } ElseIfExpr { - @specialize[@name=keyword] (ConditionalOp | expression) colon newlineOrSemicolon ThenBlock + elseif (ConditionalOp | expression) colon newlineOrSemicolon ThenBlock } ElseExpr { - @specialize[@name=keyword] colon newlineOrSemicolon ThenBlock + else colon newlineOrSemicolon ThenBlock } ThenBlock { @@ -161,19 +153,19 @@ TryExpr { } singleLineTry { - @specialize[@name=keyword] colon consumeToTerminator CatchExpr? FinallyExpr? @specialize[@name=keyword] + try colon consumeToTerminator CatchExpr? FinallyExpr? end } multilineTry { - @specialize[@name=keyword] colon newlineOrSemicolon TryBlock CatchExpr? FinallyExpr? @specialize[@name=keyword] + try colon newlineOrSemicolon TryBlock CatchExpr? FinallyExpr? end } CatchExpr { - @specialize[@name=keyword] Identifier colon (newlineOrSemicolon TryBlock | consumeToTerminator) + catch Identifier colon (newlineOrSemicolon TryBlock | consumeToTerminator) } FinallyExpr { - @specialize[@name=keyword] colon (newlineOrSemicolon TryBlock | consumeToTerminator) + finally colon (newlineOrSemicolon TryBlock | consumeToTerminator) } TryBlock { @@ -181,7 +173,7 @@ TryBlock { } Throw { - @specialize[@name=keyword] (BinOp | ConditionalOp | expression) + throw (BinOp | ConditionalOp | expression) } ConditionalOp { @@ -200,7 +192,7 @@ Params { } NamedParam { - NamedArgPrefix (String | Number | Boolean | @specialize[@name=Null]) + NamedArgPrefix (String | Number | Boolean | null) } Assign { @@ -238,7 +230,6 @@ expression { } String { "'" stringContent* "'" } - } stringContent { @@ -274,7 +265,7 @@ Array { // to go through ambiguousFunctionCall (which is what we want semantically). // Yes, it is annoying and I gave up trying to use GLR to fix it. expressionWithoutIdentifier { - ParenExpr | Word | String | Number | Boolean | Regex | Dict | Array | @specialize[@name=Null] + ParenExpr | Word | String | Number | Boolean | Regex | Dict | Array | null } block { diff --git a/src/parser/shrimp.terms.ts b/src/parser/shrimp.terms.ts index 6765bad..96a8259 100644 --- a/src/parser/shrimp.terms.ts +++ b/src/parser/shrimp.terms.ts @@ -55,8 +55,8 @@ export const ConditionalOp = 55, PositionalArg = 56, WhileExpr = 58, - SingleLineBlock = 60, - MultiLineBlock = 61, + MultiLineBlock = 60, + SingleLineBlock = 61, TryExpr = 62, Throw = 64, IfExpr = 66, diff --git a/src/parser/shrimp.ts b/src/parser/shrimp.ts index 91f269f..38ed0db 100644 --- a/src/parser/shrimp.ts +++ b/src/parser/shrimp.ts @@ -7,11 +7,11 @@ import {highlighting} from "./highlight" const spec_Identifier = {__proto__:null,null:90, catch:96, finally:102, end:104, while:118, try:126, throw:130, if:134, elseif:142, else:146} export const parser = LRParser.deserialize({ version: 14, - states: ";lQYQbOOO#wQcO'#C{O$tOSO'#C}O%SQbO'#ElOOQ`'#DW'#DWOOQa'#DT'#DTO&YQbO'#DdO'kQcO'#EaOOQa'#Ea'#EaO(nQcO'#EaO)pQcO'#E`O*TQRO'#C|O+aQcO'#E[O+qQcO'#E[O+{QbO'#CzO,sOpO'#CxOOQ`'#E]'#E]O,xQbO'#E[O-PQbO'#ErOOQ`'#Dh'#DhO-tQQO'#EtOOQ`'#Dl'#DlO-PQbO'#DnO-PQbO'#EvOOQ`'#Dp'#DpO-yQRO'#DxOOQ`'#E['#E[O._QQO'#EZOOQ`'#EZ'#EZOOQ`'#Dz'#DzQYQbOOO.gQbO'#DUOOQa'#E`'#E`OOQ`'#Df'#DfOOQ`'#Eq'#EqOOQ`'#ES'#ESO.qQbO,59cO/eQbO'#DPO/mQWO'#DQOOOO'#Ec'#EcOOOO'#D{'#D{O0ROSO,59iOOQa,59i,59iOOQ`'#D}'#D}O0aQbO'#DXO0lQbO'#DYOOQO'#EO'#EOO0dQQO'#DXO0zQQO,5;WOOQ`'#D|'#D|O1PQbO,5:OO1WQQO,59oOOQa,5:O,5:OO1cQbO,5:OO1mQbO,5:eO-PQbO,59hO-PQbO,59hO-PQbO,59hO-PQbO,5:PO-PQbO,5:PO-PQbO,5:PO2QQRO,59fO2XQRO,59fO2jQRO,59fO2eQQO,59fO2uQQO,59fO2}ObO,59dO3YQbO'#ETO3eQbO,59bO4hQRO,5;^O4oQRO,5;^O4zQbO,5;`O5bQcO,5:YO6WQcO,5:YO6hQcO,5:YO6rQRO,5;bO6yQRO,5;bO1mQbO,5:dOOQ`,5:u,5:uOOQ`-E7x-E7xOOQ`,59p,59pOOQ`-E8Q-E8QOOOO,59k,59kOOOO,59l,59lOOOO-E7y-E7yOOQa1G/T1G/TOOQ`-E7{-E7{O7UQQO,59sOOQO,59t,59tOOQO-E7|-E7|O7^QbO1G0rOOQ`-E7z-E7zO7tQQO1G/ZOOQa1G/j1G/jO8PQbO1G/jOOQO'#EQ'#EQO7tQQO1G/ZOOQa1G/Z1G/ZOOQ`'#ER'#ERO8PQbO1G/jOOQ`1G0P1G0POOQa1G/S1G/SO8xQcO1G/SO9SQcO1G/SO9^QcO1G/SOOQa1G/k1G/kO:|QcO1G/kO;TQcO1G/kO;[QcO1G/kOOQa1G/Q1G/QOOQa1G/O1G/OO!dQbO'#C{O;cQbO'#CwOOQ`,5:o,5:oOOQ`-E8R-E8RO;pQbO1G0xOQQbO7+%UOOQa7+%U7+%UOOQO-E8O-E8OOOQ`-E8P-E8POOQ`'#Dj'#DjO>[QbO7+&dO>aQbO7+&eO>zQbO'#D]O?PQQO'#D`OOQ`7+&f7+&fO?UQbO7+&fO?ZQbO7+&fOOQ`'#EP'#EPO?cQQO'#EPO?hQbO'#EmOOQ`'#D_'#D_O@_QbO7+&gOOQ`'#Dr'#DrO@jQbO7+&hO@oQbO7+&iOOQ`<aQbO1G/fOOQ`1G/f1G/fOOQ`AN?lAN?lOOQ`AN?mAN?mODRQbOAN?mO-PQbO'#DtOOQ`'#EU'#EUODWQbOAN?oODcQQO'#DvOOQ`AN?oAN?oODhQbOAN?oOOQ`G25OG25OOOQ`G25QG25QODmQbOG25QODrQbO7+$}OOQ`7+$}7+$}OOQ`7+%Q7+%QOOQ`G25XG25XOE`QRO,5:`OEgQRO,5:`OOQ`-E8S-E8SOOQ`G25ZG25ZOErQbOG25ZOEwQQO,5:bOOQ`LD*lLD*lOOQ`<aQbO1G/|O@oQbO7+%fOOQ`7+%h7+%hOOQ`<PQbO7+$xO[QbO7+%YO>uQbO7+%YO>zQbO'#D]O?PQQO'#D`OOQ`7+&b7+&bO?UQbO7+&bO?ZQbO7+&bOOQ`'#EP'#EPO?cQQO'#EPO?hQbO'#ElOOQ`'#D_'#D_O@_QbO7+&cOOQ`'#Dr'#DrO@jQbO7+&dO@oQbO7+&eOOQa<OAN>OOCXQbOAN>OOC^QbOAN>OOOQ`AN>`AN>`OCfQbO1G/cO>[QbO1G/fOOQ`1G/f1G/fOOQ`AN?hAN?hOOQ`AN?iAN?iOC|QbOAN?iOOQ`'#EU'#EUODRQbOAN?kO-mQbO'#DtOD^QQO'#DvOOQ`AN?kAN?kODcQbOAN?kOOQ`G23jG23jODhQbOG23jODmQbO7+$}OOQ`7+$}7+$}OOQ`7+%Q7+%QOOQ`G25TG25TOOQ`-E8S-E8SOOQ`G25VG25VOEZQbOG25VOE`QRO,5:`OEgQRO,5:`OErQQO,5:bOOQ`LD)ULD)UOOQ`<[QbO1G/|O@oQbO7+%fOOQ`7+%h7+%hOOQ`<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!{YOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U%[UrS#_QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{^%uZrS!|YOY%nYZ#{Zt%ntu&huw%nwx&hx#O%n#O#P&h#P;'S%n;'S;=`'P<%lO%nY&mS!|YOY&hZ;'S&h;'S;=`&y<%lO&hY&|P;=`<%l&h^'SP;=`<%l%n~'[O#W~~'aO#U~U'hUrS#RQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(RUrS#dQOt#{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#^QrSOt#{uw#{x!_#{!_!`7e!`#O#{#P;'S#{;'S;=`$d<%lO#{U7jVrSOt#{uw#{x#O#{#P#Q8P#Q;'S#{;'S;=`$d<%lO#{U8WU#]QrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~8oO#X~U8vU#cQrSOt#{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[#YWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^?u[#[WrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^@r^#ZWrSOt#{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!{YOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U%[UrS#_QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{^%uZrS!|YOY%nYZ#{Zt%ntu&huw%nwx&hx#O%n#O#P&h#P;'S%n;'S;=`'P<%lO%nY&mS!|YOY&hZ;'S&h;'S;=`&y<%lO&hY&|P;=`<%l&h^'SP;=`<%l%n~'[O#W~~'aO#U~U'hUrS#RQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(RUrS#bQOt#{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#^QrSOt#{uw#{x!_#{!_!`7e!`#O#{#P;'S#{;'S;=`$d<%lO#{U7jVrSOt#{uw#{x#O#{#P#Q8P#Q;'S#{;'S;=`$d<%lO#{U8WU#]QrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~8oO#X~U8vU#aQrSOt#{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[#YWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^?u[#[WrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^@r^#ZWrSOt#{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: 1705 + tokenPrec: 1700 })