我正在用 Haskell 编写一个简单的命令式语言的编译器,输出 Java 字节码。我已经到了发出字节码的抽象表示的地步。
在编写编译 if 语句的代码时,我遇到了一些麻烦。为了实现 if 语句,我需要跳转到的标签。因此,我需要为该标签生成一个名称,并且该名称必须是唯一的。
我的第一个想法是通过一些状态compileStatement
, i.e
compileStatement :: Statement -> UniqueIDState -> [AbstractInstruction]
当然,compilerStatement
是递归的,因此使用此方法需要我从递归调用中传递唯一 ID 生成器的状态:
compileStatement :: Statement -> UniqueIDState -> (UniqueIdState, [AbstractInstruction])
这看起来有点笨拙,特别是当我意识到我将来需要携带更多状态时;有更优雅的方式吗?
你需要一个“独特的供应”。在 Haskell 中执行此操作的常用方法是通过 State monad 线程化计数器,这会自动解决您所描述的管道问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)