lambda_term/
lambda_term.rs1use TSPL::Parser;
2use std::fmt;
3
4enum Term {
5 Lam { name: String, body: Box<Term> },
6 App { func: Box<Term>, argm: Box<Term> },
7 Var { name: String },
8}
9
10TSPL::new_parser!(TermParser);
11
12impl<'i> TermParser<'i> {
13 fn parse(&mut self) -> Result<Term, String> {
14 self.skip_trivia();
15 match self.peek_one() {
16 Some('λ') => {
17 self.consume("λ")?;
18 let name = self.parse_name()?;
19 let body = Box::new(self.parse()?);
20 Ok(Term::Lam { name, body })
21 }
22 Some('(') => {
23 self.consume("(")?;
24 let func = Box::new(self.parse()?);
25 let argm = Box::new(self.parse()?);
26 self.consume(")")?;
27 Ok(Term::App { func, argm })
28 }
29 _ => {
30 let name = self.parse_name()?;
31 Ok(Term::Var { name })
32 }
33 }
34 }
35}
36
37impl fmt::Debug for Term {
38 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
39 match self {
40 Term::Lam { name, body } => write!(f, "λ{} {:?}", name, body),
41 Term::App { func, argm } => write!(f, "({:?} {:?})", func, argm),
42 Term::Var { name } => write!(f, "{}", name),
43 }
44 }
45}
46
47fn main() {
48 let mut parser = TermParser::new("λx(λy(x y) λz z)");
49 match parser.parse() {
50 Ok(term) => println!("Parsed: {:?}", term),
51 Err(err) => eprintln!("{}", err),
52 }
53}
54