1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
%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"))
|