Guest User

Untitled

a guest
Aug 6th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. > import Parsing
  2. >
  3. > type Ide  =  String
  4. >
  5. > data Exp  =  Zero | One | TT | FF | Read | I Ide | Not Exp | Equal Exp Exp | Plus Exp Exp
  6. >              deriving Show
  7. >
  8. > data Cmd  =  Assign Ide Exp | Output Exp |IfThenElse Exp Cmd Cmd | WhileDo Exp Cmd | Seq Cmd Cmd
  9. >              deriving Show
  10. >
  11. >
  12. >
  13. > expr                          :: Parser Exp
  14. > expr                          =  do e1 <- term
  15. >                                     do symbol "+"              
  16. >                                        e2 <- expr
  17. >                                        return (Plus e1 e2)
  18. >                                  +++  
  19. >                                  do e1 <- term
  20. >                                     do symbol "="              
  21. >                                        e2 <- expr
  22. >                                        return (Equal e1 e2)
  23. >                                  +++
  24. >                                  term
  25. >
  26. > term                          :: Parser Exp
  27. > term                          = do symbol "not"
  28. >                                    do e1 <- term
  29. >                                       return (Not e1)
  30. >                                 +++
  31. >                                 factor
  32. >
  33. > factor                        :: Parser Exp
  34. > factor                        =  do symbol "read"
  35. >                                     return Read
  36. >                                  +++
  37. >                                  do symbol "false"
  38. >                                     return FF
  39. >                                  +++
  40. >                                  do symbol "true"
  41. >                                     return TT
  42. >                                  +++
  43. >                                  do symbol "0"
  44. >                                     return Zero
  45. >                                  +++
  46. >                                  do symbol "1"
  47. >                                     return One
  48. >                                  +++
  49. >                                  do i1 <- identifier
  50. >                                     return (I i1)
  51. >                                  +++
  52. >                                  do symbol "("
  53. >                                     do e1 <- expr
  54. >                                        do symbol ")"
  55. >                                           return (e1)
  56. >
  57. > cmds                          :: Parser Cmd
  58. > cmds                          =  do i1 <- identifier
  59. >                                     do symbol ":="
  60. >                                        do e1 <- expr
  61. >                                           return (Assign i1 e1)
  62. >                                  +++
  63. >                                  do symbol "output"
  64. >                                     do e1 <- expr
  65. >                                        return (Output e1)
  66. >                                  +++  
  67. >                                  do symbol "if"
  68. >                                     do e1 <- expr
  69. >                                        do symbol "then"
  70. >                                           do c1 <- cmds
  71. >                                              do symbol "else"
  72. >                                                 do c2 <- cmds
  73. >                                                    return (IfThenElse e1 c1 c2)
  74. >                                  +++
  75. >                                  do symbol "while"
  76. >                                     do e1 <- expr
  77. >                                        do symbol "do"
  78. >                                           do c1 <- cmds
  79. >                                              return (WhileDo e1 c1)
  80. >                                  +++
  81. >                                  do c1 <- cmds
  82. >                                     do symbol ";"
  83. >                                        do c2 <- cmds
  84. >                                           return (Seq c1 c2)
  85. >
  86. >
  87. > eeval                          :: String -> Exp
  88. > eeval xs                       =  case (parse expr xs) of
  89. >                                     [(n,[])]  -> n
  90. >                                     [(_,out)] -> error ("unused input " ++ out)
  91. >                                     []        -> error "invalid input"
Add Comment
Please, Sign In to add comment