diff --git a/justfile b/justfile new file mode 100644 index 0000000..f5b62d0 --- /dev/null +++ b/justfile @@ -0,0 +1,2 @@ +build: + npx lezer-generator ludus.grammar -o ludus.js diff --git a/ludus.grammar b/ludus.grammar index 2fbfb34..69d86f4 100644 --- a/ludus.grammar +++ b/ludus.grammar @@ -1,10 +1,12 @@ -@top Script { terminator* line+ } +@precedence { line_end @left, line_break @left } + +@top Script { (newline | terminator)* line+ } @skip { space | comment } -line { (expression | toplevel) terminator+ } +line { (expression | toplevel) !line_end (newline | terminator)+ } -toplevel { Import | Use | Ns } +toplevel { Import | Use | Ns | Test } Import { silent<"import"> String silent<"as"> Word } @@ -18,6 +20,8 @@ Ns { "}" } +Test { silent<"test"> String non_binding } + expression { non_binding | binding } binding { Let | Ref | Fn_Named | Fn_Compound } @@ -33,11 +37,11 @@ synth_term { Args | Keyword } arg_term { Placeholder | simple } Args { - ("(" separator* ")") + ("(" (newline | separator)* ")") | ("(" - separator* - arg_term (separator+ arg_term)* - separator* + (newline | separator)* + arg_term ((newline | separator)+ arg_term)* + (newline | separator)* ")") } @@ -49,21 +53,13 @@ complex { | If_Let | Match | When - //| Do - //| Bind + | Do | Loop | Repeat - | Each } Repeat { silent<"repeat"> (Word | Number) Block } -// repeat 4 { thing () } - -Each { silent<"each"> simple "do" (Fn_Clause | Fn_Clauses) } - -// each [1, 2, 3] do (n) -> thing - Recur { silent<"recur"> Args } Loop { silent<"loop"> simple "with" (Fn_Clause | Fn_Clauses) } @@ -74,9 +70,9 @@ Fn_Clause { Tuple_Pattern "->" expression } Fn_Clauses { "{" - terminator* - Fn_Clause (terminator+ Fn_Clause)* - terminator* + (newline | terminator)* + Fn_Clause ((newline | terminator)+ Fn_Clause)* + (newline | terminator)* "}" } @@ -87,84 +83,71 @@ Fn_Named { silent<"fn"> Word Fn_Clause } Fn_Lambda { silent<"fn"> Fn_Clause } // TODO: figure out precedence with do/bind exprs -// do_expr { Fn_Lambda | Synthetic | Word | Keyword } +do_expr { Fn_Lambda | Synthetic | Word | Keyword } -// Do { -// silent<"do"> simple (~ambig newline* ">" do_expr)+ -// } - -// Bind { -// silent<"bind"> -// simple -// (!pipeline pipeline)+ -// } +Do { + silent<"do"> simple !line_break (newline* ">" do_expr)+ + } Pattern { Tuple_Pattern | List_Pattern | Dict_Pattern - | Struct_Pattern | atom | Placeholder + | Ignored } +Ignored { "_" Word } + Placeholder { "_" } ellipsis { "..." } -Splattern { ellipsis (Word | Placeholder) } +Splattern { ellipsis (Word | Placeholder | Ignored) } Tuple_Pattern { - ("(" separator* ")") + ("(" (newline | separator)* ")") | ("(" - separator* - (Pattern separator+)* (Pattern | Splattern) - separator* + (newline | separator)* + (Pattern (newline | separator)+)* (Pattern | Splattern) + (newline | separator)* ")") } List_Pattern { - ("[" separator* "]") + ("[" (newline | separator)* "]") | ("[" - separator* - (Pattern separator+)* (Pattern | Splattern) - separator* + (newline | separator)* + (Pattern (newline | separator)+)* (Pattern | Splattern) + (newline | separator)* "]") } Assoc_Pattern { Word | (Keyword Pattern) } Dict_Pattern { - ("#{" separator* "}") + ("#{" (newline | separator)* "}") | ("#{" - separator* - (Assoc_Pattern separator+)* (Assoc_Pattern | Splattern) - separator* + (newline | separator)* + (Assoc_Pattern (newline | separator)+)* (Assoc_Pattern | Splattern) + (newline | separator)* "}") } -Struct_Pattern { - ("@{" separator* "}") - | ("@{" - separator* - (Assoc_Pattern separator+)* (Assoc_Pattern | Splattern) - separator* - "}") -} - -Let { silent<"let"> Pattern "=" non_binding } +Let { silent<"let"> Pattern "=" !line_break newline* non_binding } Else { silent<"else"> } -Match_Clause {(Pattern | Else) "->" newline* expression} +Match_Clause {(Pattern | Else) "->" !line_break newline* expression} match_body { Match_Clause | ( "{" - terminator* - Match_Clause (terminator+ Match_Clause)* - terminator* + (newline | terminator)* + Match_Clause ((newline | terminator)+ Match_Clause)* + (newline | terminator)* "}" ) } @@ -177,35 +160,36 @@ Match { } When_Clause { - (simple | Placeholder | Else) "->" newline* expression + (simple | Placeholder | Else) "->" !line_break newline* expression } When { - silent<"when"> "{" - terminator* - When_Clause (terminator+ When_Clause)* - terminator* + silent<"when"> + "{" + (newline | terminator)* + When_Clause ((newline | terminator)+ When_Clause)* + (newline | terminator)* "}" } If { - silent<"if"> simple newline* - silent<"then"> expression newline* + silent<"if"> simple !line_break newline* + silent<"then"> expression !line_break newline* silent<"else"> expression } If_Let { silent<"if"> silent<"let"> - Pattern "=" simple newline* - silent<"then"> expression newline* + Pattern "=" simple !line_break newline* + silent<"then"> expression !line_break newline* silent<"else"> expression } Block { "{" - terminator* - expression (terminator+ expression)* - terminator* + (newline | terminator)* + expression ((newline | terminator)+ expression)* + (newline | terminator)* "}" } @@ -214,16 +198,15 @@ collection { | List | Set | Dict - | Struct } Tuple { ( "(" // non-empty - separator* - non_binding (separator+ non_binding)* - separator* + (newline | separator)* + non_binding ((newline | separator)+ non_binding)* + (newline | separator)* ")" ) - | "(" separator* ")" // empty + | "(" (newline | separator)* ")" // empty } Splat { ellipsis Word } @@ -232,20 +215,20 @@ linear_term { Splat | non_binding } List { ("[" - separator* - linear_term (separator+ linear_term)* - separator* + (newline | separator)* + linear_term ((newline | separator)+ linear_term)* + (newline | separator)* "]" ) - | "[" separator* "]" + | "[" (newline | separator)* "]" } Set { ("${" - separator* - linear_term (separator+ linear_term)* - separator* + (newline | separator)* + linear_term ((newline | separator)+ linear_term)* + (newline | separator)* "}") - | "${" separator* "}" + | "${" (newline | separator)* "}" } assoc_term { Word | (Keyword non_binding) } @@ -254,20 +237,11 @@ dict_term { assoc_term | Splat } Dict { ("#{" - separator* - dict_term (separator+ dict_term)* - separator* + (newline | separator)* + dict_term ((newline | separator)+ dict_term)* + (newline | separator)* "}" ) - | "#{" separator* "}" -} - -Struct { - ("@{" - separator* - assoc_term (separator+ assoc_term)* - separator* - "}") - | "@{" separator* "}" + | "#{" (newline | separator)* "}" } atom { Boolean | Nil | String | Number | Keyword | Word } @@ -290,7 +264,7 @@ Nil { silent<"nil"> } int { $[1-9]$[0-9]* | "0" } float { ("0" | int ) "." $[0-9]+} Number { "-"? (int | float) } - separator { $[,\n] } - terminator { $[;\n] } + separator { "," } + terminator { ";" } newline { "\n" } } diff --git a/ludus.js b/ludus.js new file mode 100644 index 0000000..ffbae22 --- /dev/null +++ b/ludus.js @@ -0,0 +1,18 @@ +// This file was generated by lezer-generator. You probably shouldn't edit it. +import {LRParser} from "@lezer/lr" +const spec_Word = {__proto__:null,true:8, false:10, nil:154, fn:192, recur:196, if:202, then:204, else:206, let:208, match:212, with:214, when:218, do:220, loop:226, repeat:230, ref:234, import:238, as:240, use:242, ns:244, test:246} +export const parser = LRParser.deserialize({ + version: 14, + states: "!?jOYQPOOOOQO'#D^'#D^OYQPOOO#SQPO'#CeOOQO'#Dz'#DzO#XQPO'#DzO%jQPO'#CfO%qQPO'#CgO%{QPO'#CiO&hQPO'#CjOOQO'#D}'#D}O&oQPO'#CkOOQO'#Dy'#DyO&wQPO'#CxOOQO'#Ec'#EcOOQO'#Dx'#DxOOQO'#Et'#EtOOQO'#Dw'#DwOOQO'#Ev'#EvO(eQPO'#DvOOQO'#D_'#D_Q*TQPOOOOQO'#C^'#C^OOQO'#Cb'#CbO*eQPO'#CnO&rQPO'#CwO+hQPO'#CyO+oQPO'#C{O,jQPO'#DOO,oQPO'#DQO-jQPO'#DRO.eQPO'#DTO.mQPO'#DUO/bQPO'#DVO/gQPO'#DYO/lQPO'#DZO/qQPO'#D[O/vQPO'#D]OOQO-E7[-E7[OOQO,59P,59POOQO'#D`'#D`O/{QPO,59QO0SQPO,59QOOQO,59Q,59QO*hQPO'#CnO0_QPO,59ROOQO'#ES'#ESO0iQPO,59ROOQO,59R,59RO0tQPO'#ChO0yQPO,59TO1TQPO,59TOOQO,59T,59TO1`QPO,59UOOQO'#EZ'#EZO1gQPO'#EZOOQO'#EY'#EYO2QQPO,59UOOQO,59U,59UO2]QPO'#ClOOQO'#E]'#E]OOQO'#Dd'#DdO2mQPO,59VO&wQPO,59dO3hQPO,59dO3sQPO,5:bOOQO-E7]-E7]O5pQPO'#CpO6QQPO'#CoOOQO,59Y,59YO6VQPO,59rOOQO,59c,59cO6_QPO,59eO.mQPO,59fO6gQPO,59gO6lQPO,59jO6|QPO,59lO7UQQO'#DzO7gQQO,59mO7lQPO,59oO7qQPO'#CmO8]QPO'#CrO9OQPO'#CuOOQO'#Cq'#CqO9VQPO,59pO9[QPO,59qO9aQPO,59tOOQO,59u,59uO9fQPO,59vO1gQPO,59wOOQO-E7^-E7^O9kQPO1G.lOOQO1G.l1G.lO9vQPO1G.lO9kQPO1G.lO9}QPO1G.mOOQO1G.m1G.mO:YQPO1G.mO9}QPO1G.mOOQO,59S,59SO:dQPO1G.oOOQO1G.o1G.oO:oQPO1G.oO:dQPO1G.oO:yQPO1G.pOOQO1G.p1G.pOOQO,5:u,5:uO;UQPO1G.pO:yQPO1G.pO;]QPO,59WOOQO'#Cm'#CmOOQO'#E^'#E^OOQO,59W,59WO;mQPO,59WOOQO-E7b-E7bO;xQPO1G/OOTQPO'#DlO>]QPO'#DlO>hQPO1G/WO?VQQO,59VO6VQPO1G/XOOQO1G/Z1G/ZOOQO,59`,59`O?hQPO,59^OOQO,59^,59^O?xQPO,59^O?xQPO,59^O5yQPO,59^O@TQPO,59aOOQO'#Cv'#CvO.mQPO'#CvO@[QPO,59aO@gQPO,59aOOQO,59a,59aO@[QPO,59aO@rQPO1G/[O(mQPO1G/]OA`QPO1G/`OAeQPO1G/bOOQO1G/c1G/cOApQPO7+$WOAwQPO7+$WOOQO7+$W7+$WOOQO,59{,59{OOQO-E7_-E7_OBSQPO7+$XOB^QPO7+$XOOQO7+$X7+$XOOQO,59|,59|OOQO-E7`-E7`OBiQPO7+$ZOBsQPO7+$ZOOQO7+$Z7+$ZOCOQPO7+$[OCVQPO7+$[OOQO7+$[7+$[OOQO,59},59}OOQO-E7a-E7aOOQO1G.r1G.rOCbQPO1G.rOCmQPO1G.rOCbQPO1G.rOC}QPO7+$jODUQPO7+$jOOQO7+$j7+$jOOQO,5:S,5:SOOQO-E7f-E7fODaQPO1G.vO5yQPO1G.vOOQO1G.v1G.vODaQPO1G.vOEjQPO1G.vOOQO-E7d-E7dODaQPO1G.vOOQO,59_,59_OOQO1G.u1G.uO=PQPO,59nOEqQPO,59nOOQO-E7g-E7gO(mQPO7+$kOE|QPO7+$kO*mQPO7+$lOFUQPO'#C|OOQO'#El'#ElOFZQPO'#ElOOQO7+$m7+$mOFhQPO7+$pOFsQPO,59kOFzQPO7+$pOFhQPO7+$pOOQO7+$p7+$pO>]QPO,5:WOG_QPO'#E[OOQO'#Ep'#EpOOQO,5:W,5:WOOQO-E7j-E7jOOQO7+$s7+$sOOQO1G.x1G.xOHYQPO1G.xOHYQPO1G.xO5yQPO1G.xOHeQPO1G.xOHYQPO1G.xOHlQPO1G.{O@gQPO1G.{OOQO1G.{1G.{OHlQPO1G.{OOQO,59b,59bOIYQPO1G.{OOQO-E7e-E7eOHlQPO1G.{O@rQPO7+$vOOQO7+$v7+$vOOQO7+$w7+$wOOQO7+$z7+$zOOQO'#Dn'#DnOAeQPO7+$|OIaQPO7+$|OOQO<SO!$lQPOAN>SOOQOAN>SAN>SOOQO,5:Z,5:ZOOQO-E7m-E7mOOQOAN=dAN=dOOQOAN=hAN=hOOQO<QQPO'#CyO+oQPO'#C{O.mQPO,59fO!>XQPO1G/QO*mQPO7+$lO!>^QPO1G/QO.mQPO,59fO!>cQPO1G/QO.mQPO,59fO.mQPO,59f", + stateData: "!>h~O!fOS!gOS~ORTOSfOTfOVSOWSO!hPO!iPO!ogO!pRO!rUO!uVO!yWO!{XO#ShO#UiO#W]O#XjO#[pO#^kO#alO#bmO#enO#goO#iqO#krO#msO#ntO#ouO~ORwO~O!h!nX!i!nX!p#OX!r#OX!s!nX!t!nX!x!nX!z!nX#Y!nX#_!nX#c!nX#T!nX#Z!nX~ORTOSfOTfOVSOWSO!hxO!ogO!pRO!rUO!sxO!uVO!yWO!{XO#S|O#UiO#W]O#XjO#^kO#alO#bmO#enO#goO~O!t{O~P$SO!w!RO!x!QO~P$SO!w!RO!z!UO~P$SOR!WO!hxO!pRO!sxO!w!RO~O!z![O~P&VO!pRO!r!]O~ORTOSfOTfOVSOWSO!hPO!iPO!ogO!pRO!rUO!uVO!yWO!{XO#ShO#UiO#W]O#XjO#[pO#^kO#alO#bmO#enO#goO#iqO~O!hPO!iPO~ORTOSfOTfOVSOWSO!ogO!pRO!rUO!uVO!yWO!{XO#ShO#UiO#W]O#XjO#[pO#^kO#alO#bmO#enO#goO#iqO~O#krO#msO#ntO#ouO~P(mOR!hO!r!eO~ORTOSfOTfOVSOWSO!ogO!pRO!rUO!uVO!yWO!{XO#S|O#UiO~O#[!kO~P*mORTOSfOTfOVSOWSO!ogO!pRO!rUO!uVO!yWO!{XO#S,wO#UiO~O#W!mO~ORTOSfOTfOVSOWSO!ogO!pRO!rUO!uVO!yWO!{XO#S+{O#UiO~OR!oOSfOTfOVSOWSO!ogO!pRO!rUO!uVO!yWO!{XO#S*tO#UiO~OR!qOW!qO~ORSOSfOTfOVSOWSO!ogO!pRO!r!eO!u!sO!{!tO#R!rO~OR!wO~OV!xO~OR!yO~OR!zO~OV!{O~O!t#OO~P$SO!hxO!sxO!t#OO~O!w!RO!x#SO~P$SO!hxO!sxO!x#SO~OR#VO~O!w!RO!z#XO~P$SO!hxO!sxO!z#XO~O!z#]O~P&VO#W]O#XjO#^kO#alO#bmO#enO#goO~P*mO!hxO!sxO!z#]O~O!hxO!sxO!t#dO#R#bO~P*mO!pRO!r!]O!h_a!i_a!s_a!t_a!x_a!z_a#Y_a#__a#c_a#T_a#Z_a~O!hPO!iPO!z#jO~O!hPO!iPOR!jaS!jaT!jaV!jaW!ja!d!ja!o!ja!p!ja!r!ja!u!ja!y!ja!{!ja#S!ja#U!ja#W!ja#X!ja#[!ja#^!ja#a!ja#b!ja#e!ja#g!ja#i!ja#k!ja#m!ja#n!ja#o!ja~O!hxO!sxO!t#nO!w#pO~P.mO#T#qO~O!r!eO#W#rO~O!h#uO#Y#wO~O#_#yO~O!hPO!iPO#R#bO#Z#|O~P+oO!h#uO#c$PO~O!p#OX!r#OX#f!nX!h!nX#c!nX~O#f$SO~O#W]O~OR$UO#]aX!haX!saX!taX!xaX#TaX!zaX~O!hxO!sxO!w#pO!x$WO~P.mOR$]O!hxO!pRO!sxO!w#pO~O!z$aO~P8mO#]$cO~O#]$dO~O#l$eO~O#W$fO~O!hxO!sxO!t$jO~O!t$jO~P$SO!hxO!sxO!x$oO~O!w!RO!x$oO~P$SO!hxO!sxO!z$tO~O!w!RO!z$tO~P$SO!hxO!sxO!z$wO~O!z$wO~P&VO!hxO!sxO!t$zO#R#bO~P*mO!hxO!sxO!t$zO~O!hPO!iPO!z%QO~O!z%QO~P&wO!hxO!sxO!t%VO!w#pO~P.mO!hxO!sxO!t%VO~OR%[O#R!rO~O!hPO!iPO!r!eO~O!h#uO#Y%aO~O#]%cO~O#W%fO#Z#|O~P.mO#T%iO~O!hPO!iPO!z%lO~O!h#uO#c%mO~OR%nO!pRO#S+{O~O#c$PO!hti!iti!sti!tti!xti!zti#Zti#Yti~O!pRO!r!]O#f_a!h_a#c_a~O!hxO!sxO!w#pO!x%sO~P.mO!hxO!sxO!x%sO~O!z%{O~P8mO!hxO!sxO!z%{O~OR$]O!pRO!w#pO~O!h#uO#W]O#XjO#^kO#alO#bmO#enO#goO~P*mOR&UO~OR!WO!pRO!s&VO~O!t&YO~P$SO!hxO!sxO!t&YO~O!w!RO!x&]O~P$SO!hxO!sxO!x&]O~O!w!RO!z&`O~P$SO!hxO!sxO!z&`O~O!z&bO~P&VO!hxO!sxO!z&bO~O!hxO!sxO!t&gO~O!hxO!sxO!t&gO#R#bO~P*mO!z&jO~P&wO!hPO!iPO!z&jO~O!hxO!sxO!t&nO~O!hxO!sxOR!YaS!YaT!YaV!YaW!Ya!o!Ya!p!Ya!r!Ya!u!Ya!w!Ya!{!Ya#R!Ya~O!t&nO~PDlO!hPO!iPO!z&vO~O!h#uO#Z&yO~O#T&{O~O!hPO!iPO#Z#|O~P.mO!hPO!iPO!z'QO~O!h#uO~P(mO!hPO!iPO!z'QO#R#bO#Z#|O~P+oO!h#dX!i#dX!p#OX!r#OX#c#dX!s#dX!t#dX!x#dX!z#dX#Z#dX#Y#dX#_#dX#T#dX~O!hxO!sxO!x'XO~O!x'XO~PDlO!hxO!sxO!z'^O~O!hxO!sxOR!Za!p!Za!w!Za~O!z'^O~PHwO!s&VO!z'hO~O!t'iO~P$SO!w!RO!x'jO~P$SO!w!RO~P$SO!w!RO!z'kO~P$SO!z'lO~P&VO!hxO!sxO!t'mO#R#bO~P*mO!hxO!sxO!t'mO~O!z'pO~P&wO!t'qO~PDlO!hxO!sxO!t'qO~O!hxO!sxO~O!hPO!iPO!z'wO~O!hPO!iPO!r!eO!z'wO~O!h#uO#Z'{O~O!h#uO#Y(OO~O!hPO!iPO!z(UO~O!hPO!iPO!z(VO#R#bO#Z#|O~P+oO!hPO!iPO!z(VO~O!x(ZO~PDlO!hxO!sxO!x(ZO~O!z(^O~PHwO!hxO!sxO!z(^O~O!s&VO!z(dO~OR!WO!pRO!s&VO!z(dO~O!hxO!sxO!t(gO#R#bO~P*mO!hxO!sxO#R#bO~P*mO!t(hO~PDlO!hxO!sxO!t(hO~O!hPO!iPO!r!eO!z(iO~O!hPO!iPO!z(iO~O!h#uO#Z(lO~O!h#uO#Y(nO~O!hPO!iPO!z(sO~O!hPO!iPO!z(sO#Z#|O~P.mO!hPO!iPO!z(vO#R#bO#Z#|O~P+oO!x(yO~PDlO!hxO!sxO!x(yO~O!z(zO~PHwO!hxO!sxO!z(zO~OR!WO!pRO!s&VO!z({O~O!hPO!iPO!r!eO!z)OO~O!h#uO#Z)SO~O!hPO!iPO!z)TO#Z#|O~P.mO!hPO!iPO!z)TO~O!h#uO#c)eO#fti~OR!WO!pRO!s&VO!z)XO~O!h#uO#Z)ZO~O!hPO!iPO!z)]O#Z#|O~P.mO!h#dX!p#OX!r#OX#c#dX#f#dX~O!h#uO#Z)^O~O!h#uO#c)eO~OR!oOSfOTfOVSOWSO!ogO!pRO!rUO!uVO!yWO!{XO#S*pO#UiO#W]O#X,rO#[*rO#^,sO#alO#b)tO#e+xO#goO#i*sO~OR)WO!pRO#S,jO~O!h#uO#c$PO#_ti!sti!zti#Tti~O!h#uO#W]O#X,rO#^,sO#alO#b)tO#e+xO#goO~P-jO!h#uO~P!'mO#T)dO~O#])gO~O#])hO~ORTOSfOTfOVSOWSO!ogO!pRO!rUO!uVO!yWO!{XO#S+wO#UiO#W]O#X-[O#[+yO#^-]O#alO#b)sO#e,tO#goO#i+zO~O!h#uO#c)iO~O!h#uO#W]O#X-[O#^-]O#alO#b)sO#e,tO#goO~P,oO!h#uO#Z)kO~O#T)lO~O!h#uO#Z)mO~O!h#uO~P!*xO!h#uO#Z)oO~O!h#uO#Z)pO~O!h#uO#Z)qO~O!h#uO#Z)rO~OR!oOSfOTfOVSOWSO!ogO!pRO!rUO!uVO!yWO!{XO#S,gO#UiO#W]O#X-fO#[,hO#^-gO#alO#b+hO#e-UO#goO#i,iO~OR!oOSfOTfOVSOWSO!h#uO!ogO!pRO!rUO!uVO!yWO!{XO#S,jO#UiO#W]O#X-fO#^-gO#alO#b+hO#e-UO#goO~O!h#uO~P!.dOR)vO!r!eO~OR)yO~O#W]O#X-iO#^-jO#alO#b*qO#e-^O#goO~P+oO#T)zO~O#f)|O~O#])}O~O#]*OO~ORTOSfOTfOVSOWSO!ogO!pRO!rUO!uVO!yWO!{XO#S,qO#UiO#W]O#X-iO#[,uO#^-jO#alO#b*qO#e-^O#goO#i,vO~O!h#uO#W]O#X-iO#^-jO#alO#b*qO#e-^O#goO~P+oO!h#uO#Z*UO~O#T*VO~O!h#uO#Z*XO~O!h#uO~P!2rO!h#uO#Z*ZO~O!h#uO#Z*_O~O!h#uO#Z*aO~O!h#uO#Z*bO~O#T*dO~O#]*eO~O#]*fO~O!h#uO#Z*hO~O#T*iO~O!h#uO#Z*jO~O!h#uO#Z*lO~O!h#uO#Z*mO~O!h#uO#Z*nO~O!h#uO#Z*oO~OR*wO!r!eO~OR*zO~O#T*{O~O!h#uO#Y*|O~O#_*}O~O#f+OO~O#]+PO~O#]+QO~O!h#uO#Y+RO~O!h#uO#Z+XO~O#T+YO~O!h#uO#Z+[O~O!h#uO#Y+]O~O!h#uO#Z+_O~O!h#uO#Y+`O~O!h#uO#Z+dO~O!h#uO#Z+fO~O!h#uO#Z+gO~OR+jO!r!eO~OR+lO~O#f+mO~OR+}O!r!eO~O#[-kO~P*mOR,SO~O!h#uO#Y,UO~O#_,VO~O#f,WO~O!h#uO#Y,XO~O!h#uO#Y,aO~O!h#uO#Y,bO~O!h#uO#Y,lO~O#_,mO~O!h#uO#Y,nO~O!h#uO#Y,oO~O!h#uO#Y,pO~O#[-oO~P*mO!h#uO#Y,|O~O#_,}O~O!h#uO#Y-OO~O#]-PO~O!h#uO#Y-SO~O!h#uO#Y-TO~O#[-qO~P*mO#[-rO~P*mO#]-cO~O#]-hO~O#]-mO~O", + goto: "!>j#kPP#lPPP#lPP'h,^,^/j,^,^0P3c3l0P4q5i7P8m9_9}8m:r:|>Y@r@r@rCXCl@rDZ@r@rDg@rDuDuDuDuFlFlFlFlFqHgHnLmLwMZMeMoMyN]NgNq!$l!$v!%Q!%d!%n!&SPPPPPP!&^!&c!)r!,i!0}PP:|PPPP!4{PPPPP!5b!5n!6S!9f!9lPPPP!9xPPPPPPPP!<_PPP!e(sSOQUVW]ejkmnpy}!S!X!]!a!e!k!m!s!{#P#T#Y#a#h#k#m#q#w#y#z$V$Z$^$c$d$h$m$r$|%O%U%a%c%f%i%j%v&R&Z&[&^&_&a&e&k&l&y&{&|'O'R'n'o'{(O(P(S(W(Y(l(n(q)S)U)V)Z)^)d)g)h)j)k)l)m)n)o)p)q)r)s)t)z)}*O*R*U*V*X*Y*Z*_*a*b*d*e*f*g*h*i*j*k*l*m*n*o*q*r*u*{*|*}+P+Q+R+U+X+Y+[+]+^+_+`+d+f+g+h+x+y,U,V,X,a,b,h,l,m,n,o,p,r,s,t,u,|,}-O-P-S-T-U-[-]-^-c-f-g-h-i-j-k-m-o-q-r!^Sp!e!k!s#k#m#y$V$Z$^%U%f%v&|(S(q)U)V*r*}+y,V,h,m,u,}-k-o-q-r&WTOQUVW]ejkmy}!S!X!]!a!m!{#P#T#Y#a#h#q#w#z$c$d$h$m$r$|%O%a%c%i%j&R&Z&[&^&_&a&e&k&l&y&{'O'R'n'o'{(O(P(W(Y(l(n)S)Z)^)s)t)z)}*O*R*U*V*X*Y*Z*_*a*b*q*u*{*|+P+Q+R+U+X+Y+[+]+^+_+`+d+f+g+h,U,X,a,b,l,n,o,p,r,s,|-O-P-S-T-[-]-c-f-g-h-i-j-m[!XX!V#_$u&c&dW!^Z!`$R)a![!on)d)g)h)j)k)l)m)n)o)p)q)r*d*e*f*g*h*i*j*k*l*m*n*o+x,t-U-^W$^!t$[$`%zS%n$P%mS)W)e)i]*u$f&W'f(b(|(}'eYOQUVW]ejkmny}!S!X!]!a!m!{#P#T#Y#a#h#q#w#z$c$d$h$m$r$|%O%a%c%i%j&R&Z&[&^&_&a&e&k&l&y&{'O'R'n'o'{(O(P(W(Y(l(n)S)Z)^)d)g)h)j)k)l)m)n)o)p)q)r)s)t)z)}*O*R*U*V*X*Y*Z*_*a*b*d*e*f*g*h*i*j*k*l*m*n*o*q*u*{*|+P+Q+R+U+X+Y+[+]+^+_+`+d+f+g+h+x,U,X,a,b,l,n,o,p,r,s,t,|-O-P-S-T-U-[-]-^-c-f-g-h-i-j-mf!OVW}!S#T#Y$m$r&^&_&a]!YX!V#_$u&c&d'd[OQUVW]ejkmny}!S!X!]!a!m!{#P#T#Y#a#h#q#w#z$c$d$h$m$r$|%O%a%c%i%j&R&Z&[&^&_&a&e&k&l&y&{'O'R'n'o'{(O(P(W(Y(l(n)S)Z)^)d)g)h)j)k)l)m)n)o)p)q)r)s)t)z)}*O*R*U*V*X*Y*Z*_*a*b*d*e*f*g*h*i*j*k*l*m*n*o*q*u*{*|+P+Q+R+U+X+Y+[+]+^+_+`+d+f+g+h+x,U,X,a,b,l,n,o,p,r,s,t,|-O-P-S-T-U-[-]-^-c-f-g-h-i-j-mX%o$P%m)e)iW!^Z!`$R)aR!ii!^!up!e!k!s#k#m#y$V$Z$^%U%f%v&|(S(q)U)V*r*}+y,V,h,m,u,}-k-o-q-r[#c!]#a$|&e'n'o[#{!m#z%j'O(W(YR%[#pd!gh|*p*t+w+{,g,j,q,wY#s!h)v*w+j+}Q%_#rY%r$S)|+O+m,WQ&s%^X'x&t'u(j(kd!fh|!h#r$S%^&t'u(j(k!^!up!e!k!s#k#m#y$V$Z$^%U%f%v&|(S(q)U)V*r*}+y,V,h,m,u,}-k-o-q-rW)u)v)|*p*tW*v*w+O+w+{W+i+j+m,g,jX+|+},W,q,wQ!vpQ#l!eQ#x!kQ$X!sS%T#k#m^%d#y%f&|(S(q)U)VS%t$V$ZQ%}$^Q&o%UQ'Z%vQ)x*rQ*Q*}Q*y+yQ+T,VQ+k,hQ+o,mQ,R,uQ,Z,}Q-b-kQ-l-oQ-n-qR-p-r!_!up!e!k!s#k#m#y$V$Z$^%U%f%v&|(S(q)U)V*r*}+y,V,h,m,u,}-k-o-q-rQ#o!eQ$Y!sQ$b!tS%W#k#mS%u$V$ZS%|$[$`Q&p%UQ'[%vR'`%z!^!up!e!k!s#k#m#y$V$Z$^%U%f%v&|(S(q)U)V*r*}+y,V,h,m,u,}-k-o-q-rR%[#pQ$_!tS%y$[$`R'_%z'e[OQUVW]ejkmny}!S!X!]!a!m!{#P#T#Y#a#h#q#w#z$c$d$h$m$r$|%O%a%c%i%j&R&Z&[&^&_&a&e&k&l&y&{'O'R'n'o'{(O(P(W(Y(l(n)S)Z)^)d)g)h)j)k)l)m)n)o)p)q)r)s)t)z)}*O*R*U*V*X*Y*Z*_*a*b*d*e*f*g*h*i*j*k*l*m*n*o*q*u*{*|+P+Q+R+U+X+Y+[+]+^+_+`+d+f+g+h+x,U,X,a,b,l,n,o,p,r,s,t,|-O-P-S-T-U-[-]-^-c-f-g-h-i-j-m%v^OQUVW]ey}!S!X!a!{#P#T#Y#h#q#w$c$d$h$m$r%O%a%i&R&Z&[&^&_&a&k&l&y&{'R'{(O(P(l(n)S)Z)^)d)g)h)j)k)l)m)n)o)p)q)r)z)}*O*R*U*V*X*Y*Z*_*a*b*d*e*f*g*h*i*j*k*l*m*n*o*u*{*|+P+Q+R+U+X+Y+[+]+^+_+`+d+f+g,U,X,a,b,l,n,o,p,|-O-S-TR$T!q%w^OQUVW]ey}!S!X!a!{#P#T#Y#h#q#w$c$d$h$m$r%O%a%i&R&Z&[&^&_&a&k&l&y&{'R'{(O(P(l(n)S)Z)^)d)g)h)j)k)l)m)n)o)p)q)r)z)}*O*R*U*V*X*Y*Z*_*a*b*d*e*f*g*h*i*j*k*l*m*n*o*u*{*|+P+Q+R+U+X+Y+[+]+^+_+`+d+f+g,U,X,a,b,l,n,o,p,|-O-S-TY%e#y*},V,m,}Q&}%fQ(R&|X(t(S(q)U)V[#{!m#z%j'O(W(Y^%d#y%f&|(S(q)U)VQ*Q*}Q+T,VQ+o,mR,Z,}Q#}!mQ%h#zX'T%j'O(W(YY#t!h)v*w+j+}Z%r$S)|+O+m,W$i`OQ]e!a#h#q#w$d%O%a%i&k&l&y&{'R'{(O(P(l(n)S)Z)^)d)h)k)l)m)n)o)p)q)r)z*O*U*V*X*Y*Z*_*a*b*d*f*h*i*j*k*l*m*n*o*{*|+Q+R+X+Y+[+]+^+_+`+d+f+g,U,X,a,b,l,n,o,p,|-O-S-TVbOQeQQO|vQ!a!c#h#z%O%^%j&k&l&t&|'O'u(S(W(Y(j(k(q)U)VQ!a]Q!ccQ#h!bQ#z!mS%O#g#iQ%^#rQ%j#}Q&k%PQ&t%_Q&|%fS'O%h%kS'u&s&uQ(S&}Q(W'PQ(j'vS(q(R(TR)U(rSeOQR!deQyUQ}VQ!SWQ!VX#Q!|y}!S!V#P#T#Y#_#a#k$V$[$h$m$r$u$|%X%Z%w%x&O&Q&Z&[&^&_&a&c&d&e&m&q'W'Y']'a'n'o'r's't([(](_(`(aQ#PzQ#T!PQ#Y!TQ#_!ZQ#a!]Q#k!eQ$V!sQ$[!tS$h!}#QS$m#R#US$r#W#ZS$u#[#`Q$|#eQ%X#lQ%Z#oQ%w$XQ%x$YQ&O$_Q&Q$bQ&Z$iQ&^$nQ&a$sQ&c$vS&e${$}Q&m%TQ&q%WQ'W%tQ'Y%uQ']%yQ'a%|Q'n&fQ'r&oQ's&pQ't&rQ(['ZQ(]'[Q(_'_Q(`'`R(a'bQ#QzQ$i!}T$l#Q$iQ#U!PQ#Z!TQ$n#RW$q#U#Z$n$sR$s#WQ#`!ZQ$v#[T$y#`$vQ!`ZS#f!`$RR$R)aQ$}#eQ&f${T&i$}&fQ#m!eQ$Z!sQ%U#kW%Y#m$Z%U%vR%v$VQ$`!tQ%z$[T&P$`%zQ#i!bQ%P#gT%S#i%PQ#v!jW$O!n)b)f)w!x%`#v$O&R&x'R'z'}(P)R)Y)j)n){*R*T*W*Y*^*`*g*k+U+W+Z+^+c+e+q+r+u+v,T,],_,`,e,f,{-R-X-Z-a-eQ&R$cQ&x%bQ'R%iQ'z&wQ'}&zQ(P&{Q)R(oQ)Y)QQ)j)gQ)n)lU){(x)c*cQ*R)}Q*T*PQ*W*SQ*Y*VQ*^*[Q*`*]Q*g*eQ*k*iQ+U+PQ+W+SQ+Z+VQ+^+YQ+c+aQ+e+bQ+q+nQ+r+pQ+u+sQ+v+tQ,T,OQ,],YQ,_,[Q,`,^Q,e,cQ,f,dQ,{,xQ-R-QQ-X-VQ-Z-YQ-a-_R-e-dQ(T&}Q(r(RT(u(T(rQ%k#}Q'P%hT'U%k'PQ$Q!nU%q$Q(x)fS(w)b*cQ(x)cR)f)wQ&u%_Q'v&sT'y&u'vQ&W$fY'd&W'f(b(|(}Q'f&XS(b'e'gR(|(cQ'g&XQ(c'eT(f'g(cVdOQeUcOQeQ!b]Q#g!aW%R#h%O&k&lY%]#q)d)z*d*{Q%b#wY&T$d)h*O*f+QQ&w%aQ'S%iY'|&y)k*U*h+XY(Q&{)l*V*i+YQ(X'RY(m'{)m*X*j+[Q(o(OY(p(P)n*Y*k+^Y)P(l)o*Z*l+_Q)Q(nY)[)S)p*_*m+dY)_)Z)q*a*n+fY)`)^)r*b*o+gQ*P*|Q*S+RQ*[+]Q*]+`Q+S,UQ+V,XQ+a,aQ+b,bQ+n,lQ+p,nQ+s,oQ+t,pQ,Y,|Q,[-OQ,c-SR,d-T$haOQ]e!a#h#q#w$d%O%a%i&k&l&y&{'R'{(O(P(l(n)S)Z)^)d)h)k)l)m)n)o)p)q)r)z*O*U*V*X*Y*Z*_*a*b*d*f*h*i*j*k*l*m*n*o*{*|+Q+R+X+Y+[+]+^+_+`+d+f+g,U,X,a,b,l,n,o,p,|-O-S-TQzUf!OVW}!S#T#Y$m$r&^&_&aQ!}yS#^!X*uQ$g!{W$k#P$h&Z&[Y&S$c)g)}*e+PZ'c&R)j*R*g+U%v_OQUVW]ey}!S!X!a!{#P#T#Y#h#q#w$c$d$h$m$r%O%a%i&R&Z&[&^&_&a&k&l&y&{'R'{(O(P(l(n)S)Z)^)d)g)h)j)k)l)m)n)o)p)q)r)z)}*O*R*U*V*X*Y*Z*_*a*b*d*e*f*g*h*i*j*k*l*m*n*o*u*{*|+P+Q+R+U+X+Y+[+]+^+_+`+d+f+g,U,X,a,b,l,n,o,p,|-O-S-TQ!jjQ!lkQ!nmQ!pn[#c!]#a$|&e'n'o[#{!m#z%j'O(W(YQ&z%cQ)b)sQ)c)tQ)w*qQ*c+hQ*x+xQ,O,rQ,P,sQ,Q,tQ,^-PQ,k-UQ,x-[Q,y-]Q,z-^Q-Q-cQ-V-fQ-W-gQ-Y-hQ-_-iQ-`-jR-d-m'd[OQUVW]ejkmny}!S!X!]!a!m!{#P#T#Y#a#h#q#w#z$c$d$h$m$r$|%O%a%c%i%j&R&Z&[&^&_&a&e&k&l&y&{'O'R'n'o'{(O(P(W(Y(l(n)S)Z)^)d)g)h)j)k)l)m)n)o)p)q)r)s)t)z)}*O*R*U*V*X*Y*Z*_*a*b*d*e*f*g*h*i*j*k*l*m*n*o*q*u*{*|+P+Q+R+U+X+Y+[+]+^+_+`+d+f+g+h+x,U,X,a,b,l,n,o,p,r,s,t,|-O-P-S-T-U-[-]-^-c-f-g-h-i-j-m!_!up!e!k!s#k#m#y$V$Z$^%U%f%v&|(S(q)U)V*r*}+y,V,h,m,u,}-k-o-q-rQ!PVQ!TWQ#R}Q#W!S_$p#T#Y$m$r&^&_&aQ!ZXQ#[!VX$x#_$u&c&d[!YX!V#_$u&c&dQ&X$fQ'e&WX(e'f(b(|(}&[ZOQUVW]ejkmy}!S!X!]!a!m!{#P#T#Y#a#h#q#w#z$P$c$d$h$m$r$|%O%a%c%i%j%m&R&Z&[&^&_&a&e&k&l&y&{'O'R'n'o'{(O(P(W(Y(l(n)S)Z)^)s)t)z)}*O*R*U*V*X*Y*Z*_*a*b*q*u*{*|+P+Q+R+U+X+Y+[+]+^+_+`+d+f+g+h,U,X,a,b,l,n,o,p,r,s,|-O-P-S-T-[-]-c-f-g-h-i-j-m!a)an)d)e)g)h)i)j)k)l)m)n)o)p)q)r*d*e*f*g*h*i*j*k*l*m*n*o+x,t-U-^X!_Z!`$R)aQ#e!]Q${#aX&h$|&e'n'o%w_OQUVW]ey}!S!X!a!{#P#T#Y#h#q#w$c$d$h$m$r%O%a%i&R&Z&[&^&_&a&k&l&y&{'R'{(O(P(l(n)S)Z)^)d)g)h)j)k)l)m)n)o)p)q)r)z)}*O*R*U*V*X*Y*Z*_*a*b*d*e*f*g*h*i*j*k*l*m*n*o*u*{*|+P+Q+R+U+X+Y+[+]+^+_+`+d+f+g,U,X,a,b,l,n,o,p,|-O-S-TZ%g#y*},V,m,}S%p$P)eT'V%m)i$iaOQ]e!a#h#q#w$d%O%a%i&k&l&y&{'R'{(O(P(l(n)S)Z)^)d)h)k)l)m)n)o)p)q)r)z*O*U*V*X*Y*Z*_*a*b*d*f*h*i*j*k*l*m*n*o*{*|+Q+R+X+Y+[+]+^+_+`+d+f+g,U,X,a,b,l,n,o,p,|-O-S-TVcOQe", + nodeNames: "⚠ Script Boolean Word true false Nil String Number Keyword Tuple List Splat Set Dict Synthetic Args Placeholder Fn_Lambda Fn_Clause Tuple_Pattern Pattern List_Pattern Splattern Ignored Dict_Pattern Assoc_Pattern Recur Block If If_Let Match Match_Clause Else When When_Clause Do Loop Fn_Clauses Repeat Let Ref Fn_Named Fn_Compound Import Use Ns Test", + maxTerm: 123, + skippedNodes: [0], + repeatNodeCount: 18, + tokenData: "+w~RkXY!vYZ#U]^!vpq!vrs#Zst$wtu%Svw%_xy%vyz%{|}&Q}!O&V!O!P'Z!Q!R&c!R![&y![!]'l!]!^'q!_!`'v!`!a'{!}#O(Q#P#Q(V#R#S([#T#k(a#k#l({#l#o(a#o#p+m#q#r+r~!{R!f~XY!v]^!vpq!v~#ZO!h~~#^VOr#Zrs#ss#O#Z#O#P#x#P;'S#Z;'S;=`$q<%lO#Z~#xOV~~#{RO;'S#Z;'S;=`$U;=`O#Z~$XWOr#Zrs#ss#O#Z#O#P#x#P;'S#Z;'S;=`$q;=`<%l#Z<%lO#Z~$tP;=`<%l#Z~$zP#o#p$}~%SO!{~~%VP#o#p%Y~%_O!y~~%dS!g~OY%_Z;'S%_;'S;=`%p<%lO%_~%sP;=`<%l%_~%{O!r~~&QO!t~~&VO!s~~&YR!Q!R&c!R![&y!`!a'U~&hPW~!O!P&k~&nP!Q![&q~&vPW~!Q![&q~'OQW~!O!P&k!Q![&y~'ZO#T~~'^P!O!P'a~'dP!O!P'g~'lO!w~~'qO!p~~'vO!i~~'{O#]~~(QO#c~~(VO!u~~([O!x~~(aO#R~P(fVRPqr(a}!O(a!P!Q(a!a!b(a!c!}(a#R#S(a#T#o(aR)QXRPqr(a}!O(a!P!Q(a!a!b(a!c!}(a#R#S(a#T#](a#]#^)m#^#o(aR)rXRPqr(a}!O(a!P!Q(a!a!b(a!c!}(a#R#S(a#T#h(a#h#i*_#i#o(aR*dXRPqr(a}!O(a!P!Q(a!a!b(a!c!}(a#R#S(a#T#[(a#[#]+P#]#o(aR+WV#fQRPqr(a}!O(a!P!Q(a!a!b(a!c!}(a#R#S(a#T#o(a~+rO#W~~+wO!z~", + tokenizers: [0, 1], + topRules: {"Script":[0,1]}, + specialized: [{term: 3, get: (value) => spec_Word[value] || -1}], + tokenPrec: 0 +}) diff --git a/ludus.terms.js b/ludus.terms.js new file mode 100644 index 0000000..149f3fa --- /dev/null +++ b/ludus.terms.js @@ -0,0 +1,47 @@ +// This file was generated by lezer-generator. You probably shouldn't edit it. +export const + Script = 1, + Boolean = 2, + Word = 3, + Nil = 6, + String = 7, + Number = 8, + Keyword = 9, + Tuple = 10, + List = 11, + Splat = 12, + Set = 13, + Dict = 14, + Synthetic = 15, + Args = 16, + Placeholder = 17, + Fn_Lambda = 18, + Fn_Clause = 19, + Tuple_Pattern = 20, + Pattern = 21, + List_Pattern = 22, + Splattern = 23, + Ignored = 24, + Dict_Pattern = 25, + Assoc_Pattern = 26, + Recur = 27, + Block = 28, + If = 29, + If_Let = 30, + Match = 31, + Match_Clause = 32, + Else = 33, + When = 34, + When_Clause = 35, + Do = 36, + Loop = 37, + Fn_Clauses = 38, + Repeat = 39, + Let = 40, + Ref = 41, + Fn_Named = 42, + Fn_Compound = 43, + Import = 44, + Use = 45, + Ns = 46, + Test = 47