1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
#![feature(box_syntax)] #[macro_use] extern crate lalrpop_util; #[derive(Debug)] pub enum Expression { Var(Variable), Abs(Abstraction), App(Application), } #[derive(Debug)] pub struct Variable(pub String); #[derive(Debug)] pub struct Abstraction(pub Variable, pub Box<Expression>); #[derive(Debug)] pub struct Application(pub Box<Expression>, pub Box<Expression>); lalrpop_mod!(pub lambda); #[cfg(test)] mod tests { use crate::lambda::ExpressionParser; #[test] fn variable() { assert!(ExpressionParser::new().parse(r"x").is_ok()); } #[test] fn abstraction() { assert!(ExpressionParser::new().parse(r"\x.x").is_ok()); assert!(ExpressionParser::new().parse(r"\x. x").is_ok()); assert!(ExpressionParser::new().parse(r"\x.(x)").is_ok()); assert!(ExpressionParser::new().parse(r"\x. (x)").is_ok()); } #[test] fn application() { assert!(ExpressionParser::new().parse(r"x x").is_ok()); assert!(ExpressionParser::new().parse(r"(x y)").is_ok()); assert!(ExpressionParser::new().parse(r"(\x.x y)").is_ok()); } }