lambda_term/
lambda_term.rs

1use 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