我正在尝试使用 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语言的复杂语法,我建议你尝试使用ANTLR4。它是一个流行的语法/解析器库,已被移植到大多数主要编程语言。 ANTLR4 有一个非官方的 Rust 端口,名为
antlr_rust
。该代码的边缘有点粗糙,但它可以完成工作。
使用这种方法的一个好处是 ANTLR4 维护者有一个 C 语法示例。它可能会过时,但它给你一个不错的开始。
然而,一个缺点是 ANTLR 最初是在 Java 中遵循面向对象设计原则创建的。这意味着它不使用 Rust 的
enum
和模式匹配等功能。如果 Rust 不是设计要求,我建议使用 Java 或 Python 来完成这个项目,因为这将使过程变得更加容易。