【问题标题】:Abstract-syntax tree for subset of CC 子集的抽象语法树
【发布时间】:2011-09-01 00:52:27
【问题描述】:

出于教学目的,我们正在为 C 代码(的子集)构建一个 javascript 逐步解释器。

基本上我们有:int、float...、数组、函数、for、while... 没有指针。 javascript 解释器已完成,允许我们解释如何评估布尔表达式,将显示变量堆栈...

目前,我们正在手动将我们的 C 示例转换为一些 javascript,这些 javascript 将运行并构建一组操作(情感、函数调用...),这些操作可以在以后用于逐步执行操作。由于我们将自己限制为 C 的一个子集,这很容易做到。

现在我们想将 C 代码编译为我们的 javascript 表示。我们所需要的只是 C 代码的抽象语法树,并且 javascript 生成很简单。

你知道可以生成这样一棵树的好的 C 解析器吗?无需使用 javascript(但那将是完美的),任何语言都可以,因为这可以离线完成。

我看过 Emscripten (https://github.com/kripken/emscripten),但它更像是一个 C=>javascript 编译器,这不是我们想要的。

【问题讨论】:

    标签: c parsing parser-generator abstract-syntax-tree


    【解决方案1】:

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

    要完成翻译任务,我怀疑您需要完整的符号表支持;你必须知道符号的含义是什么。在这里,大多数“解析器”会让你失望;他们没有建立一个完整的符号表。我认为 ANTLR 没有,但我可能是错的。

    我们的DMS Software Reengineering Toolkit 及其C Front End 提供了完整的C arser,并构建了完整的符号表。 (您的应用程序可能不需要它,但它也包含一个完整的 C 预处理器)。它还提供控制流、数据流、分析点和调用图构造,所有这些都可以用于将 C 转换为任何目标虚拟机。

    【讨论】:

      【解决方案2】:

      我最近使用 Eli Bendersky 的 pycparser 来处理 C 代码的 AST。我认为它很适合您的目的。

      【讨论】:

      • 谢谢,太好了。我可以用node.name.coord 检索定义的行号,但是你知道我是否也可以得到该行的位置吗?
      • 我认为它不会导出它,但您应该能够通过一些修改来获得它。
      猜你喜欢
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多