Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- > import Parsing
- >
- > type Ide = String
- >
- > data Exp = Zero | One | TT | FF | Read | I Ide | Not Exp | Equal Exp Exp | Plus Exp Exp
- > deriving Show
- >
- > data Cmd = Assign Ide Exp | Output Exp |IfThenElse Exp Cmd Cmd | WhileDo Exp Cmd | Seq Cmd Cmd
- > deriving Show
- >
- >
- >
- > expr :: Parser Exp
- > expr = do e1 <- term
- > do symbol "+"
- > e2 <- expr
- > return (Plus e1 e2)
- > +++
- > do e1 <- term
- > do symbol "="
- > e2 <- expr
- > return (Equal e1 e2)
- > +++
- > term
- >
- > term :: Parser Exp
- > term = do symbol "not"
- > do e1 <- term
- > return (Not e1)
- > +++
- > factor
- >
- > factor :: Parser Exp
- > factor = do symbol "read"
- > return Read
- > +++
- > do symbol "false"
- > return FF
- > +++
- > do symbol "true"
- > return TT
- > +++
- > do symbol "0"
- > return Zero
- > +++
- > do symbol "1"
- > return One
- > +++
- > do i1 <- identifier
- > return (I i1)
- > +++
- > do symbol "("
- > do e1 <- expr
- > do symbol ")"
- > return (e1)
- >
- > cmds :: Parser Cmd
- > cmds = do i1 <- identifier
- > do symbol ":="
- > do e1 <- expr
- > return (Assign i1 e1)
- > +++
- > do symbol "output"
- > do e1 <- expr
- > return (Output e1)
- > +++
- > do symbol "if"
- > do e1 <- expr
- > do symbol "then"
- > do c1 <- cmds
- > do symbol "else"
- > do c2 <- cmds
- > return (IfThenElse e1 c1 c2)
- > +++
- > do symbol "while"
- > do e1 <- expr
- > do symbol "do"
- > do c1 <- cmds
- > return (WhileDo e1 c1)
- > +++
- > do c1 <- cmds
- > do symbol ";"
- > do c2 <- cmds
- > return (Seq c1 c2)
- >
- >
- > eeval :: String -> Exp
- > eeval xs = case (parse expr xs) of
- > [(n,[])] -> n
- > [(_,out)] -> error ("unused input " ++ out)
- > [] -> error "invalid input"
Add Comment
Please, Sign In to add comment