【发布时间】:2011-06-30 12:37:27
【问题描述】:
我想写一个 OCaml 模块,它有一个 compile 函数,它将接受一个包含 OCaml 程序的字符串,并将编译结果输出为正确或错误,在错误的情况下,关于行和字符的信息的第一个错误。我不关心错误是什么(至少现在是这样)。
一个基本的模块类型是:
module type Compile =
sig
type result = Correct | Error of (int*int)
val compile : string -> result
end
至少有两种完全不同的实现方式:
-
快速破解方法 -- 将程序字符串写入文件,使用Unix进程在命令行调用
ocamlc并解析stderr; - 正确方法 -- 使用 OCaml 工具分析代码。
关于 (1),我无法获取 stderr 的内容。我开始使用
Unix.open_process_in,它将 stdout 重定向到我可以读取的 in_channel。
由于ocamlc 输出的编译错误转到stderr(而不是stdout),我尝试使用
let ic = Unix.open_process_in "ocamlc test.ml 2>&1"
以便 stderr 的内容在命令行被重定向到 stdout。这样,我希望,ic
将包含编译错误。不幸的是,情况并非如此,ic 只包含End_of_file。
然后我转到Unix.create_process 命令,因为它允许我为输出、输入、错误选择新通道。但是我在选择这些频道时遇到了麻烦。输出通道应该是什么,以便我可以在我的程序中读取它?
关于 (2),您认为(合理)简单的方法是什么?
非常感谢您的帮助!
【问题讨论】:
-
关于 (2):OCaml 不是最简单的语言。您必须构建一个完整的编译器前端。即使是那些不必问这个问题的人也可能需要几周的时间才能获得一个主要工作的版本。如果我假设你对编译器构造(甚至解析,就此而言)没有什么经验是正确的......
-
@delnan OCaml 确实为您提供了 Camlp4 中编译器的所有部分。
-
@delnan 我已经使用 OCaml 的 lex 和 yacc 对应物编写了解析器。但我并没有考虑从头开始为 OCaml 编写编译器。这将是一场噩梦般的工作。此外,OCaml 已经提供了解析和编译 OCaml 代码的工具。我在 (2) 中的问题是如何最好地使用这些工具来实现此目的。