语法分析树用图形方式展现了从文法的开始符号推导出相应语言中的符号串的过程。在具体理解语法分析树之前需要先理清楚一些基本概念:
①.产生式
用变量expr来表示表达式,用变量stmt表示语句,那么这个构造规则可以表示为:stmt--->if(expr)stmtelse stmt
其中的箭头(--->)可以读作“可以具有以下形式”,这样的规则称为产生式。
②.文法定义
关于文法定义中的终结符和非终结符,就参看另外一篇转载的文章。
语法分析树:
注释:零个终结符号组成的串称为空串,记为∈。
举例说明: 9 - 5 + 2的语法树
分析:根节点的标号为list,即为文法开始的符号。得出文法产生式:
list ---> list + digit
根节点的子节点经过类似推导:
list ---> list - digit
list ---> digit
digit---> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
一棵语法分析树的叶子节点从左向右构成了树的结果,也就是从根节点上的非终结符号推导得到的符号串:9 - 5 + 2
一句话:为一个给定的终结符号串构建一棵语法分析树的过程称为对该符号串进行语法分析
理解了以上的内容之后,可以尝试做一下龙书第二章的习题,以加深理解:
2.2.1: 考虑下面的上下文无关文法:
S → SS+ | SS* |a
1)试说明如何使用该文法生成串aa+a*。
2)试为aa+a*构造一个分析树。
3)该文法产生的语言是什么?
解答:
1)S => SS* => SS+S* => aa+a*
2)
3)以a为变量,+和*为二元操作符的后缀表达式
2.2.2 下面的文法产生什么语言?
1)S→0S1|01
{0n1n(n=1,2,…)}
2) S→+SS|-SS|a
以a为变量,+和-为二元操作符的前缀表达式
3)S→S(S)S|ε
括号的匹配
4)S→aSbS|bSaS| ε
由相同数目的a、b组成的字符串,或者空串。
5)S→a|S+S|SS|S*|(S)
以a为数据元素,具有合并、连接、闭包和括号操作符的表达式。a是表达式,若S是表达式则S+S(表达式的合并)、SS(表达式的串联)、S*(表达式的闭包运算)都是表达式。
2.2.3 练习2.2.2中哪些文法具有二义性?
—3、4、5具有二义性。
—可通过画某个串的分析树来说明