抽象语法树(AST)中的常见属性是什么?

时间:2017-05-26 07:00:16

标签: parsing compiler-construction abstract-syntax-tree

我是编译器设计的新手,并且一直在观看Ravindrababu Ravula的series of youtube videos

我正在创建my own language以获得乐趣,并且我将其解析为抽象语法树(AST)。我的理解是这些树可以移植,因为它们遵循与其他语言相同的结构。

如何创建可移植的AST?

附注:

  1. 我的解析器目前是用javascript编写的,但我可能会把它移到C#。
  2. 我一直在查看SpiderMonkey的规格以获取指导。这是一个好方法吗?

1 个答案:

答案 0 :(得分:2)

可移植性(无论如何定义)不太可能是构建AST的主要目标。很少(如果有的话)编译器框架提供了一个允许使用外部AST的清晰接口,并且特定的AST结构往往被严重记录并且如有变更,恕不另行通知。 (即使它们已被充分记录,典型AST实现的复杂性也具有挑战性。)

AST与语言的语法细节以及所使用的特定解析策略密切相关。虽然能够为多个任务重新调整AST是有用的 - 编译,linting,漂亮打印,交互式编辑,静态分析等 - 这些不同用例的冲突需求往往会增加复杂性。特别是在语言开发的初始阶段,您需要为快速原型设计提供很多空间。

便携式AST的最诱人的原因是使用其他语言作为目标,从而节省编写代码生成的成本等。但是,在实践中,通常更容易生成另一种语言的文本表示来自你自己的AST而不是强迫你的解析器使用外来AST。更好的方法是定位一个记录良好的虚拟机(LLVM,.Net IL,JVM等),这通常不会比生成C代码更多。

您可能需要查看LLVM Kaleidoscope tutorial(第二部分介绍AST,尽管在C ++中实现)。此外,您可能会发现this question on a sister site有趣的阅读材料。最后,如果你打算在Javascript中实现你的实现,你至少应该看一下jison parser generator,这需要花费大量的工作来维护解析器和扫描器(因此允许更容易的实验。)