-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEvaluator.hs
More file actions
56 lines (50 loc) · 1.42 KB
/
Evaluator.hs
File metadata and controls
56 lines (50 loc) · 1.42 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
module Evaluator
(
evaluate
)
where
import Data.List (head, tail)
import Tokens (Token, Token(..))
import Ast (
Exp, Exp(..),
Exp', Exp'(..),
Term, Term(..),
Term',Term'(..),
Factor, Factor(..),
Atom, Atom(..),
ArithOp, ArithOp(..))
evaluate :: Exp -> Double
evaluate TrivialExp = 0
evaluate NontrivialExp {
expTerm = term,
expExp' = exp'
} = evaluateTerm term + evaluateExp' exp'
evaluateExp' :: Exp' -> Double
evaluateExp' TrivialExp' = 0
evaluateExp' NontrivialExp' {
exp'Op = op,
exp'Term = term,
exp'Exp' = rest
}
| op == Add = evaluateTerm term + evaluateExp' rest
| op == Sub = - evaluateTerm term + evaluateExp' rest
evaluateTerm :: Term -> Double
evaluateTerm NontrivialTerm {
termFactor = factor,
termTerm' = term'
} = evaluateTerm' (evaluateFactor factor) term'
evaluateTerm' :: Double -> Term' -> Double
evaluateTerm' x TrivalTerm' = x
evaluateTerm' x NontrivialTerm' {
term'Op = op,
term'Factor = factor,
term'Term' = term'
}
| op == Mul = evaluateTerm' (x * evaluateFactor factor) term'
| op == Div = evaluateTerm' (x / evaluateFactor factor) term'
evaluateFactor :: Factor -> Double
evaluateFactor NegativeFactor { innerFactor = factor } = - (evaluateFactor factor)
evaluateFactor AtomicFactor { innerAtom = atom } = evaluateAtom atom
evaluateAtom :: Atom -> Double
evaluateAtom NumericAtom { number = value } = value
evaluateAtom ExpAtom { innerExp = exp } = evaluate exp