第四章 语法分析——自上而下分析

合集下载

第4章语法分析——自上而下分析

第4章语法分析——自上而下分析
<IF语句> if E then S1 else S2; <IF语句> if E then S1;
提取左因子后:
<IF语句> if E then S1 B; B else S2 |ε ;
第4章语法分析——自上而下分析
LL(1)分析条件:
是否满足:没有左递归,每个侯选式的首终结符集不相交这两个条 件,就一定能进行有效的自顶向下分析呢?
使A A。
如果是A A,则称为直接左递归,否则称为间接左递归。
例2:设有文法: (1) E->E+T|T
E E +T
(2) T->T*F|F
E +T
(3) F->(E)|i 现有输入串i*i+i, 其分析过程是:
E
+
T

产生的原因?
失败:由于使用最左推导,对左递归文法进 行自顶向下分析时,会导致死循环。
从推导的角度看,从开始符号出发,使用最左推导,试图 推导出与输入符号串相同的句子。
从语法树的角度看,从根节点出发,反复使用所有可能的 产生式,谋求输入串的匹配,试图向下构造一棵语法树, 其末端结点正好与输入符号串相同。
这是一个反复试探的过程。
第4章语法分析——自上而下分析
自顶向下分析面临的问题
第4章语法分析——自上而下分析
消除回溯的方法
反复使用“提取公共左因子”的方法来改造文法,使得文法 的每个非终结符号的各个候选式的首终结符两两不相交,来 避免回溯。
例:
设产生式为:
A→δα1|δα2|…|δαn 将其替换为:
AδA’
|…|α A’α1|α2
第4章语法分析——自上而下分析

语法分析-自上而下分析

语法分析-自上而下分析

经压缩后文法:
S→(abc|bc|c)S’ S’ →abc S’|ε
注意:由于对非终结符的排序不同,最后得到的文法在形 式上可能是不一样的,但是它们是等价的. 按S、Q、R排列, 代入后 S→Qc│c Q→Rb│b R→ Rbca│bca│ca│a 消除R中的直接左递归得 R→ bcaR’│caR’│aR’ R’→ bcaR’│
Z ·
c A d a Z · c A d a b
完成进一步推导Aab 检查,a-a匹配,b-d不匹配(失败) 但是还不能冒然宣布SL(G[Z]) 4. 回溯 即砍掉A的子树 改选A的第二右部 Aa 检查 a-a匹配 d-d匹配
分析工作要部 分地或全部地 退回去重做叫 回溯
建立语法树,末端结点为cad与输入cad相匹配, 建立了最左推导序列 EcAdcad ∴cadL(G(E))
2.回溯问题

什么是回溯?
分析工作要部分地或全部地退回去重做叫回溯

造成回溯的原因
公共左因子的存在 即A→1| 2 某个非终结符号的规则其右部有多个选择,形如
A → 1 | 2 | 3,根据所面临的输入符号不能 准确的确定所要选择时,就可能出现回溯。

回溯带来的问题
集合FIRST、FOLLOW: 1.FIRST集(与前同) 设α是文法G的一个符号串, α (VTVN)*,定义 FIRST(α)={a|α* a. . . , aVT} *ε,则εFIRST(α)。 特别若α
R→Sa|a
Q→Sab|ab|b
4.把Q代入S的右部选择 5.消除S的直接左递归
最后得到文法为:
S→Sabc|abc|bc|c S→(abc|bc|c)S’ S’ →abc S’|ε S→(abc|bc|c)S’ S’ →abc S’|ε

编译原理第4章 语法分析——自上而下分析

编译原理第4章 语法分析——自上而下分析

17
例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|*
分析输入串x*y(记为)。
x*y
S
IP x A y **
18
例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|*
分析输入串x*y(记为)。
x*y
S
IP x A y **
19
例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|*
(4.3)
虽没有直接左递归,但S、Q、R都是左递归的
SQcRbcSabc
一个文法消除左递归的条件
丌含以为右部的产生式
丌含回路
PP
30
例 文法G(S): S→Qc|c Q→Rb|b R→Sa|a
(4.3)
虽没有直接左递归,但S、Q、R都是左递归的
SQcRbcSabc
Q
Q

S
R
S→Qc|c Q→Rb|b R→Sa|a
35
例 考虑文法G(S)
S→Qc|c Q→Rb|b R→Sa|a
消除S的直接左递归后: S→abcS | bcS | cS S→abcS | Q→Sab |ab | b R→Sa|a
关于Q和R的觃则已是多余的,化简为:
S→abcS | bcS | cS
S→abcS |
(4.4)
36
注意,由于对非终结符排序的丌同,最 后所得的文法在形式上可能丌一样。但 丌难证明,它们都是等价的。
分析输入串x*y(记为)。
x*y
S
IP
15
例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|*
分析输入串x*y(记为)。

语法分析自上而下分析

语法分析自上而下分析
(), ∈V*, ∈V+ } 若S u A ,且 ε ,则#∈FOLLOW(A)
2019/9/8
中南大学软件学院 陈志刚
23
第四章 语法分析-自上而下分析
计算FIRST集
1.若XV,则FIRST(X)={X}
2.若XVN,且有产生式Xa…,则把a加入到 FIRST(X)中;若X也是一条产生式,则把也 加到FIRST(X)中.
2019/9/8
中南大学软件学院 陈志刚
20
第四章 语法分析-自上而下分析
1、LL(1)分析法的工作过程
开始往栈stack中放“#”,然后把文件开 始符号压栈。预测分析程序总是按stack栈顶符 号X和当前输入符号a行事。 ① 若X=a=”#”,则分析成功,停止分析 ② 若X=a”#”,则把X从栈顶弹出,a指向下一个
2019/9/8
中南大学软件学院 陈志刚
6
第四章 语法分析-自上而下分析
4.2 自上而下分析面临的问题
顾名思义,自上而下就是从文法的开始符号出 发,向下推导,推出句子。 • 带回溯的分析方法 • 不带回溯的递归子程序(递归下降)分析方 法
自上而下分析的主旨: 对任意输入串,试图用一切可能的办法,从文 法开始符号(根结)出发,自上而下地为输入 串建立一棵语法树。或者说,为输入串寻找一 个最左推导。
中南大学软件学院 陈志刚
10
第四章 语法分析-自上而下分析
其次,由于回溯就碰到一大堆麻烦事情。如果 我们走了一大段错路,最后必须回头,那么, 就应把已经做的一大堆语义工作推倒重来。
第三,在上述的自上而下分析过程中,当一个 非终结符用某一个候选匹配成功时,这种成功 可能仅是暂时的。
第四,当最终报告分析不成功时,我们难于知 道输入串中出错的确切位置。

第四章 语法分析——自上而下分析

第四章 语法分析——自上而下分析

FOLLOW(Y) =FOLLOE(X)=end
则有LL(1)表:
begin
d
:
end s #
P begind : X end
X
d:X
sY
Y
:sY
第四章 语法分析--自上而下分析
[例3]:给出语言L={1na0n1ma0m|n>0, m>=0} 的LL(1)文 法G[S]并说明其理由。 解:观察句子,发现可分成两部分 1na0n 和 1ma0m两部 分中符号的个数n和m没有制约关系。则可改造成下列 文法:
T FT’
T’ *FT’|
F (E)| i
我们构造每个非终结符的FIRST和FOLLOW集合
解:FIRST(E) = { (, i }
FOLLOW(E’) = {+, }
FOLLOW(E’) = { ), #}
FIRST(T) = {(, i }
FOLLOW(T) = {+, ), # }
第四章 语法分析--自上而下分析
例题与习题解答
[例1]试构造与下列文法G[S]等价的无左递归文法。
G[S]: SSa|Nb|c
(1)
N Sd|Ne|f
(2)
对于(1)我们引入新非终结符S’
则: S NbS’ |cS’
[1]
S’ aS’|
[2]
将 S代入 (2)
N Ne |NbS’d |cS’d |f
5.1 自下而上分析基本问题 其基本问题包括下列问题:
5.1.1归约 5.1.2 规范归约简述
在这一部分应掌握短语和直接短语两个重要
概念
5.1.3 符号栈的使用与语法树的表示
第四章 语法分析--自上而下分析

编译原理第4章语法分析自上而下

编译原理第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不能
∪{ε}
ε*,则置 ∈

第四章 语法分析——自上而下分析

第四章 语法分析——自上而下分析

解二: 规定顺序:S、Q、R
则等价的无左递归的文法: SQc | c QRb| b RbcaR’ | caR’ | aR’ R’bcaR’ |
RSa | a RQca | ca | a
RRbca|bca | ca | a
RbcaR’|caR’ | aR’ R’ bcaR’|
(因为不需要试探某个候选式,而是准确地指派 某个候选式)
17
终结首符集FIRST
令文法G不含左递归,对它的所有非终结符的每 个候选式定义终结首符集 FIRST(): * FIRST()={a | a , a∈VT }
特别地 * 若 ,则规定 ∈ FIRST()
显然, FIRST()是从推导出的所有可能的开头终 结符a或 。
3
§4.2 自上而下分析面临的问题
一、带‚回溯‛的自上而下分析方法:
自上而下分析方法,就是对任何输入串,试 图用一切可能的方法,从文法的开始符号出发, 自上而下地为输入串建立一个语法树(或最左推 导)。 这种分析过程实质上是一种试探过程,即反 复使用不同的产生式以求能匹配输入串。
4
例4.1 设有文法: SxAy
解: S iCtSA | a
A | eS
C b
22
4.3.3 LL(1)分析条件 当一个文法不含左递归,并且满足每个非终结 符的所有候选首符集两两不相交,是不是一定能进 行有效的自上而下的语法分析呢?
若存在 ∈ FIRST() ,则问题较复杂,需要进 一步考虑。 定义:非终结符A的 FOLLOW 集:
* FOLLOW(A)= { a| S …Aa… ,a∈VT } 特别地, * 若S …A,则规定,构造FIRST(X)
a) 若X∈VT,则 FIRST(X)={X}。

自上而下语法分析方法

自上而下语法分析方法

11
根据定义计算FIRST集
1.若XV,则FIRST(X)={X}. 2.若XVN,且有产生式Xa…,aV 则
把a加入到FIRST(X)中;若X是一条产 生式,则把也加到FIRST(X)中。 3.若XY…是一个产生式且YVN,则把 FIRST(Y)中的所有非元素都加到 FIRST(X)中;
12
23
G1[S]: S →xAy A →ab | a 输入串:
xay
G2[S]: S →aAS | b A →bAS | ε 输入串:
ab
左递归
G3[S]: S →Sa | b 输入串:
baa
公因子
24
4.2.1 消除左递归
1 消除直接左递归 消除直接左递归(改写为等价的右递归)
形如:A → A α|β α非, β不以A开始 改写为: A →βB(B为新增加的非终结符)
的右部由不同的VT开始。
7
G2[S]: S →Ap S → Bq 输入串:
A → cA
A →a
W=ccap
G2文法B 特→点d:B
B→b
(1)每个产生式的右部不全由VT开始。 (2)如果两个产生式有相同的左部,那么它们
的右部由不同的VT或VN开始。 (3)文法中无空产生式
8
FIRST集定义
令G是一个上下无关文法,对G的所有非终结符 的每个候选定义它的终结首符号集FIRST() 为:
*
FIRST () = {a | a..., a VT }
特别是,若
*
,则规定FIRST()。
9
G2[S]: S →Ap S → Bq
A → cA
A →a
• 如果非终结符A的所有候B 选→首b符集两两不相交, 即A的任B何→两个dB不同候选 i和 j
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第四章语法分析——自上而下分析
【关键问题】
◇什么叫确定的自上而下语法分析?
◇自上而下语法分析是从文法的开始符号出发,反复使用各种产生式,寻找与输入符号匹配的推导。

◇在确定的自上而下语法分析过程中,当以同一个非终结符为左部的产生式有多个不同右部时,如何选择用哪个产生式的右部替换当前的非终结符?
◇确定的自上而下语法分析对文法有何限制?
【学习目标】
确定的自上而下分析方法虽对文法有一定的限制,但由于实现方法简单、直观,便于手工构造或自动生成语法分析器,因而仍是目前常用的方法之一。

◇能够对一个给定的文法判断是否是LL(1)文法;
◇能构造预测分析表;
◇能用预测分析方法判断给定的输入符号串是否是该文法的句子;
◇能对某些非LL(1)文法做等价变换:
①消除左递归;
②提取左公共因子
【学习指南】
确定的自上而下分析由于实现方法简单、直观、便于手工构造,因此,仍是目前常用的语法分析方法之一,尤其对小型编译器的实现较为适合。

确定的自上而下分析要求文法是LL(1)的,所以,能否用确定的自上而下分析方法构造语法分析器,首先必须对所给文法进行判断。

由此构造LL(1) 分析器的关键问题是对文法的LL(1)判别。

判断LL(1)文法时用到文法符号串的开始符号集合(FIRST集)和非终结符的后跟符号集合(FOLLOW集)的计算。

本章的学习要求大家对给定的文法能熟练、准确地计算出产生式右部符号串的开始符号集合和每个非终结符的后跟符号集合,只有这两个集合的元素计算准确无误,才能对LL(1)文法的判断得出正确结论,从而正确构造LL(1)分析表。

对非LL(1)文法的等价变换特别要注意的是:消除了左递归、提取了左公共因子后不一定就能满足LL(1)文法的条件。

【难重点】
语法分析是编译程序的核心部分。

语法分析的作用是识别由词法分析给出的单词符号序列是否是给定文法的正确句子(程序),目前语法分析常用的方法有自上而下分析和自下而上分析两大类。

本章将主要介绍确定的自上而下分析思想和对文法的要求。

确定的自上而下分析要求文法满足LL(1)文法。

本章主要介绍内容为:
◇LL(1) 文法的定义和判别
◇非LL(1)文法的等价变换
◇确定的自上而下分析方法
◇预测分析方法
重点:
①LL(1)文法的定义和判别
②非LL(1)文法的等价变换
③预测分析方法
难点:
对一个文法如何判断是否是LL(1)文法。

在判断LL(1)文法时用到文法符号串的开始符号集合(FIRST 集)和非终结符后跟符号集合(FOLLOW集)的计算,由于概念不清或不够细心常常导致对这两个集合的计算出错。

【知识结构】
4.1语法分析器的功能
语法分析是编译过程的核心部分。

它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。

语言的语法结构用上下文无关文法描述。

语法分析器的工作本质上就是按文法的产生式,识别输入符号串是否为一个句子,或者从概念上讲就是要建立一棵与输入串相匹配的语法分析树。

4.2自上而下分析的问题
自上而下就是从文法的开始符号出发,向下推导,推出句子。

自上而下的主旨是对任何输入串试图用一切可能的办法,从文法开始符号出发,自上而下地为输入串建立一棵语法树。

或者说,为输入串寻找一个最左推导。

这种分析过程是一种试探过程,是带“回溯”的。

实现这种自上而下的带回溯试探法的一个简单途径是让每个非终结符对应一个递归子程序。

每个子程序作为一个布尔过程。

这种分析法存在的困难和缺点是:
1.文法的左递归
使用自上而下分析法必须消除文法的左递归。

2.回溯
回溯会使整个过程既麻烦又费时间,应设法消除回溯。

3.虚假匹配
4.3LL(1)分析法
为构造不带回溯的自上而下分析算法,首先要消除文法的左递归,并找出克服回溯的充要条件。

4.3.1左递归的消除
假定关于非终结符P的规则为:
P→Pα|β
其中β不以P开头。

则可以改写为如下的非直接左递归形式:
P→βP′
P′→αP′|ε。

相关文档
最新文档