第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章语法分析——自上而下分析
n
例3:有如下两个产生式:
语法 树
编译 程序 的后 续部
分
第4章语法分析——自上而下分析
语法分析器
语法分析器的输入
Token序列:词法分析产生的输出,是各个单词都正确的 源程序,是一个有限序列
语法分析器的功能
按照语言的语法构成规则, 识别输入的符号串能否构成一 个句子。规则是用文法的产生式来定义的。
对给定一个输入串,如何判定它是不是一个句子? 根据文法的产生式规则,从开始符号出发,看能否推导
例2:文法
E -> E+T|T
E -> TE’
T->T*F|F
E’->+TE’| ε
F->(E)|i 消去左递归后为:
T->FT’ T’->*FT’| ε 第4章语法分析——自上而下分析 F->(E)|i
一般而言,产生式为: A→Aα1|Aα2|…|Aαn|β1|β2|…|βm 将其替换为:
Aβ1 B|β2 B |…|βm B Bα1 B|α2 B |…|αn B|ε
例:使用下述文法对 i + i 进行分析:
E TE’ E’ +TE’| ε T FT’ T’ *FT’| ε F (E)|i
第一步:i∈first(TE’) i∈first(FT’) i∈first(F)
E
T
E’
F T’ + T E’
iε
F T’ ε
iε
第二步:+∈first(T’) 用ε自动匹配
第4章 语法分析 ——自上而下分析
第4章语法分析——自上而下分析
第4章 语法分析 ——自下而上分析
4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(1)分析法 4.4 递归下降分析程序构造 4.5 预测分析程序
第4章语法分析——自上而下分析
语法分析器的位置
词分器法析取下单ktnoe一词符个语分表器号法析
• 2. 间接左递归的消除 (1) 代入 (2) 消除直接左递归
第4章语法分析——自上而下分析
回溯
回溯产生的真正原因是:某非终结符对 应多个侯选式,它们右部的第一个终结 符相同,从而导致语法分析器选择了错 误的侯选式。
如果希望没有回溯,对文法有什么要求?
第4章语法分析——自上而下分析
定义:对G的所有非终结符的每个侯选式α定义首 终结符集:
• 自下而上分析法:
从输入符号串开始,逐步进行归约(最右推导的 逆过程),直至归约到文法的开始符号。
自顶向下分析 自底向上分析
递归下降分析 预测分析(LL) 算符优先分析 LR分析( LR(0)、SLR(1)、LR(1)、LALR)
第4章语法分析——自上而下分析
自顶向下分析
自上而下分析的主旨是:对任何输入串,试图用一切可能 的办法,从文法的开始符号出发,自上而下地为输入串建 立一个语法树。
First(α) = {a| α *a…,a∈VT} 若α *ε ,则ε∈ First(α)
• 因此,不产生回溯的条件就是: 对非终结符A的任意两个不同的侯选式ai 和aj , 都有: First(ai)∩ First(aj) = φ
• 当要求用A进行匹配时,就能根据所面临的输入 字符,准确地选取一个A的侯选式。
第4章语法分析——自上而下分析
结论
左递归和回溯问题的产生直接与描述语言 的文法有关
因此,要对文法进行确定的自顶向下分析 应该改造文法,使其不含左递归和回溯
第4章语法分析——自上而下分析
左递归的消除
1. 直接左递归的消除:
假定产生式为:P→Pα|β,将其替换为形式等价 的产生式组:
P→βP’ P’ →αP’ |ε
问题1:回溯
S
x
A
y
•例1:设有文法 (1) S -> xAy (2) A -> **|*
现有输入串:x*y 其分析过程如下:
产生的原因?
*
*
输入符号串: x*y
失败,需要退回,重新选取A的侯选式 这时使得分析器的动作不稳定
第4章语法分析——自上而下分析
问题2:左递归
左递归:是左递归的,如果一个文法中存在某个非终结符号A,
出这个输入串匹配的句子。这就需要建立与输入串匹配 的语法分析树。
语法分析器的输出
分析树:如何表示? P89 错误处理信息:定位、继续编译
第4章语法分析——自上而下分析
• 常用的语法分析方法:
根据建立语法分析树的方法不同,语法分析方法有两类:
• 自上而下分析法:
从文法的开始符号出发,向下推导(使用最左推 导) ,尽可能使用各种产生式,推导出与输入串 匹配的句子。
第三步:+∈first(E’)
不读输入符号 第4章语法分析——自上而下分析
号a, a不属于A的任何侯选 式,但A中含ε产生式时都可以使用ε自动匹配。
定义(后随符号集):假定S是文法的开始符号,对于 A∈VN:
提取左因子后:
<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章语法分析——自上而下分析
n
例3:有如下两个产生式:
语法 树
编译 程序 的后 续部
分
第4章语法分析——自上而下分析
语法分析器
语法分析器的输入
Token序列:词法分析产生的输出,是各个单词都正确的 源程序,是一个有限序列
语法分析器的功能
按照语言的语法构成规则, 识别输入的符号串能否构成一 个句子。规则是用文法的产生式来定义的。
对给定一个输入串,如何判定它是不是一个句子? 根据文法的产生式规则,从开始符号出发,看能否推导
例2:文法
E -> E+T|T
E -> TE’
T->T*F|F
E’->+TE’| ε
F->(E)|i 消去左递归后为:
T->FT’ T’->*FT’| ε 第4章语法分析——自上而下分析 F->(E)|i
一般而言,产生式为: A→Aα1|Aα2|…|Aαn|β1|β2|…|βm 将其替换为:
Aβ1 B|β2 B |…|βm B Bα1 B|α2 B |…|αn B|ε
例:使用下述文法对 i + i 进行分析:
E TE’ E’ +TE’| ε T FT’ T’ *FT’| ε F (E)|i
第一步:i∈first(TE’) i∈first(FT’) i∈first(F)
E
T
E’
F T’ + T E’
iε
F T’ ε
iε
第二步:+∈first(T’) 用ε自动匹配
第4章 语法分析 ——自上而下分析
第4章语法分析——自上而下分析
第4章 语法分析 ——自下而上分析
4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(1)分析法 4.4 递归下降分析程序构造 4.5 预测分析程序
第4章语法分析——自上而下分析
语法分析器的位置
词分器法析取下单ktnoe一词符个语分表器号法析
• 2. 间接左递归的消除 (1) 代入 (2) 消除直接左递归
第4章语法分析——自上而下分析
回溯
回溯产生的真正原因是:某非终结符对 应多个侯选式,它们右部的第一个终结 符相同,从而导致语法分析器选择了错 误的侯选式。
如果希望没有回溯,对文法有什么要求?
第4章语法分析——自上而下分析
定义:对G的所有非终结符的每个侯选式α定义首 终结符集:
• 自下而上分析法:
从输入符号串开始,逐步进行归约(最右推导的 逆过程),直至归约到文法的开始符号。
自顶向下分析 自底向上分析
递归下降分析 预测分析(LL) 算符优先分析 LR分析( LR(0)、SLR(1)、LR(1)、LALR)
第4章语法分析——自上而下分析
自顶向下分析
自上而下分析的主旨是:对任何输入串,试图用一切可能 的办法,从文法的开始符号出发,自上而下地为输入串建 立一个语法树。
First(α) = {a| α *a…,a∈VT} 若α *ε ,则ε∈ First(α)
• 因此,不产生回溯的条件就是: 对非终结符A的任意两个不同的侯选式ai 和aj , 都有: First(ai)∩ First(aj) = φ
• 当要求用A进行匹配时,就能根据所面临的输入 字符,准确地选取一个A的侯选式。
第4章语法分析——自上而下分析
结论
左递归和回溯问题的产生直接与描述语言 的文法有关
因此,要对文法进行确定的自顶向下分析 应该改造文法,使其不含左递归和回溯
第4章语法分析——自上而下分析
左递归的消除
1. 直接左递归的消除:
假定产生式为:P→Pα|β,将其替换为形式等价 的产生式组:
P→βP’ P’ →αP’ |ε
问题1:回溯
S
x
A
y
•例1:设有文法 (1) S -> xAy (2) A -> **|*
现有输入串:x*y 其分析过程如下:
产生的原因?
*
*
输入符号串: x*y
失败,需要退回,重新选取A的侯选式 这时使得分析器的动作不稳定
第4章语法分析——自上而下分析
问题2:左递归
左递归:是左递归的,如果一个文法中存在某个非终结符号A,
出这个输入串匹配的句子。这就需要建立与输入串匹配 的语法分析树。
语法分析器的输出
分析树:如何表示? P89 错误处理信息:定位、继续编译
第4章语法分析——自上而下分析
• 常用的语法分析方法:
根据建立语法分析树的方法不同,语法分析方法有两类:
• 自上而下分析法:
从文法的开始符号出发,向下推导(使用最左推 导) ,尽可能使用各种产生式,推导出与输入串 匹配的句子。
第三步:+∈first(E’)
不读输入符号 第4章语法分析——自上而下分析
号a, a不属于A的任何侯选 式,但A中含ε产生式时都可以使用ε自动匹配。
定义(后随符号集):假定S是文法的开始符号,对于 A∈VN:
合集下载
语法分析—自上而下分析
递归文法
A→Ba B→Ab
间接递归文法
4.3.1 左递归的消除
直接消除见诸于产生式中的左递归:假 定关于非终结符P的规则为
P→P | 其中不以P开头。
我们可以把P的规则等价地改写为如下的 非直接左递归形式: P→P 左递归变 P→P| 右递归
一般而言,假定P关于的全部产生式是 P→P1 | P2 | … | Pm | 1 | 2|…|n 其中,每个都不等于,每个都不以P开头
<句子> => <主语><谓语><宾语>
=> <代词><谓语><宾语> => he <动词><宾语>
=> he has <宾语>
=> he has <冠词><名词>
<句子> ::= <主语><谓语><宾语> <主语> ::= <代词> <代词> ::= he <冠词> ::= a <名词> ::= pen <谓语> ::= <动词> <动词> ::= has <宾语> ::= <冠词><名词> <名词> ::= pen
文法和语法分析
高级语言的语法结构适合使用 上下文无关文法描述。
文法及语言的形式定义
文法是对语言结构的定义与描述(或 称为“语法”),即用适当条数的规 则把语言的全部句子描述出来。 文法是以有穷的集合刻划无穷的集合 的工具。
文法
文法能清晰地描述程序设计语言的语法构 成易于理解。
第四章 编译原理语法分析--自上而下
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为根的与输入串α相匹配(即α 中的各个符号为叶结点)的语法树
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推导) 不含回路 前提: 前提: 不含以ε 也不含以ε 为右部的产生式 结论: 那么可以通过执行消除文法左递 结论: 那么可以通过执行消除文法左递 归的算法消除文法的一切左递归 归的算法消除文法的一切左递归 改写后的文法可能含有以ε (改写后的文法可能含有以ε 为右部的产生式)。 为右部的产生式)。
第四章 语法分析——自上而下分析
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章语法分析自上而下
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不能
∪{ε}
ε*,则置 ∈
第04章-语法分析自上而下分析
否符合语法规则。 ▪ 语法分析器的工作本质:按文法的产生式,识别
输入符号串是否为一个句子。 ▪ 语法分析器在编译器中的地位:
源程序
单词符号
词法分析器
取下一个单 词符号
语法分析器
语法分析树
编译器的 后继部分
2021/4/6
符号表
3
4.1 语法分析器的功能
▪ 语法分析方法
➢ 自上而下分析法
从文法的开始符号出发,反复使用文法的产生式, 寻找与输入符号串匹配的推导。
分析输入串x*y(记为)。
xx**yy
SS
IPIPIP xx A y * **
2021/4/6
7
4.2 自上而下分析面临的问题
▪ 当某个非终结符有多个产生式候选时,可 能带来如下问题:
➢ 1.分析过程中,当一个非终结符用某一个候选 匹配成功时,这种匹配可能是暂时的。这时, 不得不“回溯”。
➢ 2.文法左递归问题。一个文法是含有左递归的 ,如果存在非终结符P
➢ 最后所得的无左递归文法是: S→Qc | c Q→Rb | b R→bcaR | caR |a R R→ bca R |
➢ 不同排序所得的文法的等价性是显然的。
2021/4/6
17
4.3.2 消除回溯、提左因子
▪ 为了消除回溯就必须保证:对文法的任何 非终结符,当要它去匹配输入串时,能够 根据它所面临的输入符号准确地指派它的 一个候选去执行任务,并且此候选的工作 结果应是确信无疑的。
2021/4/6
14
4.3.1 左递归的消除
▪ 例4.3 考虑文法G(S)
S→Qc|c Q→Rb|b R→Sa|a
➢ 令它的非终结符的排序为R、Q、S。 ➢ 对于R,不存在直接左递归。 ➢ 把R代入到Q的有关候选后,把Q的规则变为
输入符号串是否为一个句子。 ▪ 语法分析器在编译器中的地位:
源程序
单词符号
词法分析器
取下一个单 词符号
语法分析器
语法分析树
编译器的 后继部分
2021/4/6
符号表
3
4.1 语法分析器的功能
▪ 语法分析方法
➢ 自上而下分析法
从文法的开始符号出发,反复使用文法的产生式, 寻找与输入符号串匹配的推导。
分析输入串x*y(记为)。
xx**yy
SS
IPIPIP xx A y * **
2021/4/6
7
4.2 自上而下分析面临的问题
▪ 当某个非终结符有多个产生式候选时,可 能带来如下问题:
➢ 1.分析过程中,当一个非终结符用某一个候选 匹配成功时,这种匹配可能是暂时的。这时, 不得不“回溯”。
➢ 2.文法左递归问题。一个文法是含有左递归的 ,如果存在非终结符P
➢ 最后所得的无左递归文法是: S→Qc | c Q→Rb | b R→bcaR | caR |a R R→ bca R |
➢ 不同排序所得的文法的等价性是显然的。
2021/4/6
17
4.3.2 消除回溯、提左因子
▪ 为了消除回溯就必须保证:对文法的任何 非终结符,当要它去匹配输入串时,能够 根据它所面临的输入符号准确地指派它的 一个候选去执行任务,并且此候选的工作 结果应是确信无疑的。
2021/4/6
14
4.3.1 左递归的消除
▪ 例4.3 考虑文法G(S)
S→Qc|c Q→Rb|b R→Sa|a
➢ 令它的非终结符的排序为R、Q、S。 ➢ 对于R,不存在直接左递归。 ➢ 把R代入到Q的有关候选后,把Q的规则变为
编译原理完整课件_第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
中南大学软件学院 陈志刚
第四章 语法分析——自上而下分析
解二: 规定顺序: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}。
第4章语法分析3 LR分析法概述
S2 x2
… …
Sm xm
ai…an #
5 6
7
以符号对去查表:
8 9
10
2024/8/10
LR分析表
action
ab c
S4
S5
r1 r1 r1
r2 r2 r2
rS44
r4
S5 r4
r6 r6 r6
S8 r3 r3 r3
S10 r5 r5 r5
计算机教研室
d# S6
acc r1 r1 r2 r2 S6 r4 r4 r6 r6
4 5
rS44
r4
S5 S6 r4 r4
6 r6 r6 r6 r6
7
S8
8 r3 r3 r3 r3
9
S10
10 r5 r5 r5 r5
分析成功!
计算机教研室
GoTo
#
SAB
1 23
acc r5
G [S]
0 S→S 1 S→A 2 S→B 3 A→aAb 4 A→c 5 B→aBb 6 B→d
1 S→A
并假设我们现在已经有了LR分析表,
2 S→B
则输入串#aacbb的分析过程为:
G[S] 3 A→aAb
0
a acbb #
#
由查表得action[0,a]=S4
04 #a
acb b # 再由查表得action[4,a]=S4
4 A→c 5 B→aBb 6 6 B→d
2024/8/10
计算机教研室
4-4-2 LR分析法
12
——LR(0)分析法 二、规范句型活前缀
1、前缀:字符串的任意首部。 Ex:字符串abc,前缀有:,a,ab,abc。
自上而下语法分析方法
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
