%if False > module Let7 > where > import MLexer2 > > data Expr = Const Int | Var String | Bin Expr Op Expr | Let Decl Expr > deriving (Show) > > data Decl = String :=: Expr > deriving (Show) > > expr :: (Monad m) => Lex m Expr > > %{ > > Terminal = Numeral {Int} > | Ident {String} > | Addop {Op} > | Mulop {Op} > | KWLet as "let" > | KWIn as "in" > | Equal as "=" > | LParen as "(" > | RParen as ")" > | *EOF; > > left 6 Addop {Op}; > left 7 Mulop {Op}; > nonassoc 0 "in"; %endif > expr {Expr}; > expr {Const n} : Numeral {n}; > {Var s} | Ident {s}; > {Bin e1 op e2} | expr {e1}, Addop {op}, expr {e2}; > {Bin e1 op e2} | expr {e1}, Mulop {op}, expr {e2}; > {Let d e} | "let", decl {d}, "in", expr {e}; > {e} | "(", expr {e}, ")"; > {e} | "(", expr {e}, insert ")"; %if False > decl {Decl}; > decl {s :=: e} : Ident {s}, "=", expr {e}; > > }% %endif