第5章 自顶向下语法分析方法-g

合集下载

ch5-自顶向下语法分析方法-v2

ch5-自顶向下语法分析方法-v2

26
4. 计算SELECT集
27
28
5.3 非LL(1)文法到LL(1)文法的等价变换
在确定的自顶向下分析中,要求对给定语言的文法必须 是LL(1)文法,然而不一定每个语言都有LL(1)文法。 如何对一个语言的非LL(1)文法变换为等价的LL(1)形式? 由LL(1)文法的定义知道,当文法中含有直接或间接左递归, 或含有左公共因子时,这样的文法肯定不是LL(1)文法。 因此,首先设法消除文法中的左递归与提取左公共因子 对文法进行等价变换。在某些情况下,使其变换为LL(1)文法。
语法分析就是识别由词法分析给出的单词符号序列是 否是给定文法的正确句子(程序). 语法分析常用的方法:
自顶向下分析
自底向上分析 自底向上分析分为: 算符优先分析 LR分析
2
第五章 自顶向下语法分析
自顶向下分析(面向目标的分析方法) 从文法的开始符号出发企图推导出与输入的单词串完全相 匹配的句子. 自顶向下分析方法分为: 确定的分析方法-对文法有一定的限制。 不确定的分析方法-回溯的分析方法,一种穷举的试 探方法。
18
例题分析: 求文法中符号与符号串的FIRST集。
G[S]: S->AB | bC A->b |ε B->aD |ε C->AD | b
D->aS | c
FIRST(S)=FIRST(A)∪FIRST(B)∪{ε} ∪{b}={b,a, ε} FIRST(A)={b} ∪{ε}={b, ε} FIRST(B)={ε} ∪{a}={a, ε} FIRST(C)={FIRST(A)- {ε}}∪FIRST(D) ∪FIRST(b)={b,a, c} FIRST(D)={a} ∪{c}={a, c}

第5章-自顶向下语法分析方法

第5章-自顶向下语法分析方法
第5章 自顶向下语法分析方法
语法分析的主要工作: 是识别由词法分析给出的单词序列是否是给定的
正确句子(程序)。
பைடு நூலகம்语法分析常用的方法: 自顶向下的语法分析和自底向上的语法分析两大
类。
自顶向下分析思想
自顶向下的方法: 从文法的开始符号(设为〈程序〉)开始进行分析,
逐步推导的往下构造语法树,使其树叶正好构造出所给 定的源程序串(输入串)。
例5.1若有文法G[S]:
S → pA S → qB
A → cAd A→a
若有输入串w = pccadd.
考察自顶向下的推导过程。
解:推导过程为:
S pA pcAd pccAdd pccadd 其相应的语法树见右图:
S pA
cAd c Ad
a
这个文法的特点:
[1]每个产生式的右部都由终结符号开始。 [2]如果两个产生有相同的左部,那么它们的右部由不同的终 结符开始。
FOLLOW(A)的元素。
因此当文法中含有形如: A→α和 A→β的产生式时,其中 A∈VN ,α,β∈V*,当α和β不同时推导出空串时,设α * ε,β\ * ε, 则当FIRST(α) ∩(FIRST(β)∪FOLLOW(A))=φ时,对于非终结符 A的替代仍可唯一地确定候选。
定义5.3:
定义选择符集合SELECT如下: 对于给出上下文无关文法的产生式
自顶向下方法的关键: 是在推导过程中确定的选择候选式的问题。
自顶向下的主要思想: 从开始符出发导出句型并一个符号一个符号地与
给定输入串 (终结符串)进行匹配。如果全部匹配成功, 则表示开始符号可推导出给定的终结符串。因此判定 给定终结符号串是正确句子。
自顶向下的缺点:

软件工程 编译原理 第五章 自顶向下的语法分析方法

软件工程 编译原理 第五章 自顶向下的语法分析方法

