%if False > module Let6 > where > import MLexer3 > > 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 > > %{ > %endif > Terminal = Numeral {Int} as "" > | Ident {String} as "" > | Addop {Op} as "+ or -" > | Mulop {Op} as "* or /" > | KWLet as "let" > | KWIn as "in" > | Equal as "=" > | LParen as "(" > | RParen as ")" > | *EOF as ""; %if False > left 6 Addop {Op}; > left 7 Mulop {Op}; > nonassoc 0 "in"; > > 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}, ")"; > > decl {Decl}; > decl {s :=: e} : Ident {s}, "=", expr {e}; > > }% %endif