2

是否可以单独使用 C 或 C++ 为任意编程语言或 IR 创建 AST(无需 YACC 和 LEX 等工具的帮助)?

如果是这样,如何实现词法和句法分析?

如果没有,必须扩充到 C 或 C++ 才能成功创建 AST 的工具是什么?

希望我把我的疑问说清楚了。如果我的问题看起来含糊不清或断章取义,请指出必填项。

PS:我实际上是在尝试为 LLVM 的 .ll 格式的 IR 表示创建 AST。我知道 .ll 是从 AST 派生的。但我正在尝试静态分析实践。所以我正在考虑创建 AST。

4

2 回答 2

2

在没有解析器生成器的情况下创建解析器的最直接的方法是递归下降。它有很好的记录 - 该领域的标准书籍是The Dragon Book

可以使用标准字符串操作技术编写将文本作为输入并生成一串标记作为输出的扫描仪。

于 2010-10-06T01:40:02.090 回答
0

我怀疑您的任意语言和 LLVM 的 AST 之间是否存在一对一的映射。这意味着您很可能真的想分两个阶段执行此操作:

  • 使用您可以获得的最佳解析工具解析您的“任意语言”,以简化解析语言的问题。按照解析器生成器生成 AST 的标准方法,使用它为您的语言构建 AST。LEX/YACC 还可以,但有很多不错的选择。您很可能需要构建一个符号表。

  • 遍历您已解析语言的 AST 以构建您的 LLVM AST。这不会是一对一的,但是在 AST 中查看树节点附近的树以收集生成 LLVM 代码所需的信息的能力可能会非常有帮助。

这是简单编译器的经典风格。

我建议你阅读 Aho/Ullman Dragon 关于语法定向翻译的书。一天的教育将为您节省数月浪费的工程时间。

于 2010-10-07T13:13:45.453 回答