C语言子集的抽象语法树

4
为了教学目的,我们正在构建一个JavaScript逐步解释器,用于(C代码的子集)。
基本上,我们有:int、float、数组、函数、for、while等,没有指针。JavaScript解释器已经完成,可以让我们解释布尔表达式如何计算,展示变量堆栈...
目前,我们正在手动将C示例转换为一些javascript,以便运行并构建操作堆栈(赋值,函数调用...),稍后可以用于逐步执行的内容。由于我们限制自己只使用C的子集,所以这很容易做到。
现在,我们想将C代码编译为我们的javascript表示形式。我们所需要的只是C代码的抽象语法树,然后javascript生成就很简单了。
你知道一个好的C解析器可以生成这样的树吗?不需要是javascript(但那将是完美的),任何语言都可以,因为这可以离线完成。
我看过Emscripten(https://github.com/kripken/emscripten),但它更像是一个C=>javascript编译器,而这不是我们想要的。
2个回答

3

最近我使用了Eli Bendersky的pycparser来操作C代码的AST。我认为它很适合你的需求。


谢谢,太好了。我可以使用 node.name.coord 检索定义的行号,但您知道我是否还可以获取该行上的位置吗? - Loïc Février
我不认为它会导出它,但你应该可以通过进行一些修改得到它。 - Michael Foukarakis

0

我认为ANTLR有一个完整的C解析器。

为了完成你的翻译任务,我怀疑你需要完整的符号表支持;你必须知道这些符号的含义。在这里,大多数“解析器”都会让你失望;它们不会构建完整的符号表。我认为ANTLR没有这个问题,但我可能错了。

我们的DMS软件重构工具包及其C前端提供了一个完整的C解析器,并构建了完整的符号表。(你可能不需要它来完成你的应用程序,但它也包括一个完整的C预处理器)。它还提供了控制流、数据流、指针分析和调用图构建,所有这些都可以在将C翻译成你的目标虚拟机时非常有用。


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