Rust Crates 从 C 源文件生成 AST,而不执行错误检查

问题描述 投票:0回答:1

我正在尝试使用 Rust 编写一个愚蠢的工具来像这样转换 C 代码

int sys_close(int fd) {
  file_t *f = proc_getfile(proc_curr(), fd);
  if (!f){
    return -1;
  }else{
    fclose(f);
    proc_curr()->files[fd] = NULL;
    return 0;
  }
}

到此

int sys_close(int fd) {
  return ({
    file_t *f = proc_getfile(proc_curr(), fd);
    !f ? -1 : (fclose(f), proc_curr()->files[fd] = NULL, 0);
  });
}

为了进行此转换,我想首先从 C 源代码生成 AST,然后对 AST 中的元素重新排序,最后通过访问树来打印转换后的代码。

我不想自己编写解析器,所以我正在寻找一个 Rust 箱来为我生成 AST。因为这个工具只关心小范围代码中的代码转换,所以最好 crate 不进行语义检查,只专注于生成 AST。

我尝试了

lang-c
,但它似乎执行了某种类型检查,因为未声明的类型(例如
uint32_t
)被视为
SyntaxError
。另外
lang-c
使用
clang
gcc
作为其前端,因此将检查包含文件。我想要一个不执行任何类型的检查或尝试读取包含文件,仅解析输入源代码并生成 AST 的库。我想知道是否有符合我需要的箱子。

提前致谢。

c parsing rust abstract-syntax-tree
1个回答
0
投票

如果你想解析C语言的复杂语法,我建议你尝试使用ANTLR4。它是一个流行的语法/解析器库,已被移植到大多数主要编程语言。 ANTLR4 有一个非官方的 Rust 端口,名为

antlr_rust
。该代码的边缘有点粗糙,但它可以完成工作。

使用这种方法的一个好处是 ANTLR4 维护者有一个 C 语法示例。它可能会过时,但它给你一个不错的开始。

然而,一个缺点是 ANTLR 最初是在 Java 中遵循面向对象设计原则创建的。这意味着它不使用 Rust 的

enum
和模式匹配等功能。如果 Rust 不是设计要求,我建议使用 Java 或 Python 来完成这个项目,因为这将使过程变得更加容易。

© www.soinside.com 2019 - 2024. All rights reserved.