抽象语法树有什么用?

时间:2010-10-05 00:38:34

标签: terminology abstract-syntax-tree

我正在学习编写一种编程语言的解释器,我读过有关抽象语法树的文章。我知道它们是什么,但我看不出它们的用途。

为什么AST有用?

5 个答案:

答案 0 :(得分:5)

它们代表代码的逻辑/语法,它自然是树而不是行列表,而不会陷入具体的语法问题,例如你place your asterisk的位置。

然后可以从后端的POV以更加一致和方便的方式操纵逻辑,后者可以(并且除了Lisps之外的所有内容)与我们编写具体语法的方式非常不同。

答案 1 :(得分:4)

使用AST的主要好处是将解析和验证逻辑与实现部分分开。实现为AST的解释器确实更容易理解和维护。如果您在解析一些奇怪的语法时遇到问题,那么您可以查看AST解析器,如果一段代码没有产生预期的结果,那么就不会看到解释AST的代码。

另一个很大的优势是当你的语法需要“超前”时,例如如果你的语法允许在定义子程序之前使用子程序,那么在使用AST时验证子程序是否存在是微不足道的 - 使用“即时”解析器要困难得多。

答案 2 :(得分:1)

您需要“语法树”来表示大多数编程语言的结构,以便对包含编程语言文本的文档进行分析或转换。 (你可以通过我的生物看到一些奇特的例子。)

树是抽象的(AST)还是具体的(CST)是品味,便利和工程汗水的问题。当语法用于解构源代码时,术语CST专门用于描述解析派生树;它通常包含许多具体语法的树元素,例如语句终止符分号。 AST用于表示“比CST更简单的东西”,例如,省去分号树节点,因为它们不会对程序分析产生太大影响,因此编写处理AST的分析器比在同一个分析器上编写相同的分析器更少。 CST。理解这一点的更好方法是认识到AST通常与CST同构等效,也就是说,您应该能够从中重新生成CST。如果你想转换源文本并重新生成它,那么CST通常是一个更好的选择,因为它从原始程序中丢失了更少的信息(我的花哨的例子使用了这种方法)。

我想你会发现 abstract vs. concrete syntax trees上的SO讨论非常有帮助。

答案 3 :(得分:0)

通常,您要将代码解析为某种形式的AST,它可能或多或少是正式模型。所以我认为Kirk Woll在上面的评论中得到的是,当你解析语言时,你经常使用解析器来创建某种你正在阅读的原始内容的数据模型,通常以树形方式组织。因此,除非你做一个非常简单的翻译,否则很难避免使用AST。

我经常使用ANTLR来解析复杂语言,在这种情况下,AST的含义略微更具体。 ANTLR有一种方便的方法,可以使用非常简单的操作在解析器语法中生成AST。然后,您为此AST编写一个通常更简单的解析器,您可以像处理的语言一样简单地操作。构建两个解析器的额外工作是否是净增益是语言复杂性的函数,以及解析它后你计划用它做什么。

关于这个主题的好书,你可能想看一下,是ANTLR作者Terrence Parr的“语言实现模式”。他非常彻底地解决了这个话题。也就是说,在我开始使用AST之前我并没有真正获得AST,所以(像往常一样)是理解它们的最佳方式。

答案 4 :(得分:0)

该问题晚了,但我想我要补充一点。您实际上不必构建AST。解析源代码时可以直接发出指令。在这种情况下,AST包含在语法分析中。对于简单的语言,尤其是动态类型的语言,这是一个完全可以的策略。对于更复杂的语言或需要进一步分析源代码的地方,AST可能非常有用。例如,如果您的语言是静态类型的,即您的变量使用固定类型声明,则AST可用于检查您是否没有为变量分配错误的类型。例如,将字符串分配给声明为保留整数的变量将是错误的,而使用AST可以更方便地捕获它。

此外,正如其他人提到的那样,AST在语法分析和代码生成之间提供了清晰的区分,并使代码更具模块化。

相关问题