资讯

解析树是什么?用树形结构展示句子或代码的语法

2026-11-053 分钟阅读百科
TL;DR解析树(Parse Tree),又称语法分析树或具体语法树,是根据形式文法把一句话或一段代码分解后得到的树形结构,根节点是开始符号、内部节点是语法成分、叶子是词语或记号;它在自然语言句法分析和编程语言编译器中都很重要,编译器通常再将其简化为抽象语法树。

解析树(Parse Tree),也叫语法分析树或具体语法树,是根据某种文法规则,把一个句子或一段程序代码分解之后,用树的形式表示出来的语法结构。它清楚地展示了句子或代码是由哪些成分组成的、这些成分又是如何一层层组合起来的。

解析树长什么样

解析树由节点和连接节点的边组成。根节点位于最顶端,代表整个句子或整段代码;内部节点代表各种语法成分,比如名词短语、动词短语,或者编程语言中的表达式、语句;叶子节点位于最底端,是具体的词语或代码中的记号,从左到右读出所有的叶子节点,就能还原出原来的句子。

以英文句子“The cat ate the fish”为例:根节点是句子,它分为名词短语“The cat”和动词短语“ate the fish”两部分;名词短语又分为限定词“The”和名词“cat”;动词短语分为动词“ate”和另一个名词短语“the fish”,后者再分为“the”和“fish”。这样就形成了一棵树。在编程语言中,比如表达式“2 + 3 × 4”,解析树会显示乘法“3 × 4”位于更深的层次,是先进行计算的部分,然后再与 2 相加,从而体现了乘法优先于加法的规则。

文法和歧义

解析树是根据一套形式文法构造出来的,最常用的是上下文无关文法:它由一组产生式规则组成,规定了每一种语法成分可以由哪些更小的成分组成,比如“句子由名词短语加动词短语组成”。这种文法体系由语言学家诺姆·乔姆斯基在 20 世纪 50 年代系统地提出,对语言学和计算机科学都产生了深远的影响。

如果一个句子可以根据文法构造出不止一棵解析树,就说明这个句子存在歧义。比如英文“I saw the man with a telescope”,可以理解为“我用望远镜看到了那个人”,也可以理解为“我看到了那个拿着望远镜的人”,这两种理解对应着两棵不同的解析树。中文里的“咬死了猎人的狗”也有类似的歧义。在设计编程语言时,必须避免文法产生歧义,否则同一段代码可能被理解成不同的意思。

在编译器中

在编程语言的编译器和解释器中,语法分析是一个关键的步骤:先由词法分析器把源代码拆分成一个个记号,比如关键字、变量名、运算符、数字,再由语法分析器根据编程语言的文法,检查代码是否符合语法规则,并构造出解析树。如果代码有语法错误,比如少了一个括号,语法分析器就会在这一步报错。解析树中包含了很多对后续处理并不重要的细节,比如括号、分号,因此编译器通常会把它进一步简化为抽象语法树,只保留代码的核心结构,作为后续的语义分析、优化和代码生成的基础。代码格式化工具、代码高亮、代码检查工具等也都依赖于对代码的语法分析。

在自然语言处理中

在自然语言处理中,句法分析,也就是为句子自动构造解析树,曾经是许多应用的重要基础步骤,比如机器翻译、信息抽取和问答系统。为了训练句法分析器,研究者建立了标注好解析树的语料库,叫作树库,比如宾夕法尼亚大学树库。除了以短语为单位的成分句法树,还有直接表示词与词之间依存关系的依存句法树。如今,大语言模型可以在不进行显式句法分析的情况下直接理解和生成语言,但句法分析仍然在语言学研究和一些需要精确结构信息的应用中使用。