handball/src/grammar.lalrpop

28 lines
656 B
Plaintext

use crate::{Tree, Literal};
grammar<'s>();
pub(crate) Tree: Tree = {
"(" <Tree+> ")" => Tree::Branch(<>),
"(" "define" <Sym> <BTree> ")" => Tree::Define(<>),
"(" "if" <Tree> <Tree> <Tree> ")" => Tree::If(Box::new([<>])),
Literal => Tree::Leaf(<>),
}
BTree = { Box<Tree> }
Literal: Literal = {
Sym => Literal::Sym(<>),
Num => Literal::Num(<>),
Bool => Literal::Bool(<>),
}
Box<T>: Box<T> = { T => Box::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,
}