@@ -8,7 +8,6 @@ import qualified Data.Map as M
8
8
9
9
10
10
type Filename = String
11
- type Scopes = [Scope ]
12
11
13
12
-- | Scopes in the execution.
14
13
scopes :: Scopes
@@ -50,6 +49,10 @@ execStmt :: Stmt -> Memory -> Scopes -> IO (Memory, Scopes)
50
49
execStmt d@ (DeclStmt _) m ss = do
51
50
m' <- varDeclStmt d m ss
52
51
return (m', ss)
52
+ execStmt (PrintStmt e) m ss = do
53
+ putStrLn (show (eval m ss e))
54
+ return (m, ss)
55
+
53
56
54
57
-- | Executes a declaration statement.
55
58
varDeclStmt :: Stmt -> Memory -> Scopes -> IO Memory
@@ -63,12 +66,12 @@ varDeclStmt (DeclStmt (VarDeclaration [] t (_:es))) m ss = do
63
66
error " Too many expressions in right side."
64
67
varDeclStmt (DeclStmt (VarDeclaration (x: xs'@ (y: xs)) t (e: [] ))) m ss = do
65
68
do
66
- case elabVar (head ss) ((\ (Ident x) -> x) x) (t, ([eval e])) m of
69
+ case elabVar (head ss) ((\ (Ident x) -> x) x) (t, ([eval m ss e])) m of
67
70
(Left i) -> error i
68
71
(Right i) -> varDeclStmt (DeclStmt (VarDeclaration xs' t (e: [] ))) i ss
69
72
varDeclStmt (DeclStmt (VarDeclaration (x: xs) t (e: es))) m ss = do
70
73
do
71
- case elabVar (head ss) ((\ (Ident x) -> x) x) (t, ([eval e])) m of
74
+ case elabVar (head ss) ((\ (Ident x) -> x) x) (t, ([eval m ss e])) m of
72
75
(Left i) -> error i
73
76
(Right i) -> varDeclStmt (DeclStmt (VarDeclaration xs t es)) i ss
74
77
@@ -80,11 +83,11 @@ getType (Char c) = GChar
80
83
getType (Bool b) = GBool
81
84
getType (List (x: _)) = GList (getType x)
82
85
83
- evalList :: [ArithExpr ] -> [Value ]
84
- evalList [x] = [eval x]
85
- evalList (x: y: xs) = if getType z /= getType (eval y) then error " Type mismatch in List "
86
- else z: (evalList (y: xs))
87
- where z = (eval x)
86
+ evalList :: Memory -> Scopes -> [ArithExpr ] -> [Value ]
87
+ evalList m ss [x] = [eval m ss x]
88
+ evalList m ss (x: y: xs) = if getType z /= getType (eval m ss y) then error " Type mismatch in List "
89
+ else z: (evalList m ss (y: xs))
90
+ where z = (eval m ss x)
88
91
89
92
90
93
-- | Default values for each type
@@ -103,24 +106,27 @@ fromValue :: Value -> Integer
103
106
fromValue (Integer i) = i
104
107
105
108
106
- eval :: ArithExpr -> Value
107
- eval (ArithTerm (LitTerm (Lit v))) = v
108
- eval (ArithUnExpr MinusUnOp e) = minusUn (eval e)
109
- eval (ArithUnExpr PlusUnOp e) = plusUn (eval e)
110
- eval (ArithUnExpr NotUnOp e) = not' (eval e)
111
- eval (ArithBinExpr MinusBinOp e1 e2) = minusBin (eval e1) (eval e2)
112
- eval (ArithBinExpr PlusBinOp e1 e2) = plusBin (eval e1) (eval e2)
113
- eval (ArithBinExpr TimesBinOp e1 e2) = timesBin (eval e1) (eval e2)
114
- eval (ArithBinExpr DivBinOp e1 e2) = divBin (eval e1) (eval e2)
115
- eval (ArithBinExpr ExpBinOp e1 e2) = expBin (eval e1) (eval e2)
116
- eval (ExprLiteral (ListLit es )) = List (evalList es)
117
- eval (ArithBinExpr PlusPlusBinOp e1 e2) = case eval e1 of
118
- l1@ (List (x: xs)) -> case eval e2 of
109
+ eval :: Memory -> Scopes -> ArithExpr -> Value
110
+ eval m ss (ArithTerm (LitTerm (Lit v))) = v
111
+ eval m ss (ArithUnExpr MinusUnOp e) = minusUn (eval m ss e)
112
+ eval m ss (ArithUnExpr PlusUnOp e) = plusUn (eval m ss e)
113
+ eval m ss (ArithUnExpr NotUnOp e) = not' (eval m ss e)
114
+ eval m ss (ArithBinExpr MinusBinOp e1 e2) = minusBin (eval m ss e1) (eval m ss e2)
115
+ eval m ss (ArithBinExpr PlusBinOp e1 e2) = plusBin (eval m ss e1) (eval m ss e2)
116
+ eval m ss (ArithBinExpr TimesBinOp e1 e2) = timesBin (eval m ss e1) (eval m ss e2)
117
+ eval m ss (ArithBinExpr DivBinOp e1 e2) = divBin (eval m ss e1) (eval m ss e2)
118
+ eval m ss (ArithBinExpr ExpBinOp e1 e2) = expBin (eval m ss e1) (eval m ss e2)
119
+ eval m ss (ExprLiteral (ListLit es )) = List (evalList m ss es)
120
+ eval m ss (ArithBinExpr PlusPlusBinOp e1 e2) = case eval m ss e1 of
121
+ l1@ (List (x: xs)) -> case eval m ss e2 of
119
122
l2@ (List (y: ys)) -> if (getType x == getType y) then plusPlusBinList l1 l2
120
123
else plusPlusBin l1 l2
121
- k -> case eval e2 of
124
+ k -> case eval m ss e2 of
122
125
l2@ (List (y: ys)) -> if (getType k == getType y) then plusPlusBin k l2
123
126
else error " Type mismatch ++ operator "
127
+ eval m ss (ArithTerm (IdTerm (Ident i))) = case fetchVarValue m i ss of
128
+ Left i -> error i
129
+ Right i -> i
124
130
125
131
126
132
plusPlusBinList :: Value -> Value -> Value
0 commit comments