把产生式展开画成树

上下文无关文法从开始符号出发,用产生式不断替换非终结符。分析树把这些替换组织为父子关系:根对应开始符号,内部节点记录语法结构,叶子按顺序给出最终输入中的终结符。

同一棵树可以对应不同的展开先后,例如先展开左边还是右边的非终结符。树记录的是构造关系,不是每个替换步骤发生的唯一时间顺序,所以不能把两条不同推导直接视为两种含义。

参考:[1]

不同树可能改变解释

若同一个字符串能在同一文法下形成不同分析树,文法便存在歧义。简单算式2+3*4若既允许先加也允许先乘,就可产生不同层级,并对应不同计算结果。

引入不同优先级的非终结符,可以让加法不能任意出现在乘法之下;括号再提供显式分组。结合性又处理连续相同优先级运算的分组方向,这些规则共同限制可接受的树。

参考:[1]

分析树与AST服务不同需求

完整文法层级可能包含括号、标点或只为组织规则引入的中间节点。抽象语法树则常把这些细节压缩,只保留后续分析更关心的运算、声明和子结构关系。

是否保存注释与原始排版还取决于具体表示。不能因为取得一棵分析树或AST,就假定能够逐字还原源文件;源代码重写工具可能另存记号位置和其他文本资料。

参考:[1] [2]