330 likes | 483 Views
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 为:
E N D
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的语法树:
E E E + i E E * i i 推导1、推导2的语法树 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 i 推导3的语法树 句型i * i + i 的推导过程3(另一个最左推导): E E * E i * E i * E + E i * i + 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 则可有下图所示的两棵不同的语法分析树: <Stm> <Stm> then <Exp> <Stm> else <Stm> if <Exp> then <Stm> if e1 S2 e1 <Stm> then <Exp> <Stm> else <Stm> then if <Exp> if S1 S1 S2 e2 e2 if语句的二义性
三、语法树的应用1、句型分析的有关问题 • 短语 设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
2、一个有用的定理 定义1:由某一(非叶)结点及其所属分支组成的部分树称为原树的一棵子树。 定义2:只有单层分支的子树称为简单子树。 定理1: 1.每个句型都有一棵语法树,每个语法树的叶组成一句型。 2.每棵子树的叶组成短语,每棵简单子树的叶组成简单短语,最左简单子树的叶组成句柄。 3.用语法树可证明每个句子都有一规范推导。
E E T + T F T F * F i ( E ) E + T F T i 关于句型(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
作业:设有文法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 文法等价变换 • 文法的等价 对文法G1和G2,若有L(G1)=L(G2),则称文法G1和G2等价,记作:G1=G2。 • 文法等价变换
文法等价变换技术1:使文法开始符唯一并且不出现于任何产生式的右部文法等价变换技术1:使文法开始符唯一并且不出现于任何产生式的右部 定理2.1 对任一文法G1都可以构造文法G2,使得L(G1)=L(G2),且G2有这样的特点,即文法的开始符唯一并且不出现于任何产生式的右部。 证明:假设S是G1的开始符,在G1中扩充一条新产生式:ZS,其中Z是新的开始符。令这样扩充后的文法为G2,则它显然满足定理的要求。
文法等价变换技术2:消除空产生式 定理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 aBcD B 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 | ac B b DBB | B | d
文法等价变换技术3:消除无用产生式 • .无用产生式 若存在非终极符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
文法等价变换技术4:消除特型产生式 • 特型产生式 若文法中的产生式具有形式AB(B为非终极符),则称该产生式为特型产生式。 • 特型产生式的缺点是在语法分析中会降低分析的速度,因此应该消除这样的产生式。 • 定理2.4 对任一文法G1,可以构造文法G2,使得L(G1)=L(G2),并且在G2中没有特型产生式。
证明:构造无特型产生式的文法G2的方法如下:证明:构造无特型产生式的文法G2的方法如下: • (1) 对文法G1中任意非终极符A,求集合A={B | A=>+B, BVN}。 • (2) 若BA,且B是文法G中的一个非特型产生式,则补充如下规则A。 • (3) 去掉文法G1中的所有的特型产生式。 • (4) 去掉新的文法中的无用产生式。
例2.6 设有如下文法 AB | D | aB BC | b Cc DB | d 消除该文法中的特型产生式。 解:A={B, D, C} B={C} C={ } D={B, C} 根据算法第2步在文法中补充如下规则 Ab | d | c Bc Db | c 去掉文法中的特型产生式,得到如下文法 A aB | b | d | c B b | c C c D b | c | d 其中关于C 和D的产生式是无用产生式,应去掉。
文法等价变换技术5:消除公共前缀 • 公共前缀:表示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:消除直接左递归 • 文法的递归性: • 对文法中的某个非终极符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’ | • 使用这个办法,我们容易把文法中所有直接左递归都消除掉,但这并不意味着已经消除整个文法的左递归性。
文法等价变换技术7:消除左递归 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)所得的文法。即消除那些不可到达的非终极符的产生式规则。3、化简由(2)所得的文法。即消除那些不可到达的非终极符的产生式规则。
例:SQc | c QRb | b RSa | a 非终极符的排序为R、Q、S消除左递归后得: SabcS’ | bcS’ | cS’ S’abcS’ | QSab | ab | b RSa | a 其中关于Q和R的规则是多余的。经化简后: SabcS’ | bcS’ | cS’ S’abcS’ |
例:SQc | c QRb | b RSa | a • 非终极符排序为S、Q、R,那么,最后所得的无左递归的文法是: SQc | c QRb | b RbcaR’ | caR’ | aR’ R’bcaR’ |