编译4语法—自上而下_zss_素材
合集下载
编译原理04自上而下语法分析PPT课件

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
❖ 例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
第四章 编译原理语法分析--自上而下

13
消除左递归 (P69.)
(1)直接左递归:文法存在产生式 A→Aα。 (2)间接左递归:文法不存在产生式 A→Aα, 但存在推导 A + Aα。
消除直接左递归的方法:引入新的非终结符号A‘,将 关于A的如下产生式 A→Aα|β (α非ε且β不以A打头) 替换为 A →βA‘ A‘ →αA‘|ε 注意:不要掉了 A‘ →ε
4
自上而下分析法的思想(P66.)
从文法的开始符号出发,逐步向下推导,不断替换和展开非 终结符,去匹配输入符号串(终结符号串、句子),即寻找输入 串的最左推导,推出句子,(---自上而下的实质) 并按与最左推导相对应的顺序,从文法的开始符号(根结)出 发,自上而下从左到右地建立输入串的语法分析树。---其末 端节点正好与输入符号串相同
3
4.2 自上而下分析法面临的问题
. 本小节首先通过例子P67:
说明自上而下分析的思想 认识自上而下分析时所遇到的主要困难
自上而下分析的主要困难是P66-68 : 文法的左递归性,可能使分析陷入无限循环 回溯的不确定性,要求将已完成的工作推倒重来 为解决这些问题,使得自上而下分析是确定的,考 虑要消除文法左递归和避免回溯。 最后构造确定的有效的自上而下分析器:递归下降 分析器
2
4.1 语法分析器的功能(P66.)
语法分析是编译程序的核心部分。
语法分析是在词法分析识别出单词符号的基础上, 分析并判定(即识别)一串单词符号(称为输入串) 的语法结构是否符合语法规则,是否是文法的一个 句子。
分析判定的方法:
建立输入串α的从文法开始符号S出发的推导 S α1 … αn α 即建立以开始符号S为根的与输入串α相匹配(即α 中的各个符号为叶结点)的语法树
消除左递归 (P69.)
(1)直接左递归:文法存在产生式 A→Aα。 (2)间接左递归:文法不存在产生式 A→Aα, 但存在推导 A + Aα。
消除直接左递归的方法:引入新的非终结符号A‘,将 关于A的如下产生式 A→Aα|β (α非ε且β不以A打头) 替换为 A →βA‘ A‘ →αA‘|ε 注意:不要掉了 A‘ →ε
4
自上而下分析法的思想(P66.)
从文法的开始符号出发,逐步向下推导,不断替换和展开非 终结符,去匹配输入符号串(终结符号串、句子),即寻找输入 串的最左推导,推出句子,(---自上而下的实质) 并按与最左推导相对应的顺序,从文法的开始符号(根结)出 发,自上而下从左到右地建立输入串的语法分析树。---其末 端节点正好与输入符号串相同
3
4.2 自上而下分析法面临的问题
. 本小节首先通过例子P67:
说明自上而下分析的思想 认识自上而下分析时所遇到的主要困难
自上而下分析的主要困难是P66-68 : 文法的左递归性,可能使分析陷入无限循环 回溯的不确定性,要求将已完成的工作推倒重来 为解决这些问题,使得自上而下分析是确定的,考 虑要消除文法左递归和避免回溯。 最后构造确定的有效的自上而下分析器:递归下降 分析器
2
4.1 语法分析器的功能(P66.)
语法分析是编译程序的核心部分。
语法分析是在词法分析识别出单词符号的基础上, 分析并判定(即识别)一串单词符号(称为输入串) 的语法结构是否符合语法规则,是否是文法的一个 句子。
分析判定的方法:
建立输入串α的从文法开始符号S出发的推导 S α1 … αn α 即建立以开始符号S为根的与输入串α相匹配(即α 中的各个符号为叶结点)的语法树
编译原理张晶版 第四章 自上而下语法分析

