将C语言转换为Ocaml

7
我想从C代码中获取抽象语法树(AST),并将其转换为OCaml值,以便我可以使用普通的OCaml程序进一步处理解析后的代码。
我原本打算使用GCC,在钩子函数中获取AST(GIMPLE格式),然后将GIMPLE代码转换为OCaml。
但我想知道是否有其他方法,或者是否已经有人做过类似的事情。(实际上我没有找到太多相关信息...)
我不想使用CIL。它是一个用于C代码的OCaml解析器,但它不包含GCC具有的所有优化。(我特别需要比CIL实现的更深入的别名分析)。
LLVM可能是一个好的选择吗?也许已经有人完成了?
还有更好的想法吗?

3
解析不等于优化。后者需要在之后进行。 - user395760
2个回答

9
如果您对CIL的别名分析精度有问题,请查看Frama-C。它基于CIL,但提供了一种适用于指针的精确值分析。该值分析使其结果在模块化架构中可用。请参考Frama-C精确值分析

2
赞同:CIL和Frama-C可能是您所期望的最好的工具,Pascal Cuoq是可以询问的正确人选之一。 - gasche
但是,编写GIMPLE代码或甚至LLVM代码的解析器怎么样呢? 然后,我会查看这些编译器所有优化之后的代码,并将AST解析为OCaml值... 这难道是不可想象的吗? - Daz
@Daz 如果你选择这条路线,我建议使用LLVM。至少在几年前,当我们自己做出选择时,GCC开发人员没有提供关于Gimple稳定性的任何保证,实际上它从一个版本到另一个版本都在变化。我不确定你期望从中间语言优化中获得什么样的魔力,但对于Frama-C中的应用程序来说,代码的可追溯性和规范化比优化更重要(即使只有这两个也很难同时拥有第三个)。 - Pascal Cuoq
如果这是你想要的,我认为你需要的不是AST,而是中间语言的指令集。一些编译器的许多优化实际上是在中间语言上操作的,而不是在源AST上(因此它们可以应用于多种语言)。我认为LLVM可以满足你的需求,尽管如果你只看例如clang的LLVM输出,你不会看到LLVM本身所做的优化。 - Michael Ekstrand

1

将C语言解析为Ocaml的另一个选择是FrontC。它的描述如下:

FrontC是一个OCAML库,提供了一个C语言解析器和词法分析器。结果是一个易于使用常规OCAML树管理处理的语法树。

它支持ANSI C语法、旧的C K&R风格语法和标准GNU CC属性。

它还提供了一个C语言漂亮打印机作为使用示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接