我正在用 Haskell 编写一个编译器,试图避开词法分析和解析阶段。我希望源代码是作为代数类型实现的 AST。
我当前的结构如下:
.hs
文件,其中包含 AST 节点的定义,以及从程序到其输出的转换函数,主要是一个名为 compile
的一元函数。这就是“编译器实现”。.hs
文件,它定义了一个名为 program
的空函数,它返回要编译的 AST。这就是“程序”。.hs
文件,它将 main
基本上定义为 compile program
。这就是“司机”。我希望能够以整齐的打包形式提供编译器(编译器实现+驱动程序),期望我的用户提供自己的
program
定义。
我尝试使用 AST 类型的
Read
实例来实现编译器,但问题是程序错误的反馈显示“无法读取”,仅此而已。因为我希望程序采用有效的 Haskell 形式,所以我希望读取 AST 的部分使用 Haskell 编译器来完成。
我想象一个解决方案,我将能够提供一个增强的 Haskell 编译器,其中包含编译器实现和驱动程序,这将编译程序。
是否可以创建这种人工制品,例如 LISP 图像或 OCaml 自定义顶层?
这大致就是 xmonad 所做的事情,因此您可以阅读该机制的工作原理并从中获取灵感。 dyre 包尝试将该技术捆绑到一个独立的库中。
您需要制作一个完整的 Haskell 编译器——即 GHC——作为打包的一部分提供给用户。