1、消除左递归
•1) 什么是左递归 —左递归:文法存在产生式 P + Pa —直接左递归: P —间接左递归:P Pa Aa ,A + Pb
•2)消除左递归
—消除直接左递归 —消除间接左递归
第四章 自上而下语法分析(23)
第二节 自上而下分析法的一般问题 三、不带回溯的自上而下分析算法
2、消除直接左递归
第四章 自上而下语法分析(44)
第三节 预测分析程序与LL(1)文法 二、求串a的终结首符集和非终结符A的随符集
例:对如下文法G(已加上编号)
1. E
4. T 7. F
TE’
FT’ i
2. E’
5. T’ 8. F
+TE’
*FT’ (E)
3.E’
6.T’
e
e
求各非终结符号的终结首符集和随符集
第四章 自上而下语法分析(45)
第四章 自上而下语法分析(47)
第三节 预测分析程序与LL(1)文法 二、求串a的终结首符集和非终结符A的随符集
例:对如下文法G(已加上编号)
1. E
4. T 7. F
TE’
FT’ i
2. E’
5. T’ 8. F
+TBiblioteka ’*FT’ (E)3.E’
6.T’
e
e
求各非终结符号的终结首符集和随符集
第四章 自上而下语法分析(48)
第四章 自上而下语法分析(40)
第三节 预测分析程序与LL(1)文法 三、构造预测分析表
1. 基本思想 1)若A a是一个产生式,a ∈ First(a),那么当A 是栈顶符号且将读入a时,选择a取代A匹配成功的 希望最大,故,M[A,a]元素为A a 2)若A a而a=e,或a + e;当A是栈顶符号且将读 入a时,若a ∈ Follow(A),则栈顶的A应被e匹配; 此时读头不前进,让A的随符与读头下的符号进行 匹配,这样输入串匹配成功的可能最大,故M[A,a] 元素为A a(这里a=e或a + e)
04 语法分析-自上而下分析

待分析的输入串: 待分析的输入串:i+i
只有当a 只有当a是允许出 现在非终结符A 现在非终结符A后 面的终结符时, 面的终结符时, 才可能允许A 才可能允许A自动 匹配。 匹配。
尾随集的定义: VN尾随集的定义:
=*>…Aa Aa…, FOLLOW(A)={a|S =*> Aa , a∈VT}; 特别地,如果S=*> S=*>…A 那么# FOLLOW(A)。 特别地,如果S=*> A,那么# ∈FOLLOW(A)。
例子
文法: S→xAy A→**|* 文法: 输入串:x*y 输入串: S => => => => xAy x**y xAy x*y (S→ xAy) (A→**) 回溯) (回溯) (A→*)
带回溯自上而下分析面临的问题
问题: 问题: 文法的左递归问题 回溯问题 虚假匹配问题 出错位置不确定 低效
实现思想: 实现思想:
分析程序由一组递归过程组成。 分析程序由一组递归过程组成。每一过程 对应于一个非终结符号。 对应于一个非终结符号。 每一个过程的功能是:选择正确的右部。 每一个过程的功能是:选择正确的右部。 在右部中有非终结符号时, 在右部中有非终结符号时,调用该非终结 符号对应的过程。 符号对应的过程。
消除文法的左递归
文法不含回路(形如P=+> P推导 推导) 文法不含回路(形如P=+> P推导) 不含回路 前提: 前提: 不含以ε 也不含以ε 为右部的产生式 结论: 那么可以通过执行消除文法左递 结论: 那么可以通过执行消除文法左递 归的算法消除文法的一切左递归 归的算法消除文法的一切左递归 改写后的文法可能含有以ε (改写后的文法可能含有以ε 为右部的产生式)。 为右部的产生式)。
编译原理第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
中南大学软件学院 陈志刚
编译原理自上而下语法分析