P→1P | 2P |… | mP |
(2)消除间接左递归
对于间接左递归的消除需先将间接左递归变为直接左 递归,然后再按a)消除直接左递归。
例:文法G为例: (1) A→aB (2) A→Bb (3) B→Ac (4) B→d 用产生式(1)、(2)的右部 代替产生式(3)中的非终 结符A得到左部为B的产 生式为: (1) B→aBc (2) BG的产生式为: (1) S→aSb (2) S→aS (3) S→ε 请提取文法中的左公因子
对产生式(1)、(2)提取左公因子后得: S→ aS(b|ε) S→ε 进一步变换为文法G′: S→aSA A→b A→ε S→ε
例2:若文法G的产生式为: (1) A→ad (2) A→Bc (3) B→aA (4) B→bB 请提取文法中的隐式左公因子。 对文法G2分别用(3)、(4)的右 部替换(2)中的B,可得: 提取产生式(1)、(2)的左 (1) A→ad 公共因子得: (2) A→aAc A→a(d|Ac) (3) A→bBc A→bBc (4) B→aA B→aA (5) B→bB B→bB
由上面所举例子可以说明以下问题:
① 不一定每个文法的左公共因子都能在有限的步骤内 替换成无左公共因子的文法,上面文法G4就是如此。 ② 一个文法提取了左公共因子后,只解决了相同左部 产生式右部的FIRST集不相交问题,当改写后的文法 不含空产生式,且无左递归时,则改写后的文法是 LL(1)文法,否则还需用LL(1)文法的判别方式进行判 断才能确定是否为LL(1)文法。
例:文法G(E):
E→TE E→+TE | T→FT T→*FT | F→(E) | i
每个非终结符有对应的子程序的定义, 首先在分析过程中,当需要从某个非终 结符出发进行展开(推导)时,就调用这 个非终结符对应的子程序。

《编译原理》课后习题答案第5章

《编译原理》课后习题答案第5章

《编译原理》课后习题答案第5章《编译原理》课后习题答案第5章.pdf《编译原理》课后习题答案第5章.pdf第5章自顶向下语法分析方法第1题对文法G[S] S→a|∧|(T) T→T,S|S(1) 给出(a,(a,a))和(((a,a),∧,(a)),a)的最左推导。

(2) 对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。

(3) 经改写后的文法是否是LL(1)的?给出它的预测分析表。

(4) 给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。

