【发布时间】:2013-11-25 15:22:47
【问题描述】:
这是一个家庭作业问题。
我的目标是将“”形式的类型表达式转换为 CPU 指令列表。给定数据结构
data Expr = Const Double | Var String | Add Expr Expr | Mult Expr Expr
data Instr = LoadImmediate RegisterNumber -- put value here
RegisterValue -- the value
| Addition RegisterNumber -- put result here
RegisterNumber -- first thing to add
RegisterNumber -- second thing to multiply
| Multiply RegisterNumber -- put result here
RegisterNumber -- first thing to multiply
RegisterNumber -- second thing to multiply
type RegisterNumber = Int
type RegisterValue = Double
类型表达式有四个主要功能
Const: 将多个 double 类型转换为类型表达式,让你使用它。Var: 基本上将字符串(即“x”)转换为类型表达式,让你将其应用于常量
然后是 Add 和 Mult 命令,让您可以添加和相乘两个类型表达式
我们可以假设我们将看到的唯一变量是“x”,它已经在寄存器 2 中。结果将到达寄存器 1。总共有 4 个寄存器。
所以Add Const 1 (Mult (Var "x") (Const 2))
在 [Instr] 类型中将是
[LoadImmediate 3 1,
LoadImmediate 4 2,
Multiply 1 4 2,
Addition 1 3 1]
编辑:对不起,我不得不提一下,因为这是一个初学者课程,我们只需要考虑形式的表达
(Const a) `Add` ((Var "x") `Mult` Expr)
其中 'Expr' 是一些表达式。或数学形式 a0+x(a1+x(a2+x...))
我稍微修正了我的代码,现在我得到的错误是“不在范围内:数据构造函数'RegNum'”
expr2Code :: Expr -> [Instr]
expr2Code expr = e2C 1 expr
e2C:: Int -> Expr -> Instr
e2C RegNum (Const y) = [LoadImmediate RegNum y]
e2C RegNum (Var "x") = []
e2C RegNum (Add expr1 expr2) = e2C 3 expr1 ++ e2C 4 expr2 ++ [Addition RegNum 3 4]
e2C RegNum (Mult expr1 expr2) = e2C 3 expr1 ++ e2C 4 expr2 ++ [Multiply RegNum 3 4]
抱歉,帖子太长了,我们将不胜感激。
【问题讨论】:
标签: haskell expression cpu-registers