编译原理
基本架构(1)
变量: sym:当前符号 函数:advance( ):读输入串下一符号 对于每个非终结符号U→α 1|α 2|…|α n处理的方法如下: P(U) {
if sym ∈FIRST(α1 )then P(α1) //处理α1的程序部分 else if sym ∈FIRST(α2 )then P(α2) //处理α2的程序部分 … else if sym ∈FIRST(αn )then P(αn) else if sym ∈FOLLOW(U)then return //处理空产生式情况 else error }
编译原理
间接左递归举例
S→Qc|c Q→Rb|b R→Sa|a 以上文法不含直接左递归,但S,Q,R 都是左递归的,因为: S=>Qc =>Rbc =>Sabc Q =>Rb =>Sab =>Qabc R =>Sa =>Qca =>Rbca
编译原理
消除文法的左递归
前提:如果一个文法不含回路(形如P⇒+ P 的推导),也不含以ε 为右部的产生式, 那么可以通过执行消除文法左递归的算 法消除文法的一切左递归(改写后的文 法可能含有以ε 为右部的产生式)。
FIRST(u)包含了u对应的字的所有可能的首终结符号。 FOLLOW(U)表示了句型中可能紧跟再U后面的终结符号。
编译原理
FIRST(α) 构造算法
对于X∈(VN∪VT),FIRST(X)
的构造 1:若XVT,则FIRST(X)={X} 2:若XVN,且有产生式X→a…, a VT ,则a FIRST(X);如果X→ ,那么 FIRST(X)。 3:若有产生式X→ Y…,Y VN ,则FIRST(Y)\ {} ⊏ FIRST(X); 如果有产生式X→Y1Y2…YK,其中Y1,Y2,Yi-1 VN且Y1Y2…Yi-1 => * , 则FIRST(Yi) \ {} ⊏ FIRST(X);若Y1Y2…YK => * ,则 FIRST(X)。
最新编译原理第4章 语法分析 自下而上 LR分析法说课讲解

识别文法句型活前缀的非确定有限自动机(NFA M) 包括:状态、状态转换、初态、终态 ①NFA的状态:是一个LR(0)项目,一个项目指明了在 分析过程的某时刻看到产生式多大一部分 ②构造方法:
a.文法开始符号的形如S’→•S的项目为NFA的唯一 初态;文法的所有LR(0)项目构成的状态都是识别文
法的规范句型的活前缀的终态。活前缀识别态
编译原理第4章 语下而上(自动生成)
法
分
算符优先-最左素短语
析
规范归约-句柄
概
述
自上而下(手动,自动生成)
递归下降-消除左递归 LL(1)分析法- LL(1)分析表
图1
LR分析法是一种自下而上进行规范归 约的语法分析方法, L指自左向右扫描输入串, R指最右推导(规范归约)。
LR分析程序生成器:自动生成LR分 析程序的程序。
LR分析器(分析表)的分类:
1. LR(0)表构造法。这种方法的局限性较大、但它 是建立其它较一般的LR分析法的基础。
2.简单LR(简称SLR)表构造法。虽然一些文法不 能构造SLR分析表,但是,它是一种比较容易实 现又很有使用价值的方法。
3.规范LR表构造法。这种分析表能力最强,能够适 用一大类文法,但实现代价高,或者说,分析表 的体积非常大。
① 文法G
(1)EE+T
(2) ET
(3) TT *F
(4) TF
(5) F(E)
② 分析表(图 )
(6) Fi
③ 分析表中记号的含义
➢sj: ➢rj: ➢acc:
把下一状态 j 和现行输入符号 a 移进栈; 按第 j 个产生式进行归约; 接受;
➢空白格:出错标志,报错
状态
i
0
a.文法开始符号的形如S’→•S的项目为NFA的唯一 初态;文法的所有LR(0)项目构成的状态都是识别文
法的规范句型的活前缀的终态。活前缀识别态
编译原理第4章 语下而上(自动生成)
法
分
算符优先-最左素短语
析
规范归约-句柄
概
述
自上而下(手动,自动生成)
递归下降-消除左递归 LL(1)分析法- LL(1)分析表
图1
LR分析法是一种自下而上进行规范归 约的语法分析方法, L指自左向右扫描输入串, R指最右推导(规范归约)。
LR分析程序生成器:自动生成LR分 析程序的程序。
LR分析器(分析表)的分类:
1. LR(0)表构造法。这种方法的局限性较大、但它 是建立其它较一般的LR分析法的基础。
2.简单LR(简称SLR)表构造法。虽然一些文法不 能构造SLR分析表,但是,它是一种比较容易实 现又很有使用价值的方法。
3.规范LR表构造法。这种分析表能力最强,能够适 用一大类文法,但实现代价高,或者说,分析表 的体积非常大。
① 文法G
(1)EE+T
(2) ET
(3) TT *F
(4) TF
(5) F(E)
② 分析表(图 )
(6) Fi
③ 分析表中记号的含义
➢sj: ➢rj: ➢acc:
把下一状态 j 和现行输入符号 a 移进栈; 按第 j 个产生式进行归约; 接受;
➢空白格:出错标志,报错
状态
i
0
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2018/10/13
3
4.1 语法分析器的功能
语法分析的任务是分析一个文法的句子 结构。 语法分析器的功能:按照文法的产生式 (语言的语法规则),识别输入符号串是 否为一个句子。
2018/10/13
4
单词ቤተ መጻሕፍቲ ባይዱ号
源程序 词法分 析器
取下一单词
语法分 语法分 析树 编译程序 后续部分 析器
...
T
T +
T
F
F
F
*
i
(
2018/10/13
E
)
34
27
2018/10/13
例:文法G(E):
E→TE E→+TE | T→FT T→*FT | F→(E) | i 对应的递归下降子程序为:
PROCEDURE T; IF SYM=‘*’ THEN BEGIN ADVANCE; F;T END;
28
PROCEDURE T; BEGIN F;T END
2018/10/13 17
4.3.2 消除回溯、提左因子
为了消除回溯就必须保证:
对文法的任何非终结符,当要它去匹配输 入串时,能够根据它所面临的输入符号准确地 指派它的一个候选去执行任务,并且此候选的 工作结果应是确信无疑的。
A→ 1 | 2 | … | n
a…. IP ...
S A ...
2018/10/13
16
现在的Q不含直接左递归,把它代入到S 的有关候选后,S变成 S→Sabc | abc | bc | c 消除S的直接左递归后: S→abcS | bcS | cS S→abcS | Q→Sab |ab | b R→Sa|a 关于Q和R的规则已是多余的,化简为: S→abcS | bcS | cS S→abcS | (4.4)
2018/10/13
例:文法G(E):
E→TE E→+TE | T→FT PROCEDURE F; T→*FT | IF SYM=‘i’ THEN ADVANCE F→(E) | i ELSE 对应的递归下降子程序为 : IF SYM=‘(’ THEN
BEGIN ADVANCE; E; IF SYM=‘)’ THEN ADVANCE ELSE ERROR END ELSE ERROR;
引入上述元符号的文法亦称扩充的巴科 斯范式。
2018/10/13 31
例如,通常的“实数”可定义为: decimal→[sign]integer.{digit}[exponent] exponent→E[sign]integer integer→digit{digit} sign→ + | -
19
*
*
2018/10/13
提取公共左因子: 假定关于A的规则是 A→ 1 | 2 | …| n | 1 | 2 | … | m (其中,每个 不以开头) 那么,可以把这些规则改写成 A→A | 1 | 2 | … | m A→ 1 | 2 | … | n 经过反复提取左因子,就能够把每个非终 结符(包括新引进者)的所有候选首符集变 成为两两不相交。
P→P | 其中不以P开头。
我们可以把P的规则等价地改写为如下的 非直接左递归形式: P→P 左递归变 P→P| 右递归
2018/10/13 11
一般而言,假定P关于的全部产生式是 P→P1 | P2 | … | Pm | 1 | 2|…|n 其中,每个都不等于,每个都不以P开头
用扩充的巴科斯范式来描述语法,直观易懂, 便于表示左递归消去和因子提取。
2018/10/13
32
例4.5 文法
E→T | E+T T→F | T*F F→i | (E)
可表示成
E→T{+T} T→F{*F} F→i | (E)
(4.6)
2018/10/13
33
可以用语法图来表示语言的文法。
E
2018/10/13 20
[例] 有产生式 B bBcA|b 由于FIRST(bBcA) FIRST(b) ={b}
则需要提取公共左因子 将产生式改写成: B bC C BcA|
2018/10/13
21
4.3.3 LL(1)分析条件
假定S是文法G的开始符号,对于G的任何 非终结符A,我们定义
每个非终结符有对应的子程序的定义, 首先在分析过程中,当需要从某个非终 结符出发进行展开(推导)时,就调用这 个非终结符对应的子程序。
26
2018/10/13
例:文法G(E):
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
2
上下文无关文法的定义:
一个上下文无关文法G是一个四元式 G=(VT,VN,S,P),其中
VT:终结符集合(非空) VN:非终结符集合(非空),且VT
VN=
S:文法的开始符号,SVN
P:产生式集合(有限),每个产生式形式为
P, PVN, (VT VN)* 开始符S至少必须在某个产生式的左部出现一次。
符号表
2018/10/13
5
语法分析的方法:
自下而上分析法(Bottom-up) 自上而下分析法(Top-down)
基本思想:它从文法的开始符号出发,反复
使用各种产生式,寻找"匹配"的推导。
2018/10/13
6
4.2 自上而下分析面临的问题
自上而下就是从文法的开始符号出发,向 下推导,推出句子。
那么,消除P的直接左递归性就是把这些规 则改写成: P→1P | 2P | … | nP P→1P | 2P |… | mP |
左递归变 右递归
2018/10/13 12
例4.2 文法G(E): E→E+T | T T→T*F | F F→(E) | i
消去直接左递归: E→TE E→+TE | P→P1 | P2 | … | Pm | 1 | T→FT 2|…|n T→*FT | P→1P | 2P | … | nP F→(E) | i
14
消除左递归的算法:
1. 把文法G的所有非终结符按任一种顺序排列成P1, P2,…,Pn;按此顺序执行; 2. 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规则的直接左递归性
P P
含有左递归的文法将使自上而下的分 析陷入无限循环。
2018/10/13 9
4.3 LL(1)分析法
构造不带回溯的自上而下分析算法
要消除文法的左递归性 克服回溯
2018/10/13
10
4.3.1 左递归的消除
直接消除见诸于产生式中的左递归:假 定关于非终结符P的规则为
x*y x*y S S
y
IP x A IP IP x * **
2018/10/13
8
当某个非终结符有多个产生式候选时,可 能带来如下问题:
1. 分析过程中,当一个非终结符用某一个候 选匹配成功时,这种匹配可能是暂时的。出 错时,不得不“回溯”。 2. 文法左递归问题。一个文法是含有左递归 的,如果存在非终结符 P:
(ij)
3. 对文法中的每个非终结符A,若它存在某个候 选首符集包含,则 FIRST(A)∩FOLLOW(A)= i=1,2,...,n 如果一个文法G满足以上条件,则称该文法G为 LL(1)文法。
2018/10/13 23
对于一个满足上述条件的文法,可以对其输 入串进行有效的无回溯的自上而下分析。 假设要用非终结符A进行匹配,面临的输 入符号为a,A的所有产生式为 A→ 1 | 2 | … | n
带“回溯”的 不带回溯的递归子程序(递归下降)分析方法。
自上而下分析的主旨:对任何输入串,试 图用一切可能的办法,从文法开始符号(根 结点)出发,自上而下地为输入串建立一棵 语法树。或者说,为输入串寻找一个最 左推导。
7
2018/10/13
例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|* 分析输入串x*y(记为)。
P→1P | 2P |… | mP |
2018/10/13 13
例如文法G(S): S→Qc|c Q→Rb|b R→Sa|a
SQcRbcSabc
虽没有直接左递归,但S、Q、R都是左递归的
一个文法消除左递归的条件: 不含以为右部的产生式 不含回路:
P P
2018/10/13
几个全局过程和变量:
ADVANCE,把输入串指示器IP指向下一个
输入符号,即读入一个单字符号 SYM,IP当前所指的输入符号 ERROR,出错处理子程序
2018/10/13 25
例:文法G(E):
E→TE E→+TE | T→FT T→*FT | F→(E) | i
编译原理(第三版)
陈火旺等编著
(2015年9月-10月)
主讲:朱世松 计算机学院
第四章 语法分析—自上而下分析
本章主要介绍语法分析的处理 要进行语法分析,必须对语言的语法结构 进行描述。