This interpreter uses a slightly different grammar that the one you've learned in class, mostly to make it easier to type expressions and to check them.
The grammar is as follows:
<expression> ::= <variable> | <abstraction> | <application> <variable> ::= α ∈ { a ... z } <abstraction> ::= (L<variable>.<expression>) <application> ::= (<expression><expression>)The checker always performs the leftmost derivation. For example, the expression (λf.λg.f (g a))(λx.(b x c)) can be typed in as ((Lf.(Lg.(f(ga))))(Lx.((bx)c))). In other words, replace λ with L, surround application and abstraction with parentheses, and remove all whitespace.