我在Haskell中编写了一个非常简单的两遍汇编程序,我遇到了一个我还没有解决过的经验的场景.我认为解决方案很可能涉及monad变压器,我并不理解.
汇编程序将汇编代码解析为Statements 的列表,s是指令或标签.有些人Statement可能会提到标签.汇编程序需要将Statements转换为Instructions,这涉及消除标签并用适当的值替换标签引用.
我编写了汇编程序的第一个传递,它生成一个[(String, Int)]表示从标签到地址的映射.我还编写了以下函数来将a Statement转换为Instruction:
stmtToInstruction :: Int -> [(String, Int)] -> Statement -> Either String [I.Instruction]
stmtToInstruction addr labels stmt = case stmt of
ADD d s1 s2 -> Right [I.ADD d s1 s2]
BEQL s1 s2 l -> case do label <- find (\e -> fst e == l) labels
let labelAddr = snd label
let relativeAddr = I.ImmS $ fromIntegral (labelAddr - addr) …Run Code Online (Sandbox Code Playgroud)