问题描述
我正在寻找一种方法将 Clang 生成的 C++ AST 映射到 OCaml 中的另一个 AST。目前我正在使用 clangml 来执行此操作,这是一个很棒的库,提供从 libclang 到 OCaml 的绑定。
但是,我需要访问 Clang 的预处理器并将一些信息从预处理器注入 OCaml 中的 AST。这在 libclang 中非常有限(有时不可能)。目前,我可以通过使用我用 LibTooling 编写的工具来实现这一点。这个工具从预处理器中提取我需要的信息。之后,当我用 clangml 遍历 Clang AST 时,提取的信息会扫描相关部分,并注入 OCaml 中的 AST。
我想扩展我的工具,而不是使用 clangml,使其能够直接将 Clang AST 映射到我在 OCaml 中需要的那个。
例如: 假设 OCaml 中简化 AST 的一部分:
type src_pos = string * int * int
type loc = src_pos * src_pos
type expr =
| True of loc
| False of loc
| Var of loc * string
| UInt of loc * int
| ...
我如何将相应的表达式从 Clang 翻译成这种格式?
目前我正在考虑几个选项:
他们似乎都能实现我想要的,但我不知道什么是最好的选择。我也不知道将 Clang AST 节点映射到我的 OCaml AST 中的构造函数的最佳方法是什么。列出的库似乎没有将 C structs
映射到 OCaml constructors
的选项。但是,可以将 C structs
映射到 OCaml 中对应的 records
。缺点是我可能不得不为 OCaml AST 中存在的每个节点编写翻译器,将记录映射到 OCaml 中的构造函数。例如:
type src_pos_struct = {path: string; row: int; col: int}
type loc_struct = {p1: src_pos_struct; p2: src_pos_struct}
let loc_of_loc_struct ({p1; p2}: loc_struct): loc =
(p1.path,p1.row,p1.col),(p2.path,p2.row,p2.col)
type 'a cpp_node = {loc: loc_struct; data: 'a}
type uint_data = {uint: int}
type uint_struct = uint_data cpp_node
let uint_of_struct (struct: uint_struct): expr =
let loc = loc_of_loc_struct struct.loc in
let uint = data.uint in
UInt (loc,uint)
...
我认为另一种选择是将 OCaml 函数公开给 libtooling 工具。这些函数将允许直接在 OCaml 的堆上构造 OCaml 构造函数。但是,我不完全知道这将如何完成。
总结一下:有没有办法将 C structs
直接映射到 OCaml constructoRSS
? (无需编写大量转换函数)。如果没有,解决这个问题的建议方法是什么?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)