编译4语法—自上而下_zss_素材

合集下载

编译原理04自上而下语法分析PPT课件

编译原理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

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

第四章 编译原理语法分析--自上而下
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为根的与输入串α相匹配(即α 中的各个符号为叶结点)的语法树

编译原理张晶版 第四章 自上而下语法分析

编译原理张晶版 第四章 自上而下语法分析

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 语法分析-自上而下分析

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章语法分析自上而下

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

编译原理完整课件_第4章 语法分析-自上而下分析

编译原理完整课件_第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分析法说课讲解

最新编译原理第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

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

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

• 例 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章 语法分析(自下而上分析)

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

二、算符优先文法和优先表的构造
1 算符优先文法(OPG文法)
两个非终结符相邻
(1)算符文法(OG文法):设有一文法G,若G中没有形如
S→…QR…产生式,(S,Q,R∈VN)则称文法G为算符文 法。 (2)定义优先关系:设文法G是一个OG文法,令a,b是任意两 个终结符号,P , G , R 是非终结符号,定义: . ① a = b 当且仅当文法G中含有形如P→…ab…或 P→…aQb…规则。 ② a <. b 当且仅当文法G中含有形如P→…aR…的 规则, 其中:R=>b…或R=>Qb…。 ③ a .> b 当且仅当文法G中含有形如P→…Rb…的 规则, 其中:R=>…a 或 R=>…aQ。
3
S S→aAcBe A→b | Ab a A c B e B→d 问abbcde是不是该文法的句子? A b d 步骤 符号栈 输入流 动作 0 # abbcde# b 1 #a bbcde# 移进 2 #ab bcde# 移进 3 #aA bcde# 归约,用A→b 4 #aAb cde# 移进 5 #aA cde# 归约,用A→Ab 6 #aAc de# 移进 7 #aAcd e# 移进 8 #aAcB e# 归约,用B→d 9 #aAcBe # 移进 10 #S # 归约,用S →aAcBe 4 11 #S # 成功 例:设文法G[S]:
10
优先关系的例子

文法:S→bAb
A→(B | a B→Aa) //S→bAb //A→(Aa)|a
语言:{bab, b(aa)b, b((aa)a)b, } 可以从语法树里面导出部分优先关系。

S b b<a A a b a>b
S
b

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

《编译原理》第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 **|*
结论:能够从开始符号出发推导出给定的输入串,
因此,是句子。
• 常用的语法分析方法:
根据建立语法分析树的方法来分,有两大类,分四小类:
自顶向下分析法: 从文法的开始符号出发,向下推导(使用最左推 导) ,尽可能使用各种产生式,推导出与输入串 匹配的句子,从而建立语法树。
自底向上分析法: 从输入符号串开始,逐步进行归约(最右推导的 逆过程),直至归约到文法的开始符号,从而建 立语法树。 具体分类:

《编译原理课程教案》第4章:自下而上语法分析

《编译原理课程教案》第4章:自下而上语法分析

构造识别活前缀的DFA, 并根据DFA构造分析表
构造过程中需要消除直接 左递归和提取左因子等操 作
SLR(1)文法及其分析表的构造
SLR(1)文法是LR(0)文法 的简化版本,通过引入 FOLLOW集解决冲突问题
FOLLOW集表示在当前非 终结符之后可能出现的终 结符集合
ABCD
构造SLR(1)分析表时,需 要计算每个非终结符的 FOLLOW集
算符优先分析算法
01
02
03
算符优先分析算法是一 种自下而上的语法分析 方法,通过不断归约和
移进来构造语法树。
在分析过程中,需要维 护一个分析栈和一个输 入缓冲区,分别用于存 储已经分析过的部分和
待分析的部分。
根据优先关系表和分析 栈顶的元素,可以确定 下一步的操作是移进还
是归约。
算符优先分析法的局限性
《编译原理课程教案》第4章:自 下而上语法分析
contents
目录
• 引言 • 自下而上语法分析基本概念 • 算符优先分析法 • LR分析法 • 自下而上语法分析的优化技术 • 实验环节:自下而上语法分析器设计 • 章节小结与拓展思考
01 引言
编译原理课程概述
编译原理是计算机科学的一个重 要分支,研究将高级语言程序转 换为机器语言程序的原理和技术。
总结经验教训
总结实验过程中的经验教训,包括设计思路 的合理性、实现过程的难点和易错点等,为 今后的学习和工作提供参考。
07 章节小结与拓展思考
章节小结:关键知识点回顾
自下而上语法分析基本概念
从输入串开始,逐步进行归约,直到文法的 开始符号。
LR分析法
利用移进-归约思想,结合栈和状态转移表 进行语法分析。

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

