From 7d97724c15ea11544f895de80f045a631754b993 Mon Sep 17 00:00:00 2001 From: Edoardo La Greca Date: Fri, 22 Aug 2025 21:22:18 +0200 Subject: add fifth exercise of lecture 5 --- lec05/Calc.hs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'lec05') 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 -- cgit v1.2.3