sun编译原理第4章语法分析(第8-9讲)
编译原理-第4章 语法分析--习题答案
第4章语法分析习题答案1.判断(1)由于递归下降分析法比较简单,因此它要求文法不必是LL(1)文法。
(× )LL(1)文法。
(× )(3)任何LL(1)文法都是无二义性的。
(√)(4)存在一种算法,能判定任何上下文无关文法是否是LL(1) 文法。
(√)(× )(6)每一个SLR(1)文法都是LR(1)文法。
(√)(7)任何一个LR(1)文法,反之亦然。
(× )(8)由于LALR是在LR(1)基础上的改进方法,所以LALR(× )(9)所有LR分析器的总控程序都是一样的,只是分析表各有不同。
(√)(10)算符优先分析法很难完全避免将错误的句子得到正确的归约。
(√)2.文法G[E]:E→E+T|TT→T*F|FF→(E)|i试给出句型(E+F)*i的短语、简单短语、句柄和最左素短语。
答案:画出语法树,得到:短语: (E+F)*i ,(E+F) ,E+F ,F ,i简单短语: F ,i句柄: F最左素短语: E+F3.文法G[S]:S→SdT | TT→T<G | GG→(S) | a试给出句型(SdG)<a的短语、简单短语、句柄和最左素短语。
答案:画出语法树,得到:短语:(SdG)<a 、(SdG) 、SdG 、G 、a简单(直接)短语:G 、a句柄:G最左素短语:SdG4.对文法G[S]提取公共左因子进行改写,判断改写后的文法是否为LL(1)文法。
S→if E then S else SS→if E then SS→otherE→b答案:提取公共左因子;文法改写为:S→if E then S S'|otherS'→else S|E→bLL(1)文法判定:① 文法无左递归② First(S)={if,other}, First(S')={else, }First(E)={b}Follow(S)= Follow(S')={else,#}Follow(E)={then}First(if E then S S')∩First(other)=First(else S)∩First( )=③First(S')∩Follow(S')={else}不为空集故此文法不是LL(1)文法。
编译原理04自上而下语法分析PPT课件
❖ 例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
编译原理chapter4 语法分析
type array[simple] of type {注:A=type,a=array,
type→array[simple ] of type}
array[num dotdot num] of type
{注:A=simple, a=num
simple→num dotdot num }
array[num dotdot num] of simple
aSbAa (SbA) aSbbaa (ba) aabbaa (a)
S
a
A
S
S
b
A
a
aபைடு நூலகம்
ba
精品文档
7
4.2预测分析器 4 .2 .1 预测分析 预测分析的原理 4 .2 .2 递归预测分析器的构造 用一组递归过程实现预测分析,产生式的状 态转换图可作为编写递归过程的兰图。 4 .2 .3 非递归预测分析器的构造—LL(1) 对于每一步分析,分析表项M[A,a]=‘A ’ 表示:面对非终结符号精A品和文档向前看符号a应选 8
A 1 2 ... n
i,j(1 i,j n i<>j),从 i推导出来的第一个 终结符号集合(称为FIRST( i) )和从 j推 导出来的第一个终结符号集合(称为FIRST( j) )不相交,即, FIRST( i) FIRST( j)=
精品文档
12
定义4.1 令G[S]=(VT,VN,S,P),则
FIRST( )= a a*… a VT
例4.2 文法G[S],其产生式如下:
S→aA|d A→bAS|ε (4.2)
若 w=abd,则构造最左推导的过程如下:
S aA {注:A=S,a=a,S→aA}
abAS {注:A=A,a=b,A→ bAS}
编译原理第四章
S→aAb A→c A′
A′ →d|
n
A→α A′ A′ →β 1|β 2|…|β
n
不确定的自顶向下
转化
确定的自顶向下
问题: 回溯 左递归
解决问题: 提取左因子 消除左递归算法
例教材4.2 : SaBC B bC|dB Cc|a 分析句子adbca
思考: BAf|Be 选哪个? 计算Af 和Be 首终结符是 什么?
S S(L) LSL ’ L’ε
)
a
Sa LSL ’
a
A
b
【例4.1】 分析acb 是否句子? G[S]: S→aAb A→cd|c
S · 3. 选第一个Acd推导 a b-d不匹配(失败) c d S · a A c b A b
思考: 为何有 回溯
4.回溯 即砍掉A的子树 改选A的第二右部 Ac 匹配
(1)推导过程是一个不断试探的过程,出现回溯(回退并使用其他候选式试探)
S S
b S
① ②
a
S
b
a
S
S a
③
a
S
S a
a
b
思考:为何 有死循环
(2)陷入死循环
分析时可能出现: (1) 回溯 原因:推导过程中有多个侯选式可供选择 ,并根据所面临 的输入符号不能准确的确定所要选择时,就可能出现回溯。 例4.1
(2) 死循环。例4.2:在没有对当前输入符号匹配就进入处理 S的过程,无法确定什么时候才用Sb替换, 造成死循环. 原因: 左递归
1 3
=>acS
4
=>acaA =>acaA =>aca
1 4 4
当用A ε , A用ε代替,可以通过A的后随终结符号来匹 配
编译原理完整课件_第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
中南大学软件学院 陈志刚
最新编译原理第4章 语法分析 自下而上 LR分析法说课讲解
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章PPT课件
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根据它所面临的第
编译原理 Chapter 4
码生成 支持语言的演化和迭代
3
语法分析器的作用
• 基本作用
– 从词法分析器获得词法单元的序列,确认该序列是否 可以由语言的文法生成
– 对于语法错误的程序,报告错误信息 – 对于语法正确的程序,生成语法分析树 (简称语法树)
• 通常并不真的生产这棵语法分析树
4
语法分析器的分类
• 通用语法分析器
– 可以对任意文法进行语法分析 – 效率很低,不适合用于编表示形式
– 根结点的标号时文法的开始符号 – 每个叶子结点的标号是非终结符号、终结符号或ε – 每个内部结点的标号是非终结符号 – 每个内部结点表示某个产生式的一次应用
• 内部结点的标号为产生式头,结点的子结点从左到右是产生 式的体
• 树的叶子组成的序列是根的文法符号的一个句型 • 一棵语法分析树可对应多个推导序列,但每颗分
18
词法分析和语法分析的比较
阶段
输入
输出
描述体系
词法分析 源程序符号串 词法单元序列 正则表达式
语法分析 词法单元序列 语法树 上下文无关文法
19
上下文无关文法和正则表达式 (1)
• 上下文无关文法比正则表达式的能力更强
– 所有的正则语言都可以使用文法描述 – 但是一些用文法描述的语言不能用正则表达式描述
| other open_stmt if expr then stmt
sun编译原理第4章语法分析(第8-18讲)-(2)
4.1语法分析程序的功能
语法分析程序的功能是以词法分析器生成的单词符号序 列作为输入,根据语言的语法规则(文法),识别出各 种语法成分,并在分析过程中进行语法检查,检查所给 单词符号序列是否是该语言的文法的一个句子。若是, 则以该句子的某种形式的语法树作为输出;若不是,则 表明有错误,并指出错误的性质和位置。
但是还不能冒然宣布SL(G[Z])
cAd
4. 回溯 即砍掉A的子树 改选A的第二右部
Aa 检查 a-a匹配 d-d匹配
分析工作要部 分地或全部地 退回去重做叫
回溯
ab Z·
建立语法树,末端结点为cad与输入cad相匹配, 建立了推导序列 EcAdcad ∴cadL(G(E))
cAd a
回溯分析法分析效率低,代价高,实际不常用。
exp’ → + term exp’ | - term exp’ |ε
练习:对文法G:
E → T*F | T/F | F T → F | T*F | T/F 消除左递归
2021/4/6
7
第4章 语法分析
(2)采用扩充BNF表示法改写含直接左递归的规则
✓使用花括号{a}表示符号串a的出现可0次或多次,即表示a*。
A → Aα1| Aα2| … | Aαn|β1|β2|…|βm
A →β1 A’ | β2 A’ | … | βm A’ A’ → α1 A’ | α2 A’ | … | αn A’ | ε ● Example
将文法G: exp → exp + term | exp - term | term 消除 左递归。 解: exp → term exp’
if-stmt if (exp) statement [else statement]
编译原理第四章 语法分析和语法分析程序
方法一:将A→Aα|β 改写为A→β{α} 方法二:引入A',改写为A→βA'和A'→αA'|ε 一般化:将A→ Aα1|Aα2|…|Aαn|β1|β2|…|βm 改写为:A→β1A' |β2A' |…|βm A'和 A' → α1A' |α2A' |…|αnA' |ε
S α X a β S# α X ε # S# α X #
构造FOLLOW集1/2
的产生式具有下述4种形式 令X∈ VN,β, δ∈ V*,X的产生式具有下述 种形式: ∈ , 的产生式具有下述 种形式: X
#
1.X=S ∧G[S] δ 3. A→ δXβ → β
A a
2. A→δX →
… A a δ X β
把满足上述条件的文法称为LL(1)文法
某些非LL(1)文法的改造 文法的改造 某些非
1)消除左递归
2)提取公因子 若有形如A → αβ1|αβ2 |…| αβn 则提取公因子α后,上述产生式被替换为以 下两个产生式: A → αA’ 之间还有公因子, 若β1~n之间还有公因子,则继续提取 之间还有公因子 A’ → β1|β2|…|βn
为LL(1)文法条件。 阅读P114-119程序 程序4-1,4-2, 4-3。 程序 。
LL(1)文法回顾
是否存在向 递归下降分析法 顶向下分析 程序的自动 自顶向下分析程序 非终结符 一个递归的子函 非终结符=>一个递归的子函 构造方法? 构造方法? 的手工构造First集不相交,或First集与 集不相交, 集与 无(最)集不相交 数 左递归 Follow集(当产生式的某可选 集 (最)左公因子要合并 右则可推出ε 右则可推出ε)不相交
编译原理第四章语法分析-自上而下分析
• 例 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章 语法分析-自上而下分析
第四章 语法分析—自上而下分析
整理课件
源程序
词法分析器
符 号
语法分析器
错 误
管
处
理
语义分析器
理
表
器
中间代码生成器
代码优化器
代码生成器
整理课件
第四章 语法分析—自上而下分析
本章主要介绍语法分析的处理 要进行语法分析,必须对语言的语法结构
进行描述。
采用正规式和有限自动机可以描述和识别语言 的单词符号;
整理课件
例,定义只含+,*的算术表达式的文法 G=<{i,+,*,(,)},{E},E, P>, 其 中,P由下列产生式组成: Ei E E+E E E*E E (E)
整理课件
如果1 2 n,则我们称这个序 列是从1到n的一个推导。若存在一个从 1到n的推导,则称1可以推导出n 。
整理课件
E
T
E’
i+i
F
T’
IP
G(E):
i
E→TE
E→+TE |
T→FT
T→*FT |
F→(E) | i
整理课件
E
T
E’
i+i
F
T’
IP
G(E):
i
E→TE
E→+TE |
T→FT
T→*FT |
F→(E) | i
整理课件
E
T
E’
i+i
F
T’
IP
G(E):
i
E→TE
E→+TE |
T→FT
关于Q和R的规则已是多余的,化简为:
编译原理第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章自上而下语法分析
• 需要反复试探。
•问题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章-语法分析和语法分析程序
A
(S
A)
(S A) • S
(b
a)
(S
A)
(b
a)
z11 z21
z12
1
z12
z22
z11 z21
z12 z22
S
A
z11
z21
z12 z22
Sbz11 | az21 Abz12 | az22 z11 | Az21 z12Az22 z21Sz11 z22 | Sz12
等式不成立)
X
X
ai
12
2021/4/6
4.1.4 预测分析法
构造FIRST集的方法
令XVN,aVT,X的产生式具有下述3种形式
X
Xa或Xa
a… {a} FIRST(A)
X X {} FIRST(A)
X Y1 Y2 … Yk
XFIRSYT1(YY21…)-{Yk} FIRST(X) 若∈FIRST(Y1),则FIRST(Y2…Yk} FIRST(X)
z12 z22
a b
c z11
z21
z12 z22
9
2021/4/6
4.1.1 消除文法的左递归
课堂练习
消除文法SAS|b, ASA|a的左递归。
10
2021/4/6
4.1.1 消除文法的左递归
课堂练习
消除文法SAS|b, ASA|a的左递归。
S=SΦ+AS+b A=SA+AΦ+a
13
2021/4/6
4.1.4 预测分析法
构造FIRST集的方法
遍历所有左部为X的产生式
set FIRST(X) { ft = ; if (XVT) return {X}; if (X P) ft += {}; for each(XY1Y2…YkP ) { for each(Yi) { if (FIRST(Yi)) { ft += (FIRST(Yi) - {}); if (i == k) ft += {}; } else { ft += FIRST(Yi); break; } } } return ft;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第4章 语法分析
S c A S c a
2015-5-27
c
a
b
d
d
A
c d a S A c
信息学院 孙丽云
b
d
A b
a
b
d
3
回溯分析法
4章 语法分析 4.2第 自上而下分析法
例:已知符号串S=cad 文法G[Z]: Z→cAd A→ab|a 求解 SL(G[Z]) 1.开始:令Z为根结点
分析过程 是设法建立一棵语法树, 使语法树的末端结点与 给定符号串相匹配. Z Z ·
2015-5-27 信息学院 孙丽云
注意:有ε产生式 时求First集,别漏 元素!!
注意:除了求非终结 符的First集外,还可 求符号串的First集。 例:求First(BaB)
17
第4章 语法分析
■ Follow集合 定义:FOLLOW(A)={a| S=> * …Aa…,a∈T}A∈N, S开始符号 特殊地:若S => *...A ,则 $∈FOLLOW(A)
1.若X,则FIRST(X)={X} 2.若XN,且有产生式Xa…,则把a加入到FIRST(X)中 ;若X也是一条产生式,则把也加到FIRST(X)中. 3.若XY…是一个产生式且YN,则把FIRST(Y)中的所 有非元素都加到FIRST(X)中;若X Y1Y2…YK 是一个 产生式,Y1,Y2,…,Y(i-1)都是非终结符,而且,对于任何j,1≤j ≤i-1, FIRST(Yj)都含有 (即Y1..Y(i-1) =>* ),则把 FIRST(Yj)中的所有非元素都加到FIRST(X)中;特别是, 若所有的FIRST(Yj , j=1,2,…,K)均含有,则把加到 FRIST(X)中.
第4章 语法分析
■ 求Follow集合举例说明
求下列各种情况下的Follow(A) (1)A为开始符号时 (2) BAa (3) BaA (Follow(B)={x,y}) (4) CaAB(Follow(C)={x,y},First(B)={b}) (5) CaAB(Follow(C)={x,y},First(B)={b, })
算法:
1.对于文法的开始符号S,置$于FOLLOW(S) 中; 2.若A α B β是一个产生式,则把FIRST(β)-{}加至 FOLLOW(B)中; 3.若A αB是一个产生式,或A αBβ是一个产生式而 FIRST(β) ,则把FOLLOW(A)加至FOLLOW(B) 中。
2015-5-27 信息学院 孙丽云 18
例:将文法G: E→ Ea | t 消除左递归。
解: E → t E’ E’ → aE’ | ε
2015-5-27 信息学院 孙丽云 6
第4章 语法分析
(1) 左递归改成右递归——普通的直接左递归的消除 A → Aα1| Aα2| … | Aαn|β1|β2|…|βm A →β1 A’ | β2 A’ | … | βm A’ A’ → α1 A’ | α2 A’ | … | αn A’ | ε ● Example 将文法G: exp → exp + term | exp - term | term 消除 左递归。 解: exp → term exp’
2015-5-27
信息学院 孙丽云
19
● 举例1
第4章 语法分析
1)求文法G的 FOLLOW集合(the simple expression grammar) (1) expr → expr addop term (2) expr → term (3) addop → + (4) addop → (5) term → term mulop factor (6) term → factor (7) mulop →* (8) factor →(expr) (9) factor →number 解:First(expr)={(,number} First(term)={(,number} First(factor)={(,number} First(addop)={+,-} First(mulop)={*}
定义:FIRST(α) = {a | α => * aβ, a T , α,β (TN)* } 若α => * ε,则规定ε FIRST(α) 该集合称为α的头符号集合
2015-5-27
信息学院 孙丽云
10
■ First集合算法 P67
第4章 语法分析
令X为一个文法符号或,则集合First(X)由终结符组成, 此外还可能有,定义如下:
2015-5-27 信息学院 孙丽云 15
■ 练习
第4章 语法分析
3)求文法G的 FIRST集合(Grammar for statement sequences) stmt-sequence →stmt stmt-seq’ stmt-seq’ → ; stmt-sequence|ε stmt→s (1) stmt-sequence →stmt stmt-seq’ 解: (2) stmt-seq’ →; stmt-sequence (3) stmt-seq’ →ε (4) stmt→s First(stmt-sequence)={s} First(stmt-seq’)={;, ε} First(stmt)={s}
■ LL(1)文法
LL(1)中的第一个L表示从左到右扫描输入串,第二个 L表明分析过程中使用最左推导,1表示分析时每一步 只需向前看一个符号即可决定所选用的规则,而且这 种选择是准确无误的。P63
2015-5-27 信息学院 孙丽云 9
第4章 语法分析
First集合和Follow集合
■ First集合
2.用Z的右部,符号串去匹配输入串
完成一步推导ZcAd 检查 c-c匹配 A是非终结符,将匹配任务交给A
2015-5-27 信息学院 孙丽云
c A d
4
S=cad 第4章 语法分析 3. 选用A的右部符号串匹配输入串 A有两个右部,选第一个 完成进一步推导Aab 检查,a-a匹配,b-d不匹配(失败) 但是还不能冒然宣布SL(G[Z]) 4. 回溯 即砍掉A的子树 改选A的第二右部 Aa 检查 a-a匹配 d-d匹配
2015-5-27 信息学院 孙丽云 11
■ 求First集合举例说明
求下列各种情况下的First(A) (1)A∈T (2)A∈N 例:①AaB|ε ②ABa Bbd|c ③ABa Bbd|c|ε ④ABCa Bbd|c|ε Cxy| ε ⑤ABCD Bbd|c|ε Cxy| ε Dm| ε
exp’ → + term exp’ | - term exp’ |ε
练习:对文法G: E → T*f | T/f | f T → f | T*f | T/f 消除左递归
2015-5-27 信息学院 孙丽云 7
第4章 语法分析
(2)采用扩充BNF表示法改写含直接左递归的规则
使用花括号{a}表示符号串a的出现可0次或多次,即表示a*。
■ 练习
第4章 语法分析
1)求文法G的 FIRST集合(Simple integer expression grammar) expr → expr addop term∣term addop → +|term → term mulop factor ∣ factor mulop →* factor →(expr) ∣ number
信息学院 孙丽云
同例1,仅符号不一 样而已
First(expr)={(,number} First(term)={(,number} First(factor)={(,number} First(addop)={+,-} First(mulop)={*}
14
2015-5-27
■ 练习
第4章 语法分析
2)求文法G的 FIRST集合(Left factored grammar of if-statement) statement → if-stmt | other if-stmt → if (exp) statement else-part else-part → else statement | ε exp → 0 | 1 解: (1) statement → if-stmt (2) statement → other (3) if-stmt → if (exp) statement else-part (4) else-part → else statement (5) else-part →ε First(statement)={if,other} (6) exp → 0 First(if-stmt)={if} (7) exp → 1 First(else-part)={else,ε} First(exp)={0,1}
G[Z]: Z→cAd A→ab|a
Z ·
c A d a b
分析工作要部 分地或全部地 退回去重做叫 回溯
Z · c A d
a
建立语法树,末端结点为cad与输入cad相匹配, 建立了推导序列 EcAdcad ∴cadL(G(E))
2015-5-27
回溯分析法分析效率低,代价高,实际不常用。
信息学院 孙丽云 5
语法分析程序的输入是单词符号序列;输出是语 法树。
2015-5-27 信息学院 孙丽云 1
第4章 语法分析
语法分析方法
自顶向下分析方法 从根结点出发构造 语法树 回溯分析方法(不确定的分析法) 递归下降法 预测分析方法 (确定的分析法) LR(0) parsing SLR(1) parsing LR(1) parsing LALR(1) parsing LL(1)分析法
L:由左向右的处理输入 L:为输入串构造最左推导
自底向上分析方法 从叶结点出发构造 语法树
L:由左向右的处理输入 R:为输入串构造最右推导