use crate::ast::*; use std::rc::Rc; grammar<'s>(); match { r"\s*" => { }, // The default whitespace skipping is disabled an `ignore pattern` is specified r";[^\n\r]*[\n\r]*" => { }, // Skip `;` comments _ } pub(crate) File = {Lang? } Trees = Tree+; pub(crate) Tree: Tree = { "(" ")" => Tree::Branch(<>), "(" "define" ")" => Tree::Define(<>), "(" "define" "(" > ")" > ")" => Tree::Define(name, Box::new(Tree::Lambda(Lambda(args, body)))), "(" "if" ")" => Tree::If(Box::new([<>])), "(" "lambda (" > ")" > ")" => Tree::Lambda(Lambda(<>)), Literal => Tree::Leaf(<>), } BTree = { Box } Literal: Literal = { Sym => Literal::Sym(<>), Num => Literal::Num(<>), Bool => Literal::Bool(<>), } Box: Box = { T => Box::new(<>) } RcSlice: Rc<[T]> = { T* => <>.into() } Rc: Rc = { T => Rc::new(<>) } Sym: String = { r"[A-Za-z!$%&*+\-./:<=>?@^_~][A-Za-z!$%&*+\-./:<=>?@^_~0-9]*" => <>.to_owned() } Num: f64 = { r"[0-9]+(\.[0-9]+)?" => <>.parse().unwrap() } Bool: bool = { "#t" => true, "#f" => false, } Lang: () = { "#lang" LangName } LangName = { // TODO: What should these be? "scheme", "r7rs", }