这是在编译器构造的上下文中对解析树(具体语法树,CST)和抽象语法树(AST)的解释。它们是相似的数据结构,但构造不同并用于不同的任务。
解析树
解析树通常在词法分析之后作为下一步生成(它将源代码转换为一系列可以被视为有意义的单元的标记,而不仅仅是一个字符序列)。
它们是树状数据结构,显示了输入终端字符串(源代码标记)是如何由相关语言的语法生成的。解析树的根是语法中最通用的符号——开始符号(例如,语句),内部节点表示开始符号扩展成的非终结符(可以包括开始符号本身),如表达式、语句、术语、函数调用。叶子是语法的终端,在语言/输入字符串中作为标识符、关键字和常量出现的实际符号,例如for、9、if等
在解析的同时,编译器还会执行各种检查以确保语法的正确性——并且语法错误报告可以嵌入到解析器代码中。
它们可用于通过语法导向定义或翻译方案进行语法导向翻译,用于简单的任务,例如将中缀表达式转换为后缀表达式。
这是表达式 9 - 5 + 2 的解析树的图形表示(注意树中终端的位置以及表达式字符串中的实际符号):
抽象语法树
AST 表示某些代码的语法结构。诸如表达式、流控制语句等编程结构的树 - 分组为运算符(内部节点)和操作数(叶子)。例如,表达式i + 9 的语法树将运算符+ 作为根,变量i 作为运算符的左孩子,将数字9 作为右孩子。
这里的区别在于非终结符和终结符不起作用,因为 AST 不处理语法和字符串生成,而是编程构造,因此它们表示这些构造之间的关系,而不是它们的生成方式通过语法。
请注意,运算符本身是给定语言的编程结构,不必是实际的计算运算符(如+ 是):for 循环也将以这种方式处理。例如,您可以有一个语法树,如for [ expr, expr, expr, stmnt ](表示为内联),其中for 是一个运算符,方括号内的元素是它的子元素(表示C 的for语法) - 也由运算符等组成。
AST 通常也由编译器在语法分析(解析)阶段生成,稍后用于语义分析、中间表示、代码生成等。
这是 AST 的图形表示: