编译原理04自上而下语法分析PPT课件
合集下载
程序设计语言与编译原理 自上而下的语法分析课件
S → AB|bc
B → a|c
B → a|c
A → Ad|Sbc|d
A → bcbcPQ|dPQ Q → BbcPQ|ε
直接左递归 间接左递归 P → dP|ε S → AB|bc S → AB|bc
B → a|c
B → a|c
A → SbcP|dP A → ABbcP|bcbcP|dP
P→dP|ε
P γP’ P’αP’|βP’|
P βP’|γP’ P’αP’|
程序设计语言与编译
一般地: 改写为:
A→Aα1|Aα2|…|Aαm|β1|β2|…|βn ( α i ≠ ε , β j 不以A开头)
A→β1P’│ β2P’│. . . │ βnP’ P’→α1P’│α2P’│. .
.│αmP’│ε
xay的推导过程如右图
S
xAy aB ε
程序设计语言与编译
一般方法
产生式: A→αβ1|αβ2|…|αβn|δ
提取公共左因子α
A→αB|δ B→β1|β2|…|βn
程序设计语言与编译 四 . 消除左递归
1.消除直接左递归
P→Pα│β
改写为
P→P ’ P’→αP’│ε
PPα|Pβ|γ 改写为 PPα|β|γ 改写为
(4.3)
虽没有直接左递归,但S、Q、R都是左递归的
S⇒Qc⇒Rbc⇒Sabc
程序设计语言与编译
2.间接左递归的消除
例子:
A → Bc│a B → Ab
P ⇒+ Pα
⇒ A → Abc │a
改为:
A → aP’ P’→ bcP’│ ε
程序设计语言与编译
算法
1. 将文法G的所有非终结符按任一顺序排列,设为A1,…,An
编译原理第4章语法分析自上而下
Yn;当Y1 Y2 … Yi-1都ε时,(其中1≤i≤n),则FIRST(Y1){ε}、FIRST(Y2) -{ε} 、…、FIRST(Yi-1)- {ε},FIRST(Yi) 都包含在FIRST(X)中
(e) 当(d)中所有Yi * ε,(i=1,2,…n),则 FIRST(X)=FIRST(Y1)∪FIRST(Y2)∪…∪FIRST(Yn)∪{ε}
一 . 自上而下语法分析方法
给定文法G和源程序串$。从G的开始符 号S出发,通过反复使用产生式对句型中的 非终结符进行替换(推导),逐步推导出$ 。
是一种产生的方法,面向目标的方法。 分析的主旨是选择产生式的合适的侯选 式进行推导,逐步使推导结果与$匹配。
Ch4 语法分析 4.1 语法分析程序综述 4.1.2 语法分析的方法
计算Select集:
B ε | aD C AD | b
每个产生式的Select集合计算为:D aS | c
Select(SAB)= (first (AB) -{ε}) ∪Follow(S)={b,a,#}
Select(S bC)= first (bC)={b}
因为A B
Select(Aε)=(first (ε) -{}) ∪Follow (A)={c,a,#}
A ε | b B ε | aD C AD | b D aS | c
first(C)={first(A)-{}} ∪first(D) ∪first(b)={a,b, c}
first(D)={a} ∪{c}={a,c}
➢求出每个文法符号的FIRST集合后也就不难求出一个符号 串的FIRST集合
✓若符号串α∈V*,α=X1 X2 … Xn,当X1不能
∪{ε}
ε*,则置 ∈
(e) 当(d)中所有Yi * ε,(i=1,2,…n),则 FIRST(X)=FIRST(Y1)∪FIRST(Y2)∪…∪FIRST(Yn)∪{ε}
一 . 自上而下语法分析方法
给定文法G和源程序串$。从G的开始符 号S出发,通过反复使用产生式对句型中的 非终结符进行替换(推导),逐步推导出$ 。
是一种产生的方法,面向目标的方法。 分析的主旨是选择产生式的合适的侯选 式进行推导,逐步使推导结果与$匹配。
Ch4 语法分析 4.1 语法分析程序综述 4.1.2 语法分析的方法
计算Select集:
B ε | aD C AD | b
每个产生式的Select集合计算为:D aS | c
Select(SAB)= (first (AB) -{ε}) ∪Follow(S)={b,a,#}
Select(S bC)= first (bC)={b}
因为A B
Select(Aε)=(first (ε) -{}) ∪Follow (A)={c,a,#}
A ε | b B ε | aD C AD | b D aS | c
first(C)={first(A)-{}} ∪first(D) ∪first(b)={a,b, c}
first(D)={a} ∪{c}={a,c}
➢求出每个文法符号的FIRST集合后也就不难求出一个符号 串的FIRST集合
✓若符号串α∈V*,α=X1 X2 … Xn,当X1不能
∪{ε}
ε*,则置 ∈
编译原理完整课件_第4章 语法分析-自上而下分析
2022/3/20
中南大学软件学院 陈志刚
6
第四章 语法分析-自上而下分析
4.2 自上而下分析面临的问题
➢ 顾名思义,自上而下就是从文法的开始符号出 发,向下推导,推出句子。 • 带回溯的分析方法 • 不带回溯的递归子程序(递归下降)分析方 法
➢ 自上而下分析的主旨: 对任意输入串,试图用一切可能的办法,从文 法开始符号(根结)出发,自上而下地为输入 串建立一棵语法树。或者说,为输入串寻找一 个最左推导。
设 ,有P→Pα|β,若α≠>ε,β不以P开头 (否则不可能消除左递归)。
则改写为:
可消除左递归。
2022/3/20
中南大学软件学院 陈志刚
12
第四章 语法分析-自上而下分析
一般地,若 αi≠ε,βj不以P开头, 则可改写为:
从而消除直接左递归。 ■ 例:S→Sabc|Sab|ab ■ 消除直接左递归得:
2022/3/20
中南大学软件学院 陈志刚
13
2、完全消除左递归 分析
第四章 语法分析-自上而下分析
虽不含直接左递归,但
所以含有左递归。
■ 如果文法G不含回路( ),也不含ε产生式,
则下列算法可消除左递归(完全)
①把G的非终结符按任意顺序排列成P1,…,Pn
②for i:=1 to n do
begin for j:=1 to i-1 do
➢ 关键:对一个文法,当给你一串(终结)符号 时,怎样知道它是不是该文法的一个句子呢? 这就要判断,看是否能从文法的开始符号出发 推导出这个字符串。或者,从概念上讲,就是 要建立一棵与输入串相匹配的语法分析树。
2022/3/20
中南大学软件学院 陈志刚
编译原理-自上而下的语法分析
高效性
由于从文法的最顶端开始分析, 一旦发现不匹配,就可以立即终 止当前分支的搜索,避免不必要 的计算,提高了编译器的效率。
易于处理左递归文
法
自上而下的分析方法可以很方便 地处理含有左递归的文法,而左 递归是许多实际编程语言的重要 特征。
局限性
无法处理左边界问题
自上而下的分析方法在处理某些含有左边界的文法时可能 会遇到问题,因为这种方法会优先匹配最左边的符号,而 左边界问题需要从右往左匹配符号。
案例三
在编译器优化中,自上而下的语法分析被用 于识别和修改源代码中的冗余和低效的语法 成分。例如,在C编译器的实现中,自上而 下的语法分析可以用于优化循环结构,减少 不必要的循环次数,提高程序的执行效率。
自上而下的语法分析还可以用于代码生成和 代码生成器的实现。通过识别和解析源代码 中的语法成分,可以生成更高效、更安全的 机器代码或字节码,提高程序的执行效率和
安全性。
THANKS
感谢观看
详细描述:递归下降分析算法易于理解,每个产生式规 则对应一个函数,函数的实现相对简单明了。
详细描述:对于每个产生式规则,需要编写相应的递归 函数,可能会导致代码冗余。
移入-规约分析算法
总结词
基于栈的算法
详细描述
移入-规约分析算法是一种自上而下的语法分 析算法,它将目标语句从左到右依次读入, 并根据文法的产生式规则进行移入或规约操 作,直到找到目标语句的语法结构。
词法分析
词法分析是编译过程的第一步,也称为扫描或词法扫描。它的任务是从左 到右读取源代码,将其分解成一个个的记号或符号。
词法分析器通常使用正则表达式或有限自动机来识别和生成记号,这些记 号可以是关键字、标识符、运算符、标点符号等。
编译原理第4章PPT课件
2、主旨:对任何输入串,试图用一切可能的 办法,从开始符号出发,自上而下 地为输入串建立一棵语法树。
4
§4.2自上而下面临的问题
二、举例: 自上而下方法的分析过程本质上
是一种试探过程,是反复使用不同产生 式谋求匹配输入串的过程。
5
§4.பைடு நூலகம்自上而下面临的问题
例:文法 SxAy A**|*
输入串α :x*y
(1)把文法G的所有VN按任一种顺序排列成 P1,P2,…,Pn;按此顺序执行; (2)FOR i = 1 To n Do
Begin For j :=1 To i-1 Do 把形如PiPjγ的规则改写成 Piδ1γ|δ2γ|…|δkγ 其中Pjδ1|δ2|…|δk是关 于Pj的所有规则; 消除关于Pi规则的直接左递归性
F T’ + T
iℇ
E’ ℇ
F(E) |i
F
T’
输入串:i+i; 如右图所示
i
ℇ
19
§4.3LL(1)分析法
2、由上分析是不是就意味着:当非终结符 A面临输入符号a,且a不属于A的任意候 选首符集,但A的某个候选首符集包含ℇ时, 就一定可以使A自动匹配?
分析:只有当a是在文法的某个句型中允许跟在A 后的终结符时,才可能允许A自动匹配,否则,a 在这里的出现是一种语法错误。
14
§4.3LL(1)分析法
2、当不得回溯时,对文法有什么要求?
∀ 非终结符A的各个候选的首符集的交集均为空。
分析:Aα
first(α)={a|α⇒* a…,a∈ VT} 若α⇒* ℇ ,则规定ℇ∈ first(α)
即:first(α)是α的所有可能推导的开头终结符或可能
的ℇ。
此时,当要求A匹配输入串时,A根据它所面临的第
4
§4.2自上而下面临的问题
二、举例: 自上而下方法的分析过程本质上
是一种试探过程,是反复使用不同产生 式谋求匹配输入串的过程。
5
§4.பைடு நூலகம்自上而下面临的问题
例:文法 SxAy A**|*
输入串α :x*y
(1)把文法G的所有VN按任一种顺序排列成 P1,P2,…,Pn;按此顺序执行; (2)FOR i = 1 To n Do
Begin For j :=1 To i-1 Do 把形如PiPjγ的规则改写成 Piδ1γ|δ2γ|…|δkγ 其中Pjδ1|δ2|…|δk是关 于Pj的所有规则; 消除关于Pi规则的直接左递归性
F T’ + T
iℇ
E’ ℇ
F(E) |i
F
T’
输入串:i+i; 如右图所示
i
ℇ
19
§4.3LL(1)分析法
2、由上分析是不是就意味着:当非终结符 A面临输入符号a,且a不属于A的任意候 选首符集,但A的某个候选首符集包含ℇ时, 就一定可以使A自动匹配?
分析:只有当a是在文法的某个句型中允许跟在A 后的终结符时,才可能允许A自动匹配,否则,a 在这里的出现是一种语法错误。
14
§4.3LL(1)分析法
2、当不得回溯时,对文法有什么要求?
∀ 非终结符A的各个候选的首符集的交集均为空。
分析:Aα
first(α)={a|α⇒* a…,a∈ VT} 若α⇒* ℇ ,则规定ℇ∈ first(α)
即:first(α)是α的所有可能推导的开头终结符或可能
的ℇ。
此时,当要求A匹配输入串时,A根据它所面临的第
自上而下的语法分析
非终结符
初值 第1次扫描 第2次扫描
M
未定
T
B
D
未定
是
未定
是
未定
是
是
SELECT(T→Ba)={d,e,b,a,ε} SELECT(T→ε) = {d,e,b,a,#} 这两者的交集不为 ∅ 。 故该文法不是 LL(1) 文法。
5.5.2 LL(1)分析一般过程
给定文法: S → aSbS|ε 。求符号串 ab 的 LL(1) 分析过程。
* FIRST(A)= {a|A = a…,且 a∈VT } >
求FIRST集合
G: M T B D
文法规则
→ TB → Ba|ε → Db|eT|ε → d|ε
第一遍 第二遍 第三遍
M T T B B B D D
→ TB → Ba →ε → Db → eT →ε →d →ε
F(M)={ } F(T)={ } F(T)={ε} F(B)={ } F(B)={e} F(B)={e,ε} F(D)={d} F(D)={d,ε}
G2[S]: S→Ap S→Bq A→cA A→a B→dB B→b FIRST(Ap) = { a,c } FIRST(Bq) = { b,d } FIRST(S) = FIRST(Ap) ∪FIRST(Bq) = { a,b,c,d }
SБайду номын сангаас
A p
G3[S]: S→aA S→d A→bAS A→ε
FOLLOW(B)=FOLLOW(B)∪{a}={#,a} FOLLOW(D)=FOLLOW(D)∪{b}={b} FOLLOW(T)=FOLLOW(T)∪FOLLOW(B)={d,e,b,#}∪{#,a} ={d,e,b,a,#}
编译原理第四章语法分析-自上而下分析
• 例 4.4
4.4 递归下降分析程序构造
• 递归下降分析器:
这个分析程序由一组递归过程组成的,每个过程对应 文法的一个非终结符。 E→TE’ E’→+TE’| T→FT’ T’→*FT’| F→(E)|i
PROCEDURE E BEGIN T ; E’ END PROCEDURE E’ IF SYM=‘+’THEN BEGIN ADVANCE ; T ; E’ END
4.2 自上而下分析面临的问题
• 例4.1 假定有文法
(1) SxAy (2)A**|*
对输入串x*y,构造语法树。 • 构造过程:
(1)把S作为根 (2)用S的产生式构造子树 (3)让输入串指示器IP指向输入串的第一个符号。
S x A y x
S
A y x
S
A y
*
*
*
(4)调整输入串指示器IP与叶结点进行匹配。 (5)如果为非终结符,用A的下一个产生式构建子树。 (6)如果匹配成功则结束;否则,回溯到步骤(4)。
• 一个反例:
– 文法:SQc|c;QRb|b;RSa|a虽然不是直接 左递归,但S、Q、R都是左递归。
• 消除左递归算法:
– 算法的思想是:
• • • • 首先构造直接左递归; 再利用一般转换规则,消除直接左递归 化简文法。 下面算法在不含PP,也不含在右部产生式时可以消除 左递归。
• 消除一个文法的左递归算法:
(1) 把文法 G 的所有非终结符按任一种顺利排列成 P1…Pn;按此顺序执行; (2) FOR i:=1 TO n DO
BEGIN FOR j:=1 TO i-1 DO 把形如Pj+1→Pj 的规则改写成 Pj+11|1|…k| 。其中 Pj1|1|…k 是关于 Pj 的 所有规则; 消除关于Pi规则的直接左递归性。 END 化简由(2)所得的文法。即去除那些从开始符号出发永 远无法到达的非终结符的产生规则。
《编译原理》第4章自上而下语法分析
• 从语法树的角度看,从根节点出发,反复使用 所有可能的产生式,谋求输入串的匹配,试图 向下构造一棵语法树,其末端节点正好与输入 符号串相同。
• 需要反复试探。
•问题1:回溯(P67)
x
S A y
• 例1:设有文法 (1) S xAy (2) A **|* 现有输入串:x*y 其分析过程如右:
•消除回溯
• 方法是:反复 “提取公共左因子”,使得文法 的每个非终结符号的各个候选式的首终结符集 两两不相交,来避免回溯。 设产生式为: A→δ α1|δ α2|…|δ αn
替换为:
Aδ A' A' α1|α2|…|αn
• 例3:有如下两个产生式:
<IF语句> if E then S1 else S2; <IF语句> if E then S1;
First(A1) = {a} First(A2) = {c} First(B1) = {b} First(B2) = {d}
• 在右边给定的文法中,A 的候选式有两个,其首终 结符集为: First(A1) = {*} First(A2) = {*} 相交,就会产生回溯
(1) S xAy
(2) A **|*
结论:能够从开始符号出发推导出给定的输入串,
因此,是句子。
• 常用的语法分析方法:
根据建立语法分析树的方法来分,有两大类,分四小类:
自顶向下分析法: 从文法的开始符号出发,向下推导(使用最左推 导) ,尽可能使用各种产生式,推导出与输入串 匹配的句子,从而建立语法树。
自底向上分析法: 从输入符号串开始,逐步进行归约(最右推导的 逆过程),直至归约到文法的开始符号,从而建 立语法树。 具体分类:
• 需要反复试探。
•问题1:回溯(P67)
x
S A y
• 例1:设有文法 (1) S xAy (2) A **|* 现有输入串:x*y 其分析过程如右:
•消除回溯
• 方法是:反复 “提取公共左因子”,使得文法 的每个非终结符号的各个候选式的首终结符集 两两不相交,来避免回溯。 设产生式为: A→δ α1|δ α2|…|δ αn
替换为:
Aδ A' A' α1|α2|…|αn
• 例3:有如下两个产生式:
<IF语句> if E then S1 else S2; <IF语句> if E then S1;
First(A1) = {a} First(A2) = {c} First(B1) = {b} First(B2) = {d}
• 在右边给定的文法中,A 的候选式有两个,其首终 结符集为: First(A1) = {*} First(A2) = {*} 相交,就会产生回溯
(1) S xAy
(2) A **|*
结论:能够从开始符号出发推导出给定的输入串,
因此,是句子。
• 常用的语法分析方法:
根据建立语法分析树的方法来分,有两大类,分四小类:
自顶向下分析法: 从文法的开始符号出发,向下推导(使用最左推 导) ,尽可能使用各种产生式,推导出与输入串 匹配的句子,从而建立语法树。
自底向上分析法: 从输入符号串开始,逐步进行归约(最右推导的 逆过程),直至归约到文法的开始符号,从而建 立语法树。 具体分类:
编译原理自上而下语法分析【PPT】51页PPT
设而常关。 32、鼓腹无所思。朝起暮归眠。 33、倾壶绝余沥,窥灶不见烟。
34、春秋满四泽,夏云多奇峰,秋月 扬明辉 ,冬岭 秀孤松 。 35、丈夫志四海,我愿不知老。
谢谢你的阅读
❖ 知识就是财富 ❖ 丰富你的人生
71、既然我已经踏上这条道路,那么,任何东西都不应妨碍我沿着这条路走下去。——康德 72、家庭成为快乐的种子在外也不致成为障碍物但在旅行之际却是夜间的伴侣。——西塞罗 73、坚持意志伟大的事业需要始终不渝的精神。——伏尔泰 74、路漫漫其修道远,吾将上下而求索。——屈原 75、内外相应,言行相称。——韩非
34、春秋满四泽,夏云多奇峰,秋月 扬明辉 ,冬岭 秀孤松 。 35、丈夫志四海,我愿不知老。
谢谢你的阅读
❖ 知识就是财富 ❖ 丰富你的人生
71、既然我已经踏上这条道路,那么,任何东西都不应妨碍我沿着这条路走下去。——康德 72、家庭成为快乐的种子在外也不致成为障碍物但在旅行之际却是夜间的伴侣。——西塞罗 73、坚持意志伟大的事业需要始终不渝的精神。——伏尔泰 74、路漫漫其修道远,吾将上下而求索。——屈原 75、内外相应,言行相称。——韩非
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5
❖ 例4.1:假定有文法(4.1) S→xAy A→**|*
分析输入串x*y(记为α)。
S
S
S
x Ay
x Ay x A y
***来自(a)(b)(c)
6
❖ 由上例看到,自上而下分析法存在许多困难和缺点
文法的左递归性P+ Pα使分析陷入无限循环 回溯的不确定性,要求我们将已经完成工作推倒重来 虚假匹配问题 难于知道出错位置 效率低,代价高,实践价值不大
END
③ 化简上述文法
11
例4.3:考虑文法:SQc|c
Q Rb|b
R Sa|a
消除左递归。
解:将终结符排序为R、Q、S。对于R不存在直接左递归。把R带入 到Q中有关的候选式: Q Sab|ab|b
现在Q同样不含直接左递归,把它带入S的有关候选式:
S Sabc|abc|bc|c 经消除S的直接左递归后我们们得到整个文法
❖ 下图表明了语法分析器在编译程序中的地位
源程序
词法分析器
单词符号 取下一
语法分析器
语法 分析树
单词符号
后续部分
符号表
❖ 按照语法分析树的建立方法,我们可以粗略地把语法分析方 法分为两类:一类是自上而下分析法,另一类为自下而上分 析法
3
例:自顶向下构造最左推导(aabbaa) SaASa A SbA SS ba
执行任务。这个候选就是那个终结首符集含a 的
14
❖ 如何把一个文法改造成任何终结首符集的所有候选首符集两 两不相交呢?其办法是提取公共左因子
❖ 假定关于A 的规则是 A1| 2| … |n| 1| 2|… |m (其中每个不以开头)
那末,可以把这些规则改写成: A A’| 1| 2|… |m A’ 1 | 2 | …| n
P | 1 P’| 2 P’|…| n P’ P’1P’| 2P’| …| mP’|
9
❖ 例4.2:文法
E→E+T|T
T→T*F|F
F→(E)|i
消去直接左递归:
E→TE’
E’→+TE’|ε
T→FT’
(4.2)
T’→*FT’|ε
F→(E)|i
❖ 直接左递归和非直接左递归的消除方法均在必须掌握之列
S aAS aSbAS aabAS aabbaS aabbaa
S
aA
S
S bAa
a
ba
4
2 自上而下分析面临的问题
❖ 自上而下分析的一般方法:对任何输入串,用一切 可能的方法从文法开始符号(根结)出发,自上而 下地为输入串建立一棵语法树,或寻找一个最左推 导
❖ 这种分析过程本质上是一种试探过程,是反复使用 不同产生式谋求匹配输入串的过程
❖ 因此,为解决这些问题我们要消除左递归和回溯
7
3 LL(1) 分析法
3.1 左递归的消除 3.2 消除回溯、提左因子 3.3 LL(1)分析条件
8
3.1 左递归的消除
❖ 一般而言,假定P关于的全部产生式是 PP1| P2|…| Pm| 1| 2 |… | n
其中,每个都不等于,而每个都不以P开头,那 么,消除P的直接左递归性就是把这些规则改写成:
A 1 | 2 |…| n
则:
FIRST(i) FIRST(j) = (i j )
③ 对文法中每一个非终结符A,若它存在某个候选首符集
包含,则
FIRST(A) FLLOW(A)=
❖ 一个文法若满足以上条件,则称该文法G为LL(1) 文法
i+i
E
IP
T
E’
(a)
i+i
E
T
E’
IP
F
T’
i (c)
i+i
E
T
E’
IP
F
T’
(b)
i+i
i+i
E
IP
T
E’
IP
F
T’
i
ε
(d)
E
T
E’
F
T’ + T E’
i
ε F T’ε
iε (e)
17
❖ 假定S是文法G开始符号,对任何非终结符A定义:
FOLLOW(A) = { a | S* …Aa…, aVT } ❖ 若S* …A, 则规定# FOLLOW(A). 也就是说,
❖ 若* ,则规定 FIRST()。 换句话说 FIRST()是的所有可能推导的开头终结符或可能 的
13
❖ 如果非终结符A 的所有候选首符集两两不相交,即
A的任何两个不同的候选i和j
FIRST(i) FIRST(j) =
那么,当要求A匹配输入串时,A 就能根据它所面 临的第一个输入符号a,准确地指派某个候选前去
编
译
自上而下
技 术
语法分析
之
四
主讲
❖ 高级语言的语法结构适合用上下无关文法描述,因 此,我们将上下文无关文法作为语法分析的基础
❖ 本章和下一章,我们将介绍编译程序构造中的一些 典型的语法分析方法
2
1 语法分析器功能
❖ 语法分析是编译过程的核心部分。它的任务是在词法分析识
别出单词符号串的基础上,分析并判定程序的语法结构是否 符合语法规则
FOLLOW(A)是所有句型中出现在紧接A之后的终结 符或‘#’
❖ 因此,当非终结符A面临输入符号a,且a不属于A 的任意候选首符集但A的某个候选首符集包含时, 只有当a∈FOLLOW(A),才可能允许A自动匹配
18
❖ 判断某给定文法是否为LL(1)文法其条件为:
① 文法不含左递归
② 对于文法中每个非终结符A的各个产生式的候选首符集 两两不相交。即,若
10
❖ 若一个文法不含回路(P* P),也不含以ε为右部 的产生式,则消除一切左递归的算法是:
① 把文法G的所有非终结符排序:P1, P2, … , Pn
② FOR i:=1 TO n DO
BEGIN
FOR j:=1 TO i-1 DO
{ 把形如Pi→Pjγ的规则改写成
Pi→δ1γ|δ2γ|…|δkγ 其中Pj→δ1|δ2|…|δk是关于Pj的所有规则;} 消除关于Pi规则的直接左递归性
S abcS’|bcS’|cS’
S’ abcS’|
Q Sab|ab|b
R Sa|a
由于关于Q,R的规则式多余的则可化简得到:
S abcS’|bcS’|cS’
S’abcS’|
12
3.2 消除回溯、提左因子
❖ 令G是一个不含左递归的文法,对G 的所有的非终 结符号的每个候选定义它的终结首符集FIRST() 为: FIRST()={a| *a…,aVT}
15
例:有产生式 B bBcA|b
由于FIRST(bBcA) FIRST(b) ={b} ,则需要提 取公共左因子,将产生式改写成:
B bC C BcA|
16
❖ 问题
3.3 LL(1)分析条件
E→TE’ E’→+TE’|ε T→FT’ T’→*FT’|ε F→(E)|i
例4.4:考虑文法4.2,对输入串i+i进行自上而下分析
❖ 例4.1:假定有文法(4.1) S→xAy A→**|*
分析输入串x*y(记为α)。
S
S
S
x Ay
x Ay x A y
***来自(a)(b)(c)
6
❖ 由上例看到,自上而下分析法存在许多困难和缺点
文法的左递归性P+ Pα使分析陷入无限循环 回溯的不确定性,要求我们将已经完成工作推倒重来 虚假匹配问题 难于知道出错位置 效率低,代价高,实践价值不大
END
③ 化简上述文法
11
例4.3:考虑文法:SQc|c
Q Rb|b
R Sa|a
消除左递归。
解:将终结符排序为R、Q、S。对于R不存在直接左递归。把R带入 到Q中有关的候选式: Q Sab|ab|b
现在Q同样不含直接左递归,把它带入S的有关候选式:
S Sabc|abc|bc|c 经消除S的直接左递归后我们们得到整个文法
❖ 下图表明了语法分析器在编译程序中的地位
源程序
词法分析器
单词符号 取下一
语法分析器
语法 分析树
单词符号
后续部分
符号表
❖ 按照语法分析树的建立方法,我们可以粗略地把语法分析方 法分为两类:一类是自上而下分析法,另一类为自下而上分 析法
3
例:自顶向下构造最左推导(aabbaa) SaASa A SbA SS ba
执行任务。这个候选就是那个终结首符集含a 的
14
❖ 如何把一个文法改造成任何终结首符集的所有候选首符集两 两不相交呢?其办法是提取公共左因子
❖ 假定关于A 的规则是 A1| 2| … |n| 1| 2|… |m (其中每个不以开头)
那末,可以把这些规则改写成: A A’| 1| 2|… |m A’ 1 | 2 | …| n
P | 1 P’| 2 P’|…| n P’ P’1P’| 2P’| …| mP’|
9
❖ 例4.2:文法
E→E+T|T
T→T*F|F
F→(E)|i
消去直接左递归:
E→TE’
E’→+TE’|ε
T→FT’
(4.2)
T’→*FT’|ε
F→(E)|i
❖ 直接左递归和非直接左递归的消除方法均在必须掌握之列
S aAS aSbAS aabAS aabbaS aabbaa
S
aA
S
S bAa
a
ba
4
2 自上而下分析面临的问题
❖ 自上而下分析的一般方法:对任何输入串,用一切 可能的方法从文法开始符号(根结)出发,自上而 下地为输入串建立一棵语法树,或寻找一个最左推 导
❖ 这种分析过程本质上是一种试探过程,是反复使用 不同产生式谋求匹配输入串的过程
❖ 因此,为解决这些问题我们要消除左递归和回溯
7
3 LL(1) 分析法
3.1 左递归的消除 3.2 消除回溯、提左因子 3.3 LL(1)分析条件
8
3.1 左递归的消除
❖ 一般而言,假定P关于的全部产生式是 PP1| P2|…| Pm| 1| 2 |… | n
其中,每个都不等于,而每个都不以P开头,那 么,消除P的直接左递归性就是把这些规则改写成:
A 1 | 2 |…| n
则:
FIRST(i) FIRST(j) = (i j )
③ 对文法中每一个非终结符A,若它存在某个候选首符集
包含,则
FIRST(A) FLLOW(A)=
❖ 一个文法若满足以上条件,则称该文法G为LL(1) 文法
i+i
E
IP
T
E’
(a)
i+i
E
T
E’
IP
F
T’
i (c)
i+i
E
T
E’
IP
F
T’
(b)
i+i
i+i
E
IP
T
E’
IP
F
T’
i
ε
(d)
E
T
E’
F
T’ + T E’
i
ε F T’ε
iε (e)
17
❖ 假定S是文法G开始符号,对任何非终结符A定义:
FOLLOW(A) = { a | S* …Aa…, aVT } ❖ 若S* …A, 则规定# FOLLOW(A). 也就是说,
❖ 若* ,则规定 FIRST()。 换句话说 FIRST()是的所有可能推导的开头终结符或可能 的
13
❖ 如果非终结符A 的所有候选首符集两两不相交,即
A的任何两个不同的候选i和j
FIRST(i) FIRST(j) =
那么,当要求A匹配输入串时,A 就能根据它所面 临的第一个输入符号a,准确地指派某个候选前去
编
译
自上而下
技 术
语法分析
之
四
主讲
❖ 高级语言的语法结构适合用上下无关文法描述,因 此,我们将上下文无关文法作为语法分析的基础
❖ 本章和下一章,我们将介绍编译程序构造中的一些 典型的语法分析方法
2
1 语法分析器功能
❖ 语法分析是编译过程的核心部分。它的任务是在词法分析识
别出单词符号串的基础上,分析并判定程序的语法结构是否 符合语法规则
FOLLOW(A)是所有句型中出现在紧接A之后的终结 符或‘#’
❖ 因此,当非终结符A面临输入符号a,且a不属于A 的任意候选首符集但A的某个候选首符集包含时, 只有当a∈FOLLOW(A),才可能允许A自动匹配
18
❖ 判断某给定文法是否为LL(1)文法其条件为:
① 文法不含左递归
② 对于文法中每个非终结符A的各个产生式的候选首符集 两两不相交。即,若
10
❖ 若一个文法不含回路(P* P),也不含以ε为右部 的产生式,则消除一切左递归的算法是:
① 把文法G的所有非终结符排序:P1, P2, … , Pn
② FOR i:=1 TO n DO
BEGIN
FOR j:=1 TO i-1 DO
{ 把形如Pi→Pjγ的规则改写成
Pi→δ1γ|δ2γ|…|δkγ 其中Pj→δ1|δ2|…|δk是关于Pj的所有规则;} 消除关于Pi规则的直接左递归性
S abcS’|bcS’|cS’
S’ abcS’|
Q Sab|ab|b
R Sa|a
由于关于Q,R的规则式多余的则可化简得到:
S abcS’|bcS’|cS’
S’abcS’|
12
3.2 消除回溯、提左因子
❖ 令G是一个不含左递归的文法,对G 的所有的非终 结符号的每个候选定义它的终结首符集FIRST() 为: FIRST()={a| *a…,aVT}
15
例:有产生式 B bBcA|b
由于FIRST(bBcA) FIRST(b) ={b} ,则需要提 取公共左因子,将产生式改写成:
B bC C BcA|
16
❖ 问题
3.3 LL(1)分析条件
E→TE’ E’→+TE’|ε T→FT’ T’→*FT’|ε F→(E)|i
例4.4:考虑文法4.2,对输入串i+i进行自上而下分析