-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexpression_parser.hs
More file actions
58 lines (52 loc) · 1.34 KB
/
expression_parser.hs
File metadata and controls
58 lines (52 loc) · 1.34 KB
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
module Expr where
import Parser
import Data.Char
--expr -> term '+' expr | term
--term -> factor '*' term | factor
--factor -> digit | '(' expr ')'
--digit -> '0' | '1' | ... | '9'
--
--expr -> term ('+' expr | eps)
--term -> factor ('*' term | eps)
expr :: Parser Int
expr = do t <- term
do char '+'
e <- expr
return (t + e)
+++ do char '-'
e <- expr
return (t - e)
+++ return t
term :: Parser Int
term = do f <- factor
do char '*'
t <- term
return (f * t)
+++ do char '/'
t <- term
return (f `div` t)
+++ return f
factor' :: Parser Int
factor' = do d <- digit
return (digitToInt d)
+++ do char '('
e <- expr
char ')'
return e
factor :: Parser Int
factor = do char '('
e <- expr
char ')'
return e
+++ int
eval :: String -> Int
eval xs = case parse expr xs of
[(n, [])] -> n
[(_, out)] -> error ("ununsed input " ++ out)
[] -> error ("invalid input " ++ xs)
--eval xs = fst (head (parse expr xs))
test1 = eval "2*3+4"
test2 = eval "2*(3+4)"
test3 = eval "2*(4-3)"
test4 = eval "(5+4)/3"
test5 = eval "10/2+4"