%if False > module Let8 > where > import MLexer2 > > data Expr = Const Int | Var String | Bin Expr Op Expr | Let Decl Expr > deriving (Show) > > data Decl = String :=: Expr > deriving (Show) %endif > expr :: Lex IO Expr %if False > %{ > > 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}, close {_}; > > close {()}; > close {()} : ")"; > {% insert ")"} | insert ")"; %if False > decl {Decl}; > decl {s :=: e} : Ident {s}, "=", expr {e}; > > }% %endif > insert :: String -> Lex IO () > insert s = lift (putStrLn ("Warning: " ++ s ++ " inserted"))