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
|
> module Terminal1 where
> import Maybe
>
> data Op = Plus | Minus | Times | Divide
> deriving (Show)
>
> name :: Op -> String
> name Plus = "+"
> name Minus = "-"
> name Times = "*"
> name Divide = "/"
>
> app :: Op -> (Int -> Int -> Int)
> app Plus = (+)
> app Minus = (-)
> app Times = (*)
> app Divide = div
>
> data Terminal = Numeral Int
> | Ident String
> | Addop Op
> | Mulop Op
> | KWLet
> | KWIn
> | Equal
> | LParen
> | RParen
> | EOF
> deriving (Show)
>
> ident, numeral :: String -> Terminal
> ident s = fromMaybe (Ident s) (lookup s keywords)
> numeral s = Numeral (read s)
>
> keywords :: [(String, Terminal)]
> keywords = [ ("let", KWLet), ("in", KWIn) ]
|