diff options
author | Edoardo La Greca | 2025-08-22 21:22:18 +0200 |
---|---|---|
committer | Edoardo La Greca | 2025-08-22 21:22:18 +0200 |
commit | 7d97724c15ea11544f895de80f045a631754b993 (patch) | |
tree | 4a218d77c6709dab388df8bc38faae8c58d9cdd3 | |
parent | 9bd2d97f9172581064890af803134d99a1251678 (diff) |
add fifth exercise of lecture 5
-rw-r--r-- | lec05/Calc.hs | 25 |
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 |