2.1.4 语法树与文法二义性
DESCRIPTION
2.1.4 语法树与文法二义性. 一、语法树(推导树、生成树或分析树) 目的:直观地描述推导过程。 设 G 是给定的文法,称满足下列条件的树为 G 的一棵语法树。 1. 每个节点都标有 G 的一个文法符号,且根节点标有初始符 S ,非叶节点标有非终极符。 2. 如果一个非叶节点 A 按从左到右顺序有 n 个儿子节点 B 1 、 B 2 、 … 、 B n ,则 A B 1 B 2 …B n 一定是 G 的一个产生式。. 例 1: 文法 G=({+ ,* ,i ,( , ) },{ E }, E , P), 其中 P 为: - PowerPoint PPT PresentationTRANSCRIPT
2.1.4 2.1.4 语法树与文法二义性语法树与文法二义性一、语法树(推导树、生成树或分析树) 目的:直观地描述推导过程。 设 G 是给定的文法,称满足下列条件的树为 G 的
一棵语法树。1. 每个节点都标有 G 的一个文法符号,且根节点标
有初始符 S ,非叶节点标有非终极符。2. 如果一个非叶节点 A 按从左到右顺序有 n 个儿子
节点 B1 、 B2 、…、 Bn ,则 AB1B2…Bn 一定是 G 的一个产生式。
例 1:文法 G=({+ ,* ,i ,( , ) },{ E }, E ,
P), 其中 P 为: E i E E + E E E * E E ( E )
考虑句型 i * i + i 的语法树:
G ( E ): E i| E + E| E * E| ( E )句型 i * i + i 的推导过程 1 (最左推导) : E E + E E * E + E i * E + E i * i + E i * i + I句型 i * i + I的推导过程 2 (非最左和最右推导) : E E + E E * E + E E * E + i E * i + i i * i + i
E + E
E
E * E
i i推导 1 、推导 2 的语法树
i
句型 i * i + i 的推导过程 3 (另一个最左推导) :
E E * E i * E i * E + E i * i + E i * i + i
推导 3 的语法树
E
E
* E
E + E
i i
i
语法树表示了在推导过程中施用了哪个产生式和施用在哪个非终极符上,它没有表明施用产生式的顺序。
一棵语法树表示了一个句型的种种可能的不同推导过程,但未必是所有的不同推导过程。
一个句型未必对应唯一的一棵语法树。 一个句型未必只有唯一的一个最左(最右)推
导。
二、文法二义性 对一个文法 G ,如果至少存在一个句子,
有两棵(或两棵以上)不同的语法树,则称该句子是二义性的。包含有二义性句子的文法称为二义性文法,否则,该文法是无二义性的。
例 2: <Stm> →if <Exp> then <Stm> else <Stm>
<Stm> →if <Exp> then <Stm>
<Stm> → ......
假设有条件语句
if e1 then if e2 then s1 else s2
则可有下图所示的两棵不同的语法分析树:
if 语句的二义性
if
if
then
<Stm>
<Stm><Stm>
<Stm>
elsethen<Exp>
<Exp>e1
e2S1
S2
<Stm>
<Stm><Stm>
<Stm>
elsethenif
thenif
<Exp>
<Exp>
e1
e2S1 S2
三、语法树的应用三、语法树的应用11 、句型分析的有关问题、句型分析的有关问题 短语 设 S 是文法的开始符,是句型 ( 即有
S * ),如果满足条件: S * A
A + 则称是句型的一个短语。 直接短语(简单短语)如果满足条件:
S * A
A 则称是句型的一个简单短语。 句柄 一个句型可能有多个简单短语,其中最
左的简单短语称之为句柄。
文法 G:
E T | E + T
T F | T * F
F ( E ) | i
(T+i)*i+F 是 G 的一个句型。其推导过程如下:
E E+T T+T T*F+T F*F+T
( E ) * F+T ( E + T ) * F+T ( T + T ) * F + T ( T + F ) * F +T ( T + i ) * F +T ( T + i ) * i + F
短语有 8 个: 1.(T+i)*i+F 2.(T+i)*i 3.(T+i) 4.T+i 5.T 6. 第一个 i 7. 第二个 i 8.F简单短语有 4 个: T, 第一个 i, 第二个 i,F句柄有 1 个: T
22 、一个有用的定理、一个有用的定理
定义 1 :由某一 ( 非叶 ) 结点及其所属分支组成的部分树称为原树的一棵子树。
定义 2 :只有单层分支的子树称为简单子树。定理 1 : 1. 每个句型都有一棵语法树,每个语法树的叶组成
一句型。 2. 每棵子树的叶组成短语,每棵简单子树的叶组成
简单短语,最左简单子树的叶组成句柄。 3. 用语法树可证明每个句子都有一规范推导。
关于句型 (T+i)*i+F短语有 8 个: 1.(T+i)*i+F 2.(T+i)*i 3.(T+i) 4.T+i 5.T 6. 第一个 i 7. 第二个 i 8.F简单短语有 4 个: T, 第一个 i, 第二个 i, F句柄有 1 个: T
E
E + T
T
T * F
iF
( E )
E + T
T
i
F
F
作业:设有文法 G:
• E T | E + T
• T F | T * F
• F ( E ) | i
i (1) *i (2) +i (3) 是 G 的一个句子,( 1 )画出该句子的语法分析树
( 2 )给出该句子的最左推导和最右推导
( 3 )找出该句子的所有短语,简单短语,句柄
2.1.5 2.1.5 文法等价变换文法等价变换
文法的等价 对文法 G1 和 G2 ,若有 L(G1)=L(G2) ,
则称文法 G1 和 G2 等价 , 记作 :G1=G2 。文法等价变换
文法等价变换技术文法等价变换技术 11 :使文法开始符唯一:使文法开始符唯一并且不出现于任何产生式的右部并且不出现于任何产生式的右部
定理 2.1 对任一文法 G1 都可以构造文法 G2 ,使得 L(G1)=L(G2) ,且 G2 有这样的特点,即文法的开始符唯一并且不出现于任何产生式的右部。证明:假设 S 是 G1 的开始符,在 G1 中扩充一条新产生式: ZS ,其中 Z 是新的开始符。令这样扩充后的文法为 G2 ,则它显然满足定理的要求。
文法等价变换技术文法等价变换技术 22 :消除空产生式:消除空产生式 定理 2.2 对于任一文法 G1 ( L(G1) ),可构
造文法 G2 ,使得 L(G1)=L(G2) ,并且 G2 中无空产生式。证明:根据 G1 ,构造 G2 的方法如下:(1) 令 ={A | A} ,即表示文法 G1 中所有右部为的产生式的左部非终极符的集合。(2) 递归扩充直到收敛为止,即 ={A | A + , +} 。
– (3) 从 G1 中删除所有空产生式。– (4) 从 G1 中删除只能导出空串的非终极符。– (5) 对于文法中每一个产生式: AX1X2…Xi-1XiXi+1… Xn
Xi (i=1,2,…,n) 有三种情况: 若 Xi VT ,不做动作; Xi VN - ,不做动作; 若 Xi ,补充规则: A X1X2…Xi-1Xi+1…Xn ;重复这个过程,直到不出现新的产生式为止。
例 :设有如下文法A aBcDB b | D BB | d
消除该文法中的空产生式。解: ={B, D} ,根据算法中第 5 步可以增加下列产生
式 由 A aBcD 得 : A acD A aBc由 D BB 得 : D B
由 A acD 得 : A ac由 A aBc 得 : A ac
去掉文法中的空产生式 B ,得到新的文法如下A aBcD | acD | aBc | acB bDBB | B | d
文法等价变换技术文法等价变换技术 33 :消除无用产生式:消除无用产生式 . 无用产生式 若存在非终极符 A ,它
不出现于该文法的任何一个句型中,则关于 A 的产生式是多余的(无用产生式、不可到达的产生式)。
定理 2.3 对任一文法 G1 都可以构造文法 G2 ,使得 L(G1)=L(G2) ,并且G2 中的每个非终极符必出现在它的某个句型中。
证明:根据 G1 ,构造文法 G2 的方法如下:(1) 令 ={Z | Z 是文法的开始符 } 。(2) 递归扩充直到收敛为止,即: ={B | AxByG1, BVN, A} 。(3) 若一个产生式左部非终极符 A ,则删
除以 A 为左部的所有产生式。例:消除下列文法中的无用产生式
G[A]:
A aB | b | d | c
B b | c
C c
D b | c | d
文法等价变换技术文法等价变换技术 44 :消除特型产生式:消除特型产生式
特型产生式 若文法中的产生式具有形式AB ( B 为非终极符),则称该产生式为特型产生式。
特型产生式的缺点是在语法分析中会降低分析的速度,因此应该消除这样的产生式。
定理 2.4 对任一文法 G1 ,可以构造文法G2 ,使得 L(G1)=L(G2) ,并且在 G2 中没有特型产生式。
证明:构造无特型产生式的文法 G2 的方法如下:– (1) 对文法 G1 中任意非终极符 A ,求
集合 A={B | A=>+B, BVN} 。– (2) 若 BA ,且 B 是文法 G 中的
一个非特型产生式,则补充如下规则A 。
– (3) 去掉文法 G1 中的所有的特型产生式。
– (4) 去掉新的文法中的无用产生式。
例 2.6 设有如下文法AB | D | aBBC | bCcDB | d
消除该文法中的特型产生式。解: A={B, D, C} B={C}
C={ } D={B, C}
根据算法第 2 步在文法中补充如下规则 Ab | d | c
BcDb | c
去掉文法中的特型产生式,得到如下文法A aB | b | d | cB b | c C c
D b | c | d其中关于 C 和 D 的产生式是无用产生式,应去掉。
文法等价变换技术文法等价变换技术 55 :消除公共前缀:消除公共前缀 公共前缀 : 表示 A 的不同产生式的右部具有相同的前
缀,这种情形不满足自顶向下的语法分析条件。 可用提取左因子的方法消除产生式的公共前缀。假定
关于A的规则是:A1 | 2 |…| n | 1| 2 |…| γm ( 其中每个不以开
头 )则将这些规则写成: AA’ | 1 |γ2|…|γm
A’1 | 2 |…|n
经过反复提取左因子,就能够把每个非终极符所有产生式的首符集变成两两不相交。
例 : 在 Pascal 语言中,语句和表达式的产生式都有公共前缀:
Stm id := Exp
Stm id(ExpL)
ExpL Exp
ExpL Exp, ExpL
通过提取左因子法消除公共前缀得到下面产生式:Stm id Stm’
Stm’:= Exp
Stm’ ( ExpL )
ExpLExp ExpL’
ExpL’, Exp ExpL’
ExpL’
文法等价变换技术文法等价变换技术 6:6: 消除直接左递归消除直接左递归 文法的递归性:
– 对文法中的某个非终极符 A ,若有产生式:A→A… ,则称 A 是直接左递归的。
– 对文法中的某个非终极符 A ,若有产生式: A→…A ,则称 A 是直接右递归的。
– 对文法中的某个非终极符 A ,若有产生式: A→…A… ,则称 A 是直接递归的。
– 对文法中的某个非终极符 A ,若有: A=>+A… ,则称 A 是左递归的。
– 对文法中的某个非终极符 A ,若有: A=>+… A ,则称 A 是右递归的。
– 对文法中的某个非终极符 A ,若有: A=>+… A … ,则称 A 是递归的。
左递归情形,一定使得自顶向下的语法分析分析条件不成立。
直接左递归的简单情形: A Aα | β
即有 A=>βαα…α (至少有一个 α )。可用下面非直接左递归的产生式定义:
A βA’
A’ αA’ |
直接左递归的一般情形:– AA1| A2|…| An|1|2|…|n
– 其中,每个都不等于,每个都不以A 开头。用下面产生式定义:
– A(1|2|…|n)A’– A’(1| 2|…| n)A’ |
使用这个办法,我们容易把文法中所有直接左递归都消除掉,但这并不意味着已经消除整个文法的左递归性。
文法等价变换技术文法等价变换技术 77 :消除左递归:消除左递归1 、把文法 G 的所有非终极符按任意一种顺序排
列: P1,P2…Pn ;2 、 FOR i:=1 TO n DO
BEGIN FOR j:=1 TO i-1 DO
把形如 PiPj 的规则改写成: Pi1|2|…|k ,
其中: Pj1|2|…|k
是关于 Pj 的所有规则;消除关于 Pi 规则的直接左递归;
END
3 、化简由( 2 )所得的文法。即消除那些不可到达的非终极符的产生式规则。
例: SQc | c QRb | b RSa | a
非终极符的排序为 R 、 Q 、 S 消除左递归后得:SabcS’ | bcS’ | cS’S’abcS’ | QSab | ab | bRSa | a
其中关于 Q 和 R 的规则是多余的。经化简后:SabcS’ | bcS’ | cS’S’abcS’ |
非终极符排序为 S 、 Q 、 R ,那么,最后所得的无左递归的文法是:SQc | c
QRb | b
RbcaR’ | caR’ | aR’
R’bcaR’ |
例: SQc | c QRb | b RSa | a