答案:(1) 对(a,(a,a)的最左推导为:S(T) (T,S) (S,S) (a,S) (a,(T)) (a,(T,S)) (a,(S,S)) (a,(a,S)) (a,(a,a))对(((a,a),∧,(a)),a) 的最左推导为:S(T) (T,S) (S,S) ((T),S) ((T,S),S) ((T,S,S),S) ((S,S,S),S) (((T),S,S),S) (((T,S),S,S),S) (((S,S),S,S),S) (((a,S),S,S),S) (((a,a),S,S),S) (((a,a),∧,S),S) (((a,a),∧,(T)),S)(((a,a),∧,(S)),S)《编译原理》课后习题答案第5章.pdf《编译原理》课后习题答案第5章.pdf(((a,a),∧,(a)),S) (((a,a),∧,(a)),a)(2) 改写文法为:0) S→a 1) S→∧ 2) S→( T ) 3) T→S N 4) N→, S N 5) N→ε非终结符FIRST集FOLLOW集S {a,∧,(} {#,,,)} T {a,∧,(} {)} N {,,ε} {)}对左部为N的产生式可知:FIRST (→, S N)={,} FIRST (→ε)={ε} FOLLOW (N)={)}由于SELECT(N →, S N)∩SELECT(N →ε) ={,}∩ { )}= 所以文法是LL(1)的。

第11课 第5章_自顶向下语法分析方法_思想

第11课 第5章_自顶向下语法分析方法_思想




FIRST(A)就是A开头的终结符, 直观的说就是A的开头字母 注意:First集合不仅仅针对非终 结符。 Nullable:可致空的
6
例子
S aA | d A bAS |
S aA abAS abS abd
?
7
Follow集
c | S A , 且c FIRST ( ), FOLLOW ( A) VT , V , A VN
3
确定分析的思想
S→pA|qB A→cAd|a B→dB|b 试分析串 pccadd

文法
S
pA pccadd
pcAd
pccAdd
4
例子
S→Ap,S →Bq, A →a,A →cA B →b,B →dB 分析串ccap有如下结论:

S
Ap
cAp
ccAp
ccap
5
开始符号集
FIRST ( A) c | A cB, c VT , A, B V
10
定理
一个CFG是LL(1)的充要条件是: 对每个非终结符A的不同产生式,满 足: Select A Select A
11
程序中错误的级别

lexical,譬如拼错了关键字 syntactic,譬如括号没有成对 semantic,譬如操作数与操作符不匹配 logical,譬如无限的递归调用
12
引用的统计数据


60%的程序在语法和语义上是正确的 存在错误的语句,有80%只有一个错误, 13%有两个 大部分错误都是极小的错误
13

第5部分自顶向下语法分析方法-

第5部分自顶向下语法分析方法-
调用返回
编译原理
对 和Aβ不→同α,时A推→导β其出中空A时∈(V设N ,α不α, 推β ∈导V出N空*,,当β推α 导出空),则当 FIRST(α)∩(FIRST(β)∪FOLLOW(A))=Φ时, 对于非终结符A的替换仍可唯一地确定候选。
编译原理
定义:给定上下文无关文法的产生式A→α, A若∈α V*Nε,, α则∈SVEL*,ECT(A→α)=FIRST(α) 如果α *ε,则 SELECT(A→α)=FIRST(α)∪FOLLOW(A)
FOLLOW(S)= {#} FOLLOW(A)= {a,c,#} FOLLOW(B)= {#} FOLLOW(C)= {#} FOLLOW(D)= {#}
4.计算SELECT集
S→AB S→bC A→ε A→b B→ε B→aD C→AD C→b D→aS D→c
SELECT(S→AB)={a,b,ε,#} SELECT(S→bC)={b} SELECT(A→ε)={a,c,#,ε} SELECT(A→b)={b} SELECT(B→ε)={#,ε} SELECT(B→aD)={a} SELECT(C→AD)={a,b,c} SELECT(C→b)={b} SELECT(D→aS)={a} SELECT(D→c)={c}
• 3.若XY…是一个产生式且YVN,则把FIRST(Y)中 的所有非元素都加到FIRST(X)中;若X Y1Y2…YK 是一个产生式,Y1,Y2,…,Y(i-1)都是非终
结符,而且,对于任何j,1≤j ≤i-1,FIRST(Yj)都含 有元(素即都Y加1..到Y(Fi-I*1R) ST(X)),中则;把特F别IR是ST,(若Yj所)中有的的所有非 FIRST(Yj , j=1,2,…,K)均含有,则把加到 FRIST(X)中.

(完整版)编译原理第五章作业参考答案

(完整版)编译原理第五章作业参考答案

SELECT(F PF/ )=FIRST(P)={(,a,b,^};
SELECT(F/ *F /)={*}; SELECT(F/ ε )=FOLLOW(F/)={(,a,b,^,+,),#};
SELECT(P (E))={(}
SELECT(P a)={a}
SELECT(P b)={b}
SELECT(P ^)={^} 可见,相同左部产生式的
if(CH== ’ aR’E)AD(CH);// 产生式 S a else if(CH== ’ ^ ’ ) READ(C产H)生;//式 S ^ else if(CH== ’产( ’生)式// S (T) {
READ(CH); P_T(); IF (CH= =’ ) ’TH)EN READ(CH) else ERROR } else ERR; } void P_T()// 非终结符 S 的子程序 { if(IsIn(CH,FIRST_SU)) //FIRST_SU 为 T SU 的右部的 FIRST 集合 { P_S(); P_U(); } } void P_U()// 非终结符 U 的子程序 { if(CH== ’ , ’产生)//式 U , SU
3.已知文法 G[S] :
S MH|a
H LSo| ε K dML|ε
L eHf
M K|bLM 判断 G是否是 LL( 1)文法,如果是,构造 LL( 1)分析表。 解: 首先求各非终结符的 FIRST 集合:
FIRST 集合有:
FIRST(E)=FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^}; FIRST(E / )={+, ε }
FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^}; FIRST(T / )=FIRST(T) ∪ { ε }={(,a,b,^, ε };

自顶向下语法分析方法

自顶向下语法分析方法

7
PL/0语言文法的EBNF表示
PL/0语言文法的EBNF表示 <程序>∷=<分程序>. <分程序>∷=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句> <常量说明部分>∷=CONST<常量定义部分>{,<常量定义>}; <无符号整数>∷=<数字>{<数字>} <变量说明部分>∷=VAR<标识符>{,<标识符>}; <标识符>∷=<字母>{<字母>|<数字>} <过程说明部分>∷=<过程首部><分程序>{;<过程说明部分>}; <过程首部>∷=PROCEDURE <标识符>; <语句>∷=<赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>| <读语句>|<写语句>|<复合语句>|<空> <赋值语句>∷=<标识符>:=<表达式> <复合语句>∷=BEGIN <语句>{;<语句>} END <条件>∷=<表达式><关系运算符><表达式>|ODD<表达式>
例如对文法G3[S]: S→aAS|b A→bA| SELECT(S→aAS)={a} SELECT(S→b)={b} SELECT(A→bA)={b} SELECT(A→)={a,b}

第5章自顶向下语法分析方法

第5章自顶向下语法分析方法

(A,b)
(B,a) (B,d) 推导成功
注意:#是输入结束符
以上最左推导所建立输入串acbad的语法树如图 所示。
S
a c b A B A B d
a
选择产生式是唯一的
在第 2 步推导时,当前要替换的非终结 符为 A ,面临的输入符为 c ,所以选择 A 的产生式来推导时,只能选产生式 A→cA,而不能选A→bB。同样,在第 5 步推导时,当前要替换的非终结符为 B , 面临的输入符为d,所以选择B的产生式 来推导时,只能选产生式B→d,而不能 选B→a。这样就保证上述每一步推导都 是确定的。
文法的特点
文法G2有以下两个特点:
(1)每个产生式的右部都由终结符号开始;
(2)如果两个产生式有相同的左部,那么它们 的右部由不同的终结符开始。 对于这样的文法显然在推导过程中完全 可以根据当前要替换的非终结符和输入符 号决定选择哪个产生式往下推导,因此分 析过程是唯一确定的。
示例二
【例4.3】若有文法G3[S]为: S→Aa S→Bb A→c A→dA B→e B→fB
不确定的语法分析方法――带回溯的自顶向下 分析法――实际上是一种穷举的试探方法,当 分析不成功时则推翻以前的分析退回到适当位 置再重新试探其余候选式可能的推导,这样需 要记录已选过的产生式,直到把所有可能的推 导序列都试完仍不成功才能确认输入串不是该 文法的句子而报错。由于在编译程序真正实现 时往往是边分析边插入语义动作,因而带回溯 的语法分析方法代价很高,效率很低,在实用 编译程序中几乎不用,因此对它实现的详细算 法不做介绍。
(S,a)
(A,c)
S→aAB
aca#
3 acAB
4 acε B 5 aca

(完整版)编译原理第五章作业参考答案

(完整版)编译原理第五章作业参考答案

第五章自顶向下语法分析方法1.对文法G[S]S→a|∧|(T)T→T,S|S(1)给出(a,(a,a))和(((a,a),∧,(a)),a)的最左推导。

(2)对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。

(3)经改写后的文法是否是LL(1)的?给出它的预测分析表。

(4)给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。

解:(1) (a,(a,a))的最左推导为S→(T)→(T,S)→(S,S)→(a,(T))→(a,(T,S))→(a,(S,a))→(a,(a,a))(((a,a),∧,(a)),a)的最左推导为S→(T)→(T,S)→(S,a)→((T),a)→((T,S),a)→((T,S,S),a)→((S,∧,(T)),a)→(((T),∧,(S)),a) →(((T,S),∧,(a)),a)→(((S,a),∧,(a)),a)→(((a,a),∧,(a)),a)(2)由于有T→T,S的产生式,所以消除该产生式的左递归,增中一个非终结符U有新的文法G/[S]:S→a|∧|(T)T→SUU→,SU|ε分析子程序的构造方法对满足条件的文法按如下方法构造相应的语法分析子程序。

(1) 对于每个非终结号U,编写一个相应的子程序P(U);(2) 对于规则U::=x1|x2|..|xn,有一个关于U的子程序P(U),P(U)按如下方法构造:IF CH IN FIRST(x1) THEN P(x1)ELSE IF CH IN FIRST(x2) THEN P(x2)ELSE ......IF CH IN FIRST(xn) THEN P(xn)ELSE ERROR其中,CH存放当前的输入符号,是一个全程变量;ERROR是一段处理出错信息的程序;P(xj)为相应的子程序。

(3) 对于符号串x=y1y2...yn;p(x)的含义为:BEGINP(y1);P(y2);...P(yn);END如果yi是非终结符,则P(yi)代表调用处理yi的子程序;如果yi是终结符,则P(yi)为形如下述语句的一段子程序IF CH=yi THEN READ(CH) ELSE ERROR即如果当前文法中的符号与输入符号匹配,则继续读入下一个待输入符号到CH中,否则表明出错。

自顶向下语法分析方法

自顶向下语法分析方法

因此,该文法不是LL(1)文法,因而也就不 可以采用确定的自顶向下分析方法。
22
教学总结
语法分析是编译过程中不可缺少的重要阶段,其 主要功能是对词法分析生成的单词流进行分析,识别 各种语法成分。 语法分析方法有自顶向下和自底向 上两种,有自顶向下分析法又有确定和不确定两种。 一个上下文无关文法是LL(1)文法的充分必要条 件是对每个非终结符A的两个不同产生式: A,Aβ满足Select(A)∩Select(Aβ)=,其 中、β不同时 。 LL(1)文法可以采用自顶向下分析方法。
教学重点:
1.LL(1)文法的定义; 2.求first集合、follow集合与select集合
教学难点 :
求first集合、follow集合与select集合
教学课时:2 教学方法:多媒体教学 教学内容和步骤 :(如下) 3
第4章我们学习词法分析,介绍词法分析 的工具(主要讲正规文法)和方法(DFA和 NFA)。 本章介绍语法分析:在词法分析的基础上, 分析句子是否正确。
33
3. 计算Follow 集: 方法一:根据定义计算 算法如下: (1)设S为开始符号,则#follow(S); (2)若A→αBβ是一个产生式,则把FIRST(β )或 {}加至FOLLOW(B)中; (3)若A→αB是一个产生式,或A→αBβ是一个产 * 生式而β (即FIRST(β )),则把 FOLLOW(A)加至FOLLOW(B)中. 即:Follow(A)是所有句型中出现在紧接A之后 的终结符或“#”。
(#表示输入串的结束符,或句子括号)
13
也可以定义为:
* …Aa…, a∈V } Follow(A)={a|S T * …A,则#∈Follow(A)。 若S

编译原理之自顶向下语法分析方法(25页)

编译原理之自顶向下语法分析方法(25页)
*
间接左递归 若 PP α S→Aa A→Sb A→b
2021/8/25
5
消除左递归
消除直接左递归 形如:P → P α| β α非, β不以P打头
改写为:P → βP’ P’ → αP’|
2021/8/25
6
消除左递归
例:E → E+T|T T →T*F|F F →(E)| i
G[ E]: (1) E → TE’ (2) E’ → +TE’| (3) T → FT’ (4) T’ → *FT’ | (5) F → (E)|i
A →Bb|b
2021/8/25
10
回溯问题
例:S →iEtS|iEtSeS|a
E→b
判断句子ibtaea
提取左公因子:A →αβ1|αβ2
变为:
A →αA’
A’ →β1 |β2
若A →αβ1|αβ2 |…|αβn|r
变为:
A →αA’|r
A’ →β1 |β2|…|βn
2021/8/25
11
例:S →iEtS|iEtSeS|a
2021/8/25
Procedure E’; IF sym=‘+’ then Begin advance; T;E’ End;
Procedure T’; IF sym=‘*’ then Begin advance; F;T’ End;
14
3非递归的预测分析方法(LL(1))
一、总控程序 Input
24
非LL(1)文法的改造
消除左递归 提左公因子
2021/8/25
25
22
三、LL(1)文法:
一个文法G,若它的分析表M不含多重定义入 口,则称为LL(1)文法。

第五章 自顶向下语法分析方法

第五章 自顶向下语法分析方法

情况3
文法的特点是:文法中含有空产生式。 文法G3[S]: S → aA|d A → bAS|ε 识别串w=abd是否是G3[S]的句子
设 G=(VT,VN,S,P)是上下文无关 文 法,A∈VN,S是开始符号 * FOLLOW(A)={a|S μAβ,且 a∈VT,a∈FIRST(β),μ∈VT* ,β∈V+} * * 若S μAβ,且β ε, 则#∈FOLLOW(A)。 也可定义为: FOLLOW(A)={a|S …Aa…,a ∈VT} * * 若有S …A,则规定#∈FOLLOW(A) '#'作为输入串的结束符

文法G5[S]为:S→aAS|b A→bA|ε SELECT(S→aAS)={a} SELECT(S→b)={b} SELECT(A→bA)={b} SELECT(A→ε)={a,b} 所以 SELECT(S→aAS)∩SELECT(S→b)={a}∩{ b}= φ SELECT(A→bA)∩SELECT(A→ε)={b}∩{a ,b}≠ φ 不是LL(1)文法,因而也就不可能用确定的自顶 向下分析
FIRST ( ) ( FIRST ( x j { })) FIRST ( xi )
j 1
i 1
当所有FIRST(Xj)(1≤j≤n)都含有{ε}时,
FIRST ( )
FIRST ( x ){ }
j j 1
n
文法G7[S]为: S→AB S→bC B→ε B→aD D→aS D→c
A→ε A→b C→AD C→b
FIRST(S)={FIRST(A)\{ε}}∪{FIRST(B)\ {ε}} ∪{ε}∪{b}={b,a,ε} FIRST(A)={b}∪{ε}={ b,ε} FIRST(B)={ε}∪{a}={a,ε} FIRST(C)={FIRST(A)\{ε}}∪FIRST(D)∪ FIRST (b)={b,a,c} FIRST(D)={a}∪{c}={a,c} FIRST(S)={a,b,ε} FIRST(A)={b,ε} FIRST(B)={a,ε} FIRST(C)={a,b,c} FIRST(D)={a,c}
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
确定的自顶向下分析 确定的自顶向下分析方法对文法要求比较严格, 必须无二义性、且消除左递归和回溯。 典型的方法是递归下降分析方法和LL分析方法。
递归下降分析方法便于手工构造语法分析器。
LL分析法便于用语法分析器的自动构造工具,自 动构造语法分析器。
8
5.1 语法分析概述
(2)自底向上分析方法 语法分析从底部到顶部为输入的符号串建立分析树。 最常见的LR分析方法就是自底向上分析方法。而且 是确定的。
例:S Sa | b, 改为: S b | Sa ,若推导’baa’
S b (不行) S b S a S S b a S a
(不行)
33
3. 自上而下分析法的问题及解决

Q2:左递归文法将使自上而下分析陷入无限循环
2. 将左递归右递归(或迭代) (解决方法2)
如: 左递归文法 S Sa | b 生成语言 L = ba* 右递归文法: S bA A aA|ε

下 语 法 分
(消除左递归和回溯)
非确定的自顶向下语法分析

(带回溯)
14
构造最左推导的关键问题 在构造最左推导的过程中,面对当前读入的单 词符号a和当前被替换的非终极符A,应该选择A的 哪条候选式去替换它(推导)。 关键: 找出选择一个非终极符号的候选式的方法。
15
构造最右推导的关键问题 在构造最右推导的过程中,面对当前读入的单 词符号a,已分析过的符号串中是否已构成一个产 生式的右部,即句柄(可归约)。如果已构成句 柄,即用相应的产生式左部(非终结符号)去替换它 (归约)。
18
5.2.1 带回溯的自顶向下语法分析
例如: 文法G[S] S →aAb A →** | *
S b * a A * (c) 试探成功
19
利用自顶向下语法分析,分析 a*b 是否是合法的句子。
S a A (a) b S a A *
b
(b) 试探失败
2. 带回溯的自顶向下语法分析面临的问题
问题(1): 出现回溯
或 E T{+T} (迭代) T F{*F} F (E) | a
35
5.2.2 消除左递归
1.消除直接左递归
若关于A的全部规则为
A Aα1 | Aα2 | …| Aαm | β1 | β2 | … | βn 其中, 每个αi都不等于ε ,每个βi都不以A开头 则消除左递归,得 A (β1 | β2 | … | βn )A’
由于文法中同一非终极符的各候选式有公共的左因 子或隐含有公共的左因子,使得推导无法选择唯一的候 选式,导致盲目试探。
如: S →aS|ab
20
2.带回溯的自顶向下语法分析面临的问题
问题(2): 左递归问题 无论是直接左递归的, 还是间接左递归的,都会 使分析过程无法终止。 例如:
U → Uα 用于最左推导:
2. 定理
(1)每一个CFG,都对应一个PDA M,使L(M)=L(G)
(2)存在一个PDA,它识别的语言不能被任何确定的
PDA识别。 归纳:对上下文无关语言的分析,并不总是能以确定 的方式进行,需要回溯。
27
二、上下文无关语言的识别装置:Push Down Automata
小结 1.能够进行确定分析的语言称为确定语言。

例1 G[S]: (1)ScAd | dBa (3) Aa
(2) Aab
(4) Bcd | c, 则‘cad’是否为文法的句子
S
S c A d
S c A d a b
S c A d a
‘dcda’ 是
‘dcdc’ 分析过程是一个试探过程,必须一一试探所有候选式,直至 不是
与输入串匹配成功,或者判定输入串不是正确句子。
23
二、上下文无关语言的识别装置:Push Down Automata
例1. PDA识别成对的括号串,可由 G: SS(S) | ε产生。
(确定)PDA定义如下:
M = ( {A}, {“(”, “)”}, {0, I)}, f, {A}, I) 其中: (1) f ( A,I,“(” ) =(A, I0) (2) f ( A,0,”(” ) =(A, 00) (3) f ( A,0,”)” ) =(A, ε) (4) f ( A, I, ε) =(A, ε)
5
5.1 语法分析概述
2 两类语法分析技术
w * w l
语 法
分析器
S
自顶向下分析 w
语 法 分析器 自底向上分析 S * w r
5.1 语法分析概述
(1)自顶向下分析方法 语法分析从顶部(树根、文法的开始符号)到 底部(叶子、语言的终结符号)为输入的符号串建 立分析树。
Hale Waihona Puke 75.1 语法分析概述
状态A对应读串的前一半,状态B对应读串的后一半。读前一半时,将所读符号置于 栈顶;读后一半时,边读边与栈顶符号比较,相等则移掉栈顶符号,否则出错。26
(4) f(A, 1, 0)={(A, 10)} (6) f(A, 1, 1)={(A, 11), (B, ε)}
二、上下文无关语言的识别装置:Push Down Automata
否歧义,但对某些具体文法存在判定算法
如:LL文法和LR文法,可证是非歧义文法,并且
存在算法,能检查一文法是否是LL或LR文法
29
三、自上而下的分析方法

1.主旨:从文法的开始符号S出发,反复使用各种产生式,寻
找”匹配”于输入符号串的推导(从S(根)出发,向下逐步建
立语法树,最终:为输入串寻找一个最左推导)
9
5.1 语法分析概述
LR分析法能适应一大类文法,在实际中有较强的适 用性和广泛的应用。 LR分析法便于用语法分析器的自动构造工具,自 动构造语法分析器。当前应用最广泛的工具之一是 YACC(Yet Another Compiler Compiler)系列。
10
5.1 语法分析概述
3. 语法分析要点 (1)程序设计语言的绝大部分语法特性属于上下文无关 的,因此语法分析是以上下文无关文法(CFG)作为 程序设计语言语法分析的基础。
或迭代
S b{a}
34
5.2.2 消除左递归
1.消除直接左递归

AAα|β, α,β ∈ (VN∪VT)*, A ∈ VN, β不以A开头 A ′αA ′|ε 或 A β{α}
则:A βA′
[例] 文法 E E+T | T T T*F | F F (E) | a 消除左递归,得 E TE’ E’ +TE’ | ε T FT’ T’ *FT’ |ε F (E) | a
常用的方法有:
递归下降分析: 利用程序设计语言的递归函数实现,
每个函数对应文法的一个非终极符。
LL(1)分析:由一张预测分析表和一个总控程序组成。 预测分析表给出了当面临输入符号时,运用到非终极符 的推导所选用的产生式。
13
5.2 自顶向下语法分析概述
自 顶 确定的自顶向下语法分析
递归下降分析
预测分析法 ( LL (1) )
… S S a
S
a
a
31
3. 自上而下分析法的问题及解决

Q1: 回溯
低效、耗时,对高度递归的语言,无法接受。
解决方案:
对文法加以一定的限制,使每次对候选式的选择是唯一
的,从而进行确定的自上而下分析。
如:LL(1)文法。(详见5.3节)
32
3. 自上而下分析法的问题及解决

Q2:左递归文法将使自上而下分析陷入无限循环 1. 重排规则顺序 (解决方法1)
3
5.1 语法分析概述
例如:对C程序语句“IF (a<10) b=5;”
词法分析识别出了IF、(、标识符、…等单词符号;
而语法分析则要检查这些单词之间的搭配、结构 是否正确。IF后面是否为(,(后面是否为正确的表 达式等等。
4
5.1 语法分析概述
语法分析是编译过程的核心部分。 主要任务:
按照程序语言的语法规则,在词法分析输出的单 词符号串中识别出各类语法成分,同时进行语法 检查,为语义分析和代码生成作准备。 执行语法分析任务的程序叫语法分析程序或语法 分析器。
其中: (1) f(A, I, 0)={(A ,I0)}
(2) f(A, I, 1)={(A, I1)} (3) f(A, 0, 1)={(A, 01)} (5) f(A,0,0)={(A,00), (B, ε)} (7) f(B, 0, 0)={(B, ε)} (8) f(B, 1, 1)={(B, ε)} (9) f(B, I, ε)={(B, ε)} (10) f(A, I, ε)={(A, ε)}
A’ (α1 | α2 | …| αm )A’ | ε
或 A (β1 | β2 | … | βn ){α1 | α2 | …| αm } 迭代
36
5.2.2 消除左递归
2.消除间接左递归
[例] G[S]: S Qc | c
Q Rb | b
R Sa | a 因 S Qc Rbc Sabc, 是左递归文法


大多数的编程语言是确定的
语法分析的任务:有效地模拟PDA
2.固有歧义的语言:就是根本不存在非歧义文法的
语言。
28
二、上下文无关语言的识别装置:Push Down Automata
3 . 文法的非歧义性是不可判定的

只有文法是非歧义的,语法分析才可唯一进行

虽然不存在算法能在有穷步内确定任意文法是
第五章 自顶向下语法分析方法
5.1 语法分析概述 5.2 自顶向下语法分析概述 5.3 LL分析法(预测分析法) 5.4 递归子程序
1
5.1 语法分析概述
相关文档
最新文档