编译原理第章自上而下语法分析
当预测失败时,需要回溯到之前的步骤并尝试其 他可能的分支,这可能导致效率低下。
3
对输入符号的依赖
自上而下的语法分析需要在分析过程中不断查看 输入符号,因此对输入符号的依赖较强。
编译原理的发展趋势与挑战
静态代码分析与优化
通过静态代码分析技术,编译器可以在编译时检测出更多的潜在错误,并进行 相应的优化。
非递归预测分析的基本思想
消除左递归
通过改写文法规则,消除直接和间接左递归,使得分析过程能够 顺利进行。
构造预测分析表
根据文法规则和非终结符的FOLLOW集,构造预测分析表,用于 指导分析过程。
栈和输入符号的同步处理
使用栈保存分析过程中的信息,并根据输入符号和栈顶信息进行同 步处理,实现语法分析。
非递归预测分析表的构造
介绍LL(1)文法的定义和判别方法,包括FIRST集和 FOLLOW集的构造。
递归下降分析算法设计
介绍递归下降分析算法的设计方法,包括递归子程序的 编写和错误处理机制。
02
CATALOGUE
语法分析基础
语法分析器的作用
识别语法错误
语法分析器能够检查源代码是否 符合语言的语法规则,识别出语 法错误并提供相应的错误信息。
在推导过程中,如果遇到非终 结符,则根据相应的产生式规 则进行替换,直到最终得到终
结符序列为止。
递归下降分析器的构造
分析函数根据当前输入符号和文 法规则判断应该执行的操作。
如果当前输入符号与文法规则中的某 个终结符相匹配,则消耗掉该输入符 号,并继续分析下一个输入符号。
如果当前输入符号与文法规则中 的某个非终结符相匹配,则调用 相应的分析函数进行递归分析。
预测分析算法的实现
初始化分析栈

编译原理自上而下语法分析PPT文档50页

编译原理自上而下语法分析PPT文档50页
33、如果惧怕前面跌宕的山岩,生命 就永远 只能是 死水一 潭。 34、当你眼泪忍不住要流出来的时候 ,睁大 眼睛, 千万别 眨眼!你会看到 世界由 清晰变 模糊的 全过程 ,心会 在你泪 水落下 的那一 刻变得 清澈明 晰。盐 。注定 要融化 的,也 许是用 眼泪的 方式。
35、不要以为自己成功一次就可以了 ,也不 要以为 过去的 光荣可 以被永 远肯定 。
6、最大的骄傲于最大的自卑都表示心灵的最软弱无力。——斯宾诺莎 7、自知之明是最难得的知识。——西班牙 8、勇气通往天堂,怯懦通往地狱。——塞内加 9、有时候读书是一种巧妙地避开思考的方法。——赫尔普斯 10、阅读一切好书如同和过去最杰出的人谈话。——笛卡儿
Thபைடு நூலகம்nk you
编译原理自上而下语法分析
31、别人笑我太疯癫,我笑他人看不 穿。(名 言网) 32、我不想听失意者的哭泣,抱怨者 的牢骚 ,这是 羊群中 的瘟疫 ,我不 能被它 传染。 我要尽 量避免 绝望, 辛勤耕 耘,忍 受苦楚 。我一 试再试 ,争取 每天的 成功, 避免以 失败收 常在别 人停滞 不前时 ,我继 续拼搏 。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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月)
主讲:朱世松 计算机学院
第四章 语法分析—自上而下分析
本章主要介绍语法分析的处理 要进行语法分析,必须对语言的语法结构 进行描述。
相关文档
最新文档