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

What are common properties in an Abstract Syntax Tree (AST)?

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

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

如何创建可移植的 AST?

旁注:

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

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

AST 与语言的句法细节以及所使用的特定解析策略密切相关。虽然能够将 AST 重新用于多项任务(编译、linting、漂亮打印、交互式编辑、静态分析等)很有用,但这些不同用例的相互冲突的需求往往会增加复杂性。特别是在语言开发的初始阶段,您会希望给自己很大的空间来快速制作原型。

可移植 AST 最诱人的原因是使用其他语言作为目标,从而节省编写代码生成等的成本。但是,在实践中通常更容易生成从你自己的 AST 中使用其他语言,而不是强制你的解析器使用外国 AST。更好的办法是针对一个文档齐全的虚拟机(LLVM、.Net IL、JVM 等),这通常比生成 C 代码等工作要简单得多。

您可能想看看 LLVM Kaleidoscope tutorial (the second section covers ASTs, although implemented in C++). Also, you might find this question on a sister site interesting reading. And finally, if you are going to do your implementation in Javascript, you should at least take a look at the jison parser generator,它省去了维护解析器和扫描器的大量繁重工作(因此可以更轻松地进行实验。)