diff --git a/ludus.grammar b/ludus.grammar index 61c7383..dd7a74c 100644 --- a/ludus.grammar +++ b/ludus.grammar @@ -1,10 +1,20 @@ -@top File { (Identifier | Number | String)+ } +@top Script { terminator* line+ } -@skip { space } +@skip { space | comment } + +line { expression terminator+ } + +expression { Boolean | Nil | String | Number } @tokens { - space { @whitespace+ } - Identifier { $[A-Za-z_]+ } - Number { $[0-9]+ } - String { '"' !["]* '"' } + space { $[ \t\r]+ } + comment { "&" ![\n]* } + Boolean { "true" | "false" } + Nil { "nil" } + String { '"' (!["\\] | "\\" _)* '"' } + int { $[1-9]$[0-9]* } + float { ("0" | int ) $[0.9]+} + Number { int | float } + separator { $[,\n] } + terminator { $[;\n] } } diff --git a/parser.js b/parser.js index 2c8b5fc..76de141 100644 --- a/parser.js +++ b/parser.js @@ -2,15 +2,15 @@ import {LRParser} from "@lezer/lr" export const parser = LRParser.deserialize({ version: 14, - states: "hOVQPOOOOQO'#Ca'#CaQVQPOOOOQO-E6_-E6_", - stateData: "b~OWOS~OQPORPOSPO~O", - goto: "]UPPPPPVQQORRQ", - nodeNames: "⚠ File Identifier Number String", - maxTerm: 8, + 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, skippedNodes: [0], - repeatNodeCount: 1, - tokenData: "#z~R_X^!Qpq!Qrs!u!Q![#d!c!}#l#R#S#l#T#o#l#y#z!Q$f$g!Q#BY#BZ!Q$IS$I_!Q$I|$JO!Q$JT$JU!Q$KV$KW!Q&FU&FV!Q~!VYW~X^!Qpq!Q#y#z!Q$f$g!Q#BY#BZ!Q$IS$I_!Q$I|$JO!Q$JT$JU!Q$KV$KW!Q&FU&FV!Q~!xTOr!urs#Xs;'S!u;'S;=`#^<%lO!u~#^OS~~#aP;=`<%l!u~#iPR~!Q![#d~#qRQ~!c!}#l#R#S#l#T#o#l", + 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], - topRules: {"File":[0,1]}, + topRules: {"Script":[0,1]}, tokenPrec: 0 }) diff --git a/parser.terms.js b/parser.terms.js index f5e3d75..7b21df9 100644 --- a/parser.terms.js +++ b/parser.terms.js @@ -1,6 +1,7 @@ // This file was generated by lezer-generator. You probably shouldn't edit it. export const - File = 1, - Identifier = 2, - Number = 3, - String = 4 + Script = 1, + Boolean = 2, + Nil = 3, + String = 4, + Number = 5 diff --git a/test.js b/test.js index 1936120..0b4707e 100644 --- a/test.js +++ b/test.js @@ -1,3 +1,7 @@ import {parser} from "./parser.js" -console.log(parser.parse('one 2 "three"').toString()) +const source = "nil; true; false; 12; \"foo\"" + +const parse = (source) => parser.parse(source.concat("\n")) + +console.log(parse(source).toString())