summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdoardo La Greca2025-08-22 21:22:18 +0200
committerEdoardo La Greca2025-08-22 21:22:18 +0200
commit7d97724c15ea11544f895de80f045a631754b993 (patch)
tree4a218d77c6709dab388df8bc38faae8c58d9cdd3
parent9bd2d97f9172581064890af803134d99a1251678 (diff)
add fifth exercise of lecture 5
-rw-r--r--lec05/Calc.hs25
1 files changed, 18 insertions, 7 deletions
diff --git a/lec05/Calc.hs b/lec05/Calc.hs
index 7502b5f..a38de57 100644
--- a/lec05/Calc.hs
+++ b/lec05/Calc.hs
@@ -2,18 +2,19 @@ module Calc where
import ExprT
import Parser
+import StackVM
-- Exercise 1
eval :: ExprT -> Integer
eval (Lit n) = n
-eval (Add l r) = eval l + eval r
-eval (Mul l r) = eval l * eval r
+eval (ExprT.Add l r) = eval l + eval r
+eval (ExprT.Mul l r) = eval l * eval r
-- Exercise 2
evalStr :: String -> Maybe Integer
-evalStr s = case parseExp Lit Add Mul s of
+evalStr s = case parseExp Lit ExprT.Add ExprT.Mul s of
Nothing -> Nothing
Just t -> Just (eval t)
@@ -26,8 +27,8 @@ class Expr a where
instance Expr ExprT where
lit = Lit
- add = Add
- mul = Mul
+ add = ExprT.Add
+ mul = ExprT.Mul
reify :: ExprT -> ExprT
reify = id
@@ -36,8 +37,8 @@ reify = id
instance Expr Integer where
lit x = x
- add l r = eval (Add (Lit l) (Lit r))
- mul l r = eval (Mul (Lit l) (Lit r))
+ add l r = eval (ExprT.Add (Lit l) (Lit r))
+ mul l r = eval (ExprT.Mul (Lit l) (Lit r))
instance Expr Bool where
lit x
@@ -66,3 +67,13 @@ testInteger = testExp :: Maybe Integer
testBool = testExp :: Maybe Bool
testMM = testExp :: Maybe MinMax
testSat = testExp :: Maybe Mod7
+
+-- Exercise 5
+
+instance Expr Program where
+ lit x = [PushI x]
+ add l r = l ++ r ++ [StackVM.Add]
+ mul l r = l ++ r ++ [StackVM.Mul]
+
+compile :: String -> Maybe Program
+compile s = parseExp lit add mul s