微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 Clang AST 从 LibTooling 映射到 OCaml 中的 AST

如何解决将 Clang AST 从 LibTooling 映射到 OCaml 中的 AST

我正在寻找一种方法将 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 举报,一经查实,本站将立刻删除。