diff --git a/ludus.grammar b/ludus.grammar index dd7a74c..83ced55 100644 --- a/ludus.grammar +++ b/ludus.grammar @@ -2,19 +2,321 @@ @skip { space | comment } -line { expression terminator+ } +line { (expression | toplevel) terminator+ } -expression { Boolean | Nil | String | Number } +toplevel { + Import + | Use + | Ns +} + +Import { + skw<"import"> + String + skw<"as"> + Word +} + +Use { skw<"use"> Word } + +Ns { + skw<"ns"> Word "{" + separator* + assoc_term (separator+ assoc_term)* + separator* + "}" +} + +expression { non_binding | binding } + +binding { Let | Ref | Fn_Named | Fn_Compound } + +Ref { skw<"ref"> Word "=" expression } + +non_binding { simple | complex } + +synth_root { Word | Keyword } + +synth_term { Args | Keyword } + +arg_term { Placeholder | expression } + +Args { + ("(" separator* ")") + | ("(" + separator* + arg_term (separator+ arg_term)* + separator* + ")") +} + +Synthetic { synth_root synth_term+ } + +complex { + Block + | If + | If_Let + | Match + | When + //| Do + //| Bind + | Loop + | Repeat + | Each +} + +Repeat { skw<"repeat"> (Word | Number) Block } + +Each { skw<"each"> simple "do" (Fn_Clause | Fn_Clauses) } + +Recur { skw<"recur"> Args } + +Loop { skw<"loop"> simple "with" (Fn_Clause | Fn_Clauses) } + +simple { atom | collection | Synthetic | Fn_Lambda | Recur } + +Fn_Clause { Tuple_Pattern "->" non_binding } + +Fn_Clauses { + "{" + terminator* + Fn_Clause (terminator+ Fn_Clause)* + terminator* + "}" +} + +Fn_Compound { skw<"fn"> Word Fn_Clauses } + +Fn_Named { + skw<"fn"> Word Fn_Clause +} + +Fn_Lambda { skw<"fn"> Fn_Clause } + +// TODO: figure out precedence with do/bind exprs +// do_expr { Fn_Lambda | Synthetic | Word | Keyword } + +// Do { +// skw<"do"> simple (~ambig newline* ">" do_expr)+ +// } + +// Bind { +// skw<"bind"> +// simple +// (!pipeline pipeline)+ +// } + +Pattern { + Tuple_Pattern + | List_Pattern + | Dict_Pattern + | Struct_Pattern + | atom + | Placeholder +} + +Placeholder { "_" } + +ellipsis { "..." } + +Splattern { ellipsis (Word | Placeholder) } + +Tuple_Pattern { + ("(" separator* ")") + | ("(" + separator* + (Pattern separator+)* (Pattern | Splattern) + separator* + ")") +} + +List_Pattern { + ("[" separator* "]") + | ("[" + separator* + (Pattern separator+)* (Pattern | Splattern) + separator* + "]") +} + +Assoc_Pattern { + Word + | (Keyword Pattern) +} + +Dict_Pattern { + ("#{" separator* "}") + | ("#{" + separator* + (Assoc_Pattern separator+)* (Assoc_Pattern | Splattern) + separator* + "}") +} + +Struct_Pattern { + ("@{" separator* "}") + | ("@{" + separator* + (Assoc_Pattern separator+)* (Assoc_Pattern | Splattern) + separator* + "}") +} + +Let { + skw<"let"> + Pattern + "=" + non_binding +} + +Else { skw<"else"> } + +Match_Clause {(Pattern | Else) "->" newline* expression} + +match_body { + Match_Clause + | ( + "{" + terminator* + Match_Clause (terminator+ Match_Clause)* + terminator* + "}" + ) +} + +Match { + skw<"match"> + simple + skw<"with"> + match_body +} + +When_Clause { + (simple | Placeholder | Else) "->" newline* expression +} + +When { + skw<"when"> "{" + terminator* + When_Clause (terminator+ When_Clause)* + terminator* + "}" +} + +If { + skw<"if"> simple newline* + skw<"then"> expression ~ambig newline* + skw<"else"> expression +} + +If_Let { + skw<"if"> skw<"let"> + Pattern "=" simple + skw<"then"> expression newline* + skw<"else"> expression +} + +Block { + "{" + terminator* + expression (terminator+ expression)* + terminator* + "}" +} + +collection { + Tuple + | List + | Set + | Dict + | Struct +} + +Tuple { + ( "(" // non-empty + separator* + non_binding (separator+ non_binding)* + separator* + ")" ) + | "(" separator* ")" // empty +} + +Splat { ellipsis Word } + +linear_term { Splat | non_binding } + +List { + ("[" + separator* + linear_term (separator+ linear_term)* + separator* + "]" ) + | "[" separator* "]" +} + +Set { + ("${" + separator* + linear_term (separator+ linear_term)* + separator* + "}") + | "${" separator* "}" +} + +assoc_term { + Word + | (Keyword non_binding) +} + +dict_term { + assoc_term + | Splat +} + +Dict { + ("#{" + separator* + dict_term (separator+ dict_term)* + separator* + "}" ) + | "#{" separator* "}" +} + +Struct { + ("@{" + separator* + assoc_term (separator+ assoc_term)* + separator* + "}") + | "@{" separator* "}" +} + +atom { Boolean | Nil | String | Number | Keyword | Word } + +kw { @specialize[@name={term}] } + +skw { @specialize } + +Keyword { ":" Word } + +Boolean { + kw<"true"> + | kw<"false"> +} + +Nil { + skw<"nil"> +} @tokens { + Word { $[a-z] $[a-zA-Z_\-?/!]* } space { $[ \t\r]+ } comment { "&" ![\n]* } - Boolean { "true" | "false" } - Nil { "nil" } String { '"' (!["\\] | "\\" _)* '"' } - int { $[1-9]$[0-9]* } - float { ("0" | int ) $[0.9]+} - Number { int | float } + int { $[1-9]$[0-9]* | "0" } + float { ("0" | int ) "." $[0-9]+} + Number { "-"? (int | float) } separator { $[,\n] } terminator { $[;\n] } + newline { "\n" } } diff --git a/parser.js b/parser.js index 76de141..a449117 100644 --- a/parser.js +++ b/parser.js @@ -1,16 +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:148, fn:188, recur:192, if:198, then:202, else:204, let:206, match:210, with:212, when:216, loop:218, repeat:222, each:224, ref:230, import:234, as:236, use:238, ns:240} export const parser = LRParser.deserialize({ version: 14, - states: "!WOYQPOOOOQO'#Cb'#CbOYQPOOOOQO'#Ci'#CiQkQPOOOfQPO'#CcOOQO-E6`-E6`OOQO-E6a-E6aOyQPO,58}", - stateData: "!_~OYOSZOS~OQRORROSROTRO[PO~OQRORROSROTRO~O[POQVaRVaSVaTVaWVa~O", - goto: "u^PPPPPP_iPPPPPpQQOSUQWRWTSSOQRVSVTOQS", - nodeNames: "⚠ Script Boolean Nil String Number", - maxTerm: 13, + states: "!8nOYQPOOOOQO'#D^'#D^OYQPOOO#PQPO'#CeOOQO'#Dw'#DwO#UQPO'#DwO%TQQO'#CfO%[QQO'#CgO%fQQO'#CiO%pQQO'#CjO&RQQO'#CkOOQO'#Dz'#DzO&aQPO'#ClOOQO'#Dv'#DvO&iQPO'#CyOOQO'#Ea'#EaOOQO'#Du'#DuOOQO'#Er'#ErOOQO'#Dt'#DtOOQO'#Et'#EtO(VQPO'#DsOOQO'#D_'#D_Q)uQPOOOOQO'#C^'#C^OOQO'#Cb'#CbO*SQPO'#CoO&dQPO'#CxO+YQPO'#CzO+aQPO'#C|O,_QPO'#DPO,dQPO'#DRO-bQPO'#DTO,dQPO'#DUO-jQPO'#DVO.bQPO'#DWO.gQPO'#DZO.lQPO'#D[O.qQPO'#D]OOQO-E7[-E7[OOQO,59P,59PO.vQQO'#DwOOQO'#D`'#D`O/[QQO,59QO/cQQO,59QOOQO,59Q,59QO*VQPO'#CoO/kQQO,59ROOQO'#EP'#EPO/uQQO,59ROOQO,59R,59RO/}QPO'#ChO0SQQO,59TO0^QQO,59TOOQO,59T,59TO0fQQO,59UOOQO'#EW'#EWO0wQPO'#EWOOQO'#EV'#EVO2[QQO,59UOOQO,59U,59UO2dQQO,59VO2jQQO,59VOOQO,59V,59VO4cQQO'#CmOOQO'#EZ'#EZOOQO'#De'#DeO4jQPO,59WO&iQPO,59eO5RQPO,59eO5ZQPO,5:_OOQO-E7]-E7]O7TQQO'#CqO7bQPO'#CpOOQO,59Z,59ZO7gQPO,59sOOQO,59d,59dO7oQSO'#DwO8QQSO,59fO-jQPO,59gO8YQPO,59hO8_QPO,59kO8lQWO'#DwO8zQWO,59mO9PQPO,59oO9UQWO,59pOOQO'#Cn'#CnO9ZQQO'#CsO9hQQO'#CuO9yQQO'#CwOOQO'#Cr'#CrO:[QPO,59qO:aQPO,59rO:fQPO,59uOOQO,59v,59vO:kQPO,59wOOQO-E7^-E7^O:pQQO1G.lOOQO1G.l1G.lO:xQQO1G.lO:pQQO1G.lO;PQQO,59WO;eQQO1G.mOOQO1G.m1G.mO;mQQO1G.mO;eQQO1G.mOOQO,59S,59SO;wQQO1G.oOOQO1G.o1G.oOXQQO,59]O7ZQPO,59]OOQO,59],59]O>XQQO,59]O>aQPO'#CtO>iQPO,59[O?SQPO'#DSOOQO1G/_1G/_OOQO1G/`1G/`O?[QSO,59WOOQO'#Dj'#DjO?mQSO1G/QO?uQPO1G/QOA`QPO1G/ROAeQPO1G/SO8_QPO1G/VOAoQPO'#DQOOQO'#DO'#DOOAtQPO1G/VOA|QWO,59WO7gQPO1G/XOOQO1G/Z1G/ZO7gQPO1G/[OB[QQO,59_OOQO,59_,59_OBiQQO,59_OBiQQO,59_O7ZQPO,59_OBqQQO,59aOOQO'#Cv'#CvO-jQPO'#CvOCSQQO,59aOC[QPO,59aOOQO,59a,59aOCSQQO,59aOCgQQO,59cOCxQQO,59cOC[QPO,59cOOQO,59c,59cOCxQQO,59cO>iQPO1G/]O([QPO1G/^ODQQPO1G/aODVQQO1G/cODbQQO7+$WODiQQO7+$WOOQO7+$W7+$WOOQO,59{,59{OOQO-E7_-E7_ODqQQO7+$XOD{QQO7+$XOOQO7+$X7+$XOOQO,59|,59|OOQO-E7`-E7`OETQQO7+$ZOE_QQO7+$ZOOQO7+$Z7+$ZOEgQQO7+$[OExQQO7+$[OOQO7+$[7+$[OOQO,59},59}OOQO-E7a-E7aOFQQQO7+$]OFWQQO7+$]OOQO7+$]7+$]OOQO,5:O,5:OOOQO-E7b-E7bOOQO1G.s1G.sOF`QQO1G.sOFhQQO1G.sOF`QQO1G.sOFoQPO7+$kOFvQPO7+$kOOQO7+$k7+$kOOQO,5:T,5:TOOQO-E7g-E7gOGOQQO1G.wO7ZQPO1G.wOOQO1G.w1G.wOGOQQO1G.wOHUQQO1G.wOOQO-E7e-E7eOGOQQO1G.wOOQO,59`,59`OOQO1G.v1G.vO?SQPO,59nOH]QPO,59nOOQO-E7h-E7hO?uQPO7+$lOHeQSO7+$lO+aQPO7+$mOHmQPO'#C}OOQO'#Ek'#EkOHrQPO'#EkOOQO7+$n7+$nOH|QPO7+$qOIUQSO,59lOI]QPO7+$qOH|QPO7+$qOOQO7+$q7+$qOOQO7+$s7+$sOOQO7+$v7+$vOOQO1G.y1G.yOImQQO1G.yOImQQO1G.yO7ZQPO1G.yOIuQQO1G.yOImQQO1G.yOI|QQO1G.{OC[QPO1G.{OOQO1G.{1G.{OI|QQO1G.{OOQO,59b,59bOJUQQO1G.{OOQO-E7f-E7fOI|QQO1G.{OJgQQO1G.}OC[QPO1G.}OOQO1G.}1G.}OJgQQO1G.}OJoQQO1G.}OJgQQO1G.}OOQO7+$w7+$wOOQO7+$x7+$xOOQO7+${7+${ODVQQO7+$}OKQQQO7+$}OOQO<TO!&rQQOAN>TOOQOAN>TAN>TOOQOAN=eAN=eOOQOAN=iAN=iOOQO<Q>Q>Q>V?{@SEdEnFQF[FnGQG[GnHQH[JUJ`JjPPPPPJtJyMb! m!%QPP-qPPPP!(WPPPPP!(m!(yP!)h!,V!,aPPPP!,mPPPPPPPPP!.jPPPPPP!.pP!0R'TSOQUVW^fklnpqz!O!T!Y!a!e!i!p!r!x#U#Z#`#k#q#t#v#z$R$T$U$^$b$e$o$p$s$x$}%^%`%f%q%s%v%y%z&S&k&l&n&o&q&x'O'P'^'`'a'c'f(U(V(c(e(f(i(m(o)S)W)f)h)i)k)r)s)t)u)v)w)x)y)z){)|)}*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a+^+_+`+m+n+o+p+q+r+s+t+u+v+w+x+y+z+{+|+},O,],^,_,`,a,b,c,d,e,i,j,k!WSq!i!p!x#t#v$T$^$b$e%f%v&S'a(i)W)h)i+^+_+`+p+q+r,i,j,k!hTOQ^fl!e!r#q#z$U$o$p%`%s%y%z'O'P'^'`'c'f(c(f(m(o)S)f)k,`,a,b,c,d,e!fxUVWz!O!T!Y!a#U#Z#`#k$s$x$}%^&k&l&n&o&q&x(U(V)r)u)x){*O*R*U*X*[*_r!YXY!W!^#e#i$r%Q%V&h&s&t&v&w'{(z)b`!b[!d#W$O$Y)o)p)q!U!nk$R%q(e)s)v)y)|*P*S*V*Y*]*`+m+n+o+s+t+u+v+w+x,],^,_t!snp)t)w)z)}*Q*T*W*Z*^*a+y+z+{+|+},Oa$e!y!z$c$g$j$l&W&`%{ZOQUVW^fklnpz!O!T!Y!a!e!r#U#Z#`#k#q#z$R$U$o$p$s$x$}%^%`%q%s%y%z&k&l&n&o&q&x'O'P'^'`'c'f(U(V(c(e(f(m(o)S)f)k)r)s)t)u)v)w)x)y)z){)|)}*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a+m+n+o+s+t+u+v+w+x+y+z+{+|+},O,],^,_,`,a,b,c,d,ef!PVW!O!T#Z#`$x$}&n&o&q]!ZX!W#e%Q&s&t%{]OQUVW^fklnpz!O!T!Y!a!e!r#U#Z#`#k#q#z$R$U$o$p$s$x$}%^%`%q%s%y%z&k&l&n&o&q&x'O'P'^'`'c'f(U(V(c(e(f(m(o)S)f)k)r)s)t)u)v)w)x)y)z){)|)}*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a+m+n+o+s+t+u+v+w+x+y+z+{+|+},O,],^,_,`,a,b,c,d,e`!b[!d#W$O$Y)o)p)qR!mj!W!{q!i!p!x#t#v$T$^$b$e%f%v&S'a(i)W)h)i+^+_+`+p+q+r,i,j,k[#l!a#k%^&x(U(V[$V!r$U%z'c(m(oR%l#y`!ki}+Z+[+]+d+e+fW#|!l*e*f*gQ%o#{W%}$Z*n*o*pW&O$]*q*r*sQ'W%nX(`'X(])Q)Rf!ji!l#{$Z$]%n'X(])Q)R+e!W!{q!i!p!x#t#v$T$^$b$e%f%v&S'a(i)W)h)i+^+_+`+p+q+r,i,j,kY*b}*e*n*q+ZY*c*f*o*r+[+dZ*d*g*p*s+]+fQ!|qQ#u!iQ$S!pQ$`!xS%e#t#v^%t$T%v'a(i)W)h)iS&Q$^$bQ&Z$eQ'S%fQ'm&SQ*h+^Q*i+_Q*j+`Q*w+pQ*x+qQ*y+rQ,f,iQ,g,jR,h,k!X!{q!i!p!x#t#v$T$^$b$e%f%v&S'a(i)W)h)i+^+_+`+p+q+r,i,j,kQ#x!iQ$a!xQ$i!yQ$n!zS%h#t#vS&R$^$bS&Y$c$gS&b$j$lQ'T%fQ'n&SQ'r&WR'x&`Q$f!yQ$k!zS&V$c$gS&_$j$lQ'q&WR'w&`$t_OQUVW^fz!O!T!Y!a!e#U#Z#`#k#q#z$R$o$p$s$x$}%^%`%q%y&k&l&n&o&q&x'O'P'^'`'f(U(V(c(e(f)S)f)k)r)s)t)u)v)w)x)y)z){)|)}*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a+m+n+o+s+t+u+v+w+xR$[!u$u_OQUVW^fz!O!T!Y!a!e#U#Z#`#k#q#z$R$o$p$s$x$}%^%`%q%y&k&l&n&o&q&x'O'P'^'`'f(U(V(c(e(f)S)f)k)r)s)t)u)v)w)x)y)z){)|)}*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a+m+n+o+s+t+u+v+w+xW%u$T+p+q+rQ'b%vQ(h'aX)Z(i)W)h)i[$V!r$U%z'c(m(o^%t$T%v'a(i)W)h)iQ*w+pQ*x+qR*y+rQ$X!rQ%x$UX'h%z'c(m(oW#}!l*e*f*gW%}$Z*n*o*pX&O$]*q*r*s#oaOQ^f!a!e#k#q$R$p%^%`%q%y&x'O'P'^'`'f(U(V(c(e(f)S)f)k)x)y)z){)|)}*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a+m+n+o+s+t+u+v+w+xVcOQfQQO|vQ!e!g#q$U%`%n%z'O'P'X'a'c(](i(m(o)Q)R)W)h)iQ!e^Q!gdQ#q!fQ$U!rS%`#p#rQ%n#{Q%z$XQ'O%aQ'X%oQ'a%vS'c%x%{S(]'W'YQ(i'bQ(m'dQ)Q(^S)W(h(jR)h)XSfOQR!hfQzUQ!OVQ!TWQ!WXQ!^Y#r#Rz!O!T!W!^#U#Z#`#e#i#k#t$^$c$j$s$x$}%Q%V%^%i%k&T&U&[&^&c&d&h&k&l&n&o&q&s&t&v&w&x'Q'U'j'l'o's'u'y'{(U(V(Y(Z([(q(r(t(u(v(x(y(z)bQ#U{Q#Z!QQ#`!UQ#e![Q#i!_Q#k!aQ#t!iQ$^!xQ$c!yQ$j!zS$s#S#VS$x#X#[S$}#^#aS%Q#b#fS%V#g#jQ%^#nQ%i#uQ%k#xQ&T$`Q&U$aQ&[$fQ&^$iQ&c$kQ&d$nQ&h$rQ&k$tQ&n$yQ&q%OQ&s%RQ&v%WS&x%]%_Q'Q%eQ'U%hQ'j&QQ'l&RQ'o&VQ's&YQ'u&_Q'y&bQ'{&iQ(U&yQ(Y'SQ(Z'TQ(['VQ(q'mQ(r'nQ(t'qQ(u'rQ(v'tQ(x'wQ(y'xS(z'z'|R)b({Q#V{Q$t#ST$w#V$tQ#[!QQ#a!UQ$y#XW$|#[#a$y%OR%O#^Q#f![Q%R#bT%U#f%RQ#j!_Q%W#gW%Z#j%W'|({Q'|&iR({'zQ!d[Q#W)oW#o!d#W$O$YQ$O)pR$Y)qQ%_#nQ&y%]T&|%_&yQ#v!iQ$b!xQ%f#tW%j#v$b%f&SR&S$^Q$g!yQ$l!zQ&W$cW&]$g$l&W&`R&`$jQ#r!fQ%a#pT%d#r%aQ$Q!oz%p$Q']'f(b(f)e*U*V*W*}+O+P+Q+R+S+W+X+Y,V,W,XQ']%rQ'f%yQ(b'[Q(f'`Q)e)UQ*U*OQ*V*PQ*W*QQ*}*tQ+O*uQ+P*vQ+Q*zQ+R*{Q+S*|Q+W+TQ+X+UQ+Y+VQ,V,PQ,W,QR,X,RQ(j'bQ)X(hT)[(j)XQ%{$XQ'd%xT'i%{'dQ'Y%oQ(^'WT(a'Y(^VeOQfUdOQfQ!f^[#l!a#k%^&x(U(VQ#p!eW%c#q%`'O'PQ%r$RW&f$p)x)y)zQ'[%qQ'g%yW(d'^){)|)}W(g'`*O*P*QQ(n'fW)T(c*R*S*TQ)U(eW)V(f*U*V*WW)d)S*X*Y*ZW)l)f*[*]*^W)n)k*_*`*aQ*t+mQ*u+nQ*v+oQ*z+sQ*{+tQ*|+uQ+T+vQ+U+wR+V+x#nbOQ^f!a!e#k#q$R$p%^%`%q%y&x'O'P'^'`'f(U(V(c(e(f)S)f)k)x)y)z){)|)}*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a+m+n+o+s+t+u+v+w+xQ{Uf!PVW!O!T#Z#`$x$}&n&o&qQ#SzQ#d!YW$v#U$s&k&lW%m#z)r)s)tX&e$o)u)v)w$t`OQUVW^fz!O!T!Y!a!e#U#Z#`#k#q#z$R$o$p$s$x$}%^%`%q%y&k&l&n&o&q&x'O'P'^'`'f(U(V(c(e(f)S)f)k)r)s)t)u)v)w)x)y)z){)|)}*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a+m+n+o+s+t+u+v+w+xQ!okQ!qlQ!tnQ!vp[$V!r$U%z'c(m(oQ'_%sQ+g+yQ+h+zQ+i+{Q+j+|Q+k+}Q+l,OQ,P,]Q,Q,^Q,R,_Q,S,`Q,T,aQ,U,bQ,Y,cQ,Z,dR,[,e%z]OQUVW^fklnpz!O!T!Y!a!e!r#U#Z#`#k#q#z$R$U$o$p$s$x$}%^%`%q%s%y%z&k&l&n&o&q&x'O'P'^'`'c'f(U(V(c(e(f(m(o)S)f)k)r)s)t)u)v)w)x)y)z){)|)}*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a+m+n+o+s+t+u+v+w+x+y+z+{+|+},O,],^,_,`,a,b,c,d,e!X!{q!i!p!x#t#v$T$^$b$e%f%v&S'a(i)W)h)i+^+_+`+p+q+r,i,j,kQ!QVQ!UWQ#X!OQ#^!T_${#Z#`$x$}&n&o&qQ![XQ#b!WX%T#e%Q&s&t[!ZX!W#e%Q&s&tQ!_YQ#g!^^%Y#i%V&v&w'{(z)bQ&i$rR'z&h!h[OQ^fl!e!r#q#z$U$o$p%`%s%y%z'O'P'^'`'c'f(c(f(m(o)S)f)k,`,a,b,c,d,e!f)oUVWz!O!T!Y!a#U#Z#`#k$s$x$}%^&k&l&n&o&q&x(U(V)r)u)x){*O*R*U*X*[*_!U)pk$R%q(e)s)v)y)|*P*S*V*Y*]*`+m+n+o+s+t+u+v+w+x,],^,_u)qnp)t)w)z)}*Q*T*W*Z*^*a+y+z+{+|+},Oa!c[!d#W$O$Y)o)p)qQ#n!aQ%]#kX&{%^&x(U(V$u`OQUVW^fz!O!T!Y!a!e#U#Z#`#k#q#z$R$o$p$s$x$}%^%`%q%y&k&l&n&o&q&x'O'P'^'`'f(U(V(c(e(f)S)f)k)r)s)t)u)v)w)x)y)z){)|)}*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a+m+n+o+s+t+u+v+w+xX%w$T+p+q+r#obOQ^f!a!e#k#q$R$p%^%`%q%y&x'O'P'^'`'f(U(V(c(e(f)S)f)k)x)y)z){)|)}*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*]*^*_*`*a+m+n+o+s+t+u+v+w+xVdOQf", + nodeNames: "⚠ Script Boolean Word true false Nil String Number Keyword Tuple List Splat Set Dict Struct Synthetic Args Placeholder Fn_Lambda Fn_Clause Tuple_Pattern Pattern List_Pattern Splattern Dict_Pattern Assoc_Pattern Struct_Pattern Recur Block If If_Let Match Match_Clause Else When When_Clause Loop Fn_Clauses Repeat Each Let Ref Fn_Named Fn_Compound Import Use Ns", + maxTerm: 120, skippedNodes: [0], - repeatNodeCount: 2, - tokenData: "&j~R[XYwYZ!V]^wpqwrs![vw#x!Q!R$a!R![${!]!^!V#Y#Z%^#b#c%{#h#i&^~|RY~XYw]^wpqw~![O[~~!_VOr![rs!ts#O![#O#P!y#P;'S![;'S;=`#r<%lO![~!yOS~~!|RO;'S![;'S;=`#V;=`O![~#YWOr![rs!ts#O![#O#P!y#P;'S![;'S;=`#r;=`<%l![<%lO![~#uP;=`<%l![~#}SZ~OY#xZ;'S#x;'S;=`$Z<%lO#x~$^P;=`<%l#x~$dR!O!P$m!Q!R$m!Z![$m~$rRT~!O!P$m!Q!R$m!Z![$m~%QST~!O!P$m!Q!R${!R!Z${!Z![${~%aP#T#U%d~%gP#`#a%j~%mP#g#h%p~%sP#X#Y%v~%{OQ~~&OP#]#^&R~&UP#`#a&X~&^OR~~&aP#f#g&d~&gP#i#j%p", - tokenizers: [0], + repeatNodeCount: 16, + tokenData: "-g~RmXY!|YZ#[]^!|pq!|rs#est%Rtu%^vw%ixy&Qyz&V|}&[}!O&a!O!P'e!Q!R&m!R!['T![!]'v!]!^'{!_!`(Q!b!c(V!}#O(b#P#Q(g#R#S(l#T#W(q#W#X)]#X#k(q#k#l*k#l#o(q#o#p-]#q#r-b~#RR!d~XY!|]^!|pq!|V#eO#WS!pQ!fP~#hVOr#ers#}s#O#e#O#P$S#P;'S#e;'S;=`${<%lO#e~$SOV~~$VRO;'S#e;'S;=`$`;=`O#e~$cWOr#ers#}s#O#e#O#P$S#P;'S#e;'S;=`${;=`<%l#e<%lO#e~%OP;=`<%l#e~%UP#o#p%X~%^O!x~~%aP#o#p%d~%iO!v~~%nS!e~OY%iZ;'S%i;'S;=`%z<%lO%i~%}P;=`<%l%i~&VO!o~~&[O!q~Q&aO!pQ~&dR!Q!R&m!R!['T!`!a'`~&rPW~!O!P&u~&xP!Q![&{~'QPW~!Q![&{~'YQW~!O!P&u!Q!['T~'eO#R~~'hP!O!P'k~'nP!O!P'q~'vO!t~~'{O!m~P(QO!fP~(VO#[~~(YP#o#p(]~(bO!{~~(gO!r~~(lO!u~~(qO#P~V(vVRVqr(q}!O(q!P!Q(q!a!b(q!c!}(q#R#S(q#T#o(q_)bXRVqr(q}!O(q!P!Q(q!a!b(q!c!}(q#R#S(q#T#c(q#c#d)}#d#o(q_*UV#eWRVqr(q}!O(q!P!Q(q!a!b(q!c!}(q#R#S(q#T#o(q_*pXRVqr(q}!O(q!P!Q(q!a!b(q!c!}(q#R#S(q#T#](q#]#^+]#^#o(q_+bXRVqr(q}!O(q!P!Q(q!a!b(q!c!}(q#R#S(q#T#h(q#h#i+}#i#o(q_,SXRVqr(q}!O(q!P!Q(q!a!b(q!c!}(q#R#S(q#T#[(q#[#],o#]#o(q_,vV#bWRVqr(q}!O(q!P!Q(q!a!b(q!c!}(q#R#S(q#T#o(q~-bO#U~~-gO!w~", + tokenizers: [0, 1, 2, 3], topRules: {"Script":[0,1]}, + specialized: [{term: 3, get: (value) => spec_Word[value] || -1}], tokenPrec: 0 }) diff --git a/parser.terms.js b/parser.terms.js index 7b21df9..e278b62 100644 --- a/parser.terms.js +++ b/parser.terms.js @@ -2,6 +2,46 @@ export const Script = 1, Boolean = 2, - Nil = 3, - String = 4, - Number = 5 + Word = 3, + Nil = 6, + String = 7, + Number = 8, + Keyword = 9, + Tuple = 10, + List = 11, + Splat = 12, + Set = 13, + Dict = 14, + Struct = 15, + Synthetic = 16, + Args = 17, + Placeholder = 18, + Fn_Lambda = 19, + Fn_Clause = 20, + Tuple_Pattern = 21, + Pattern = 22, + List_Pattern = 23, + Splattern = 24, + Dict_Pattern = 25, + Assoc_Pattern = 26, + Struct_Pattern = 27, + Recur = 28, + Block = 29, + If = 30, + If_Let = 31, + Match = 32, + Match_Clause = 33, + Else = 34, + When = 35, + When_Clause = 36, + Loop = 37, + Fn_Clauses = 38, + Repeat = 39, + Each = 40, + Let = 41, + Ref = 42, + Fn_Named = 43, + Fn_Compound = 44, + Import = 45, + Use = 46, + Ns = 47 diff --git a/test.js b/test.js index 0b4707e..a736692 100644 --- a/test.js +++ b/test.js @@ -1,6 +1,12 @@ import {parser} from "./parser.js" -const source = "nil; true; false; 12; \"foo\"" +const source = ` +if foo +then do abcd +> xyz +> +else asdf +` const parse = (source) => parser.parse(source.concat("\n"))