这是一个作业问题。Haskell:将表达式转换为指令列表
我的目标是转换型表达的形式“到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
:将一字符型(即“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]
编辑:对不起,我为GOT提,因为这是一个初学者课程中,我们只需要考虑的形式表达
(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]
对不起,对于很长的文章,任何帮助将不胜感激。