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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

❖ 下图表明了语法分析器在编译程序中的地位
源程序
词法分析器
单词符号 取下一
语法分析器
语法 分析树
单词符号
后续部分
符号表
❖ 按照语法分析树的建立方法,我们可以粗略地把语法分析方 法分为两类:一类是自上而下分析法,另一类为自下而上分 析法
3
例:自顶向下构造最左推导(aabbaa) SaASa A SbA SS ba
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的直接左递归后我们们得到整个文法


自上而下
技 术
语法分析


主讲
❖ 高级语言的语法结构适合用上下无关文法描述,因 此,我们将上下文无关文法作为语法分析的基础
❖ 本章和下一章,我们将介绍编译程序构造中的一些 典型的语法分析方法
2
1 语法分析器功能
❖ 语法分析是编译过程的核心部分。它的任务是在词法分析识
别出单词符号串的基础上,分析并判定程序的语法结构是否 符合语法规则
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α使分析陷入无限循环 回溯的不确定性,要求我们将已经完成工作推倒重来 虚假匹配问题 难于知道出错位置 效率低,代价高,实践价值不大
A 1 | 2 |…| n
则:
FIRST(i) FIRST(j) = (i j )
③ 对文法中每一个非终结符A,若它存在某个候选首符集
包含,则
FIRST(A) FLLOW(A)=
❖ 一个文法若满足以上条件,则称该文法G为LL(1) 文法
❖ 因此,为解决这些问题我们要消除左递归和回溯
7
3 LL(1) 分析法
3.1 左递归的消除 3.2 消除回溯、提左因子 3.3 LL(1)分析条件
8
3.1 左递归的消除
❖ 一般而言,假定P关于的全部产生式是 PP1| P2|…| Pm| 1| 2 |… | n
其中,每个都不等于,而每个都不以P开头,那 么,消除P的直接左递归性就是把这些规则改写成:
15
例:有产生式 B bBcA|b
由于FIRST(bBcA) FIRST(b) ={b} ,则需要提 取公共左因子,将产生式改写成:
B bC C BcA|
16
❖ 问题
3.3 LL(1)分析条件
E→TE’ E’→+TE’|ε T→FT’ T’→*FT’|ε F→(E)|i
例4.4:考虑文法4.2,对输入串i+i进行自上而下分析
S abcS’|bcS’|cS’
S’ abcS’|
Q Sab|ab|b
R Sa|a
由于关于Q,R的规则式多余的则可化简得到:
S abcS’|bcS’|cS’
S’abcS’|
12
3.2 消除回溯、提左因子
❖ 令G是一个不含左递归的文法,对G 的所有的非终 结符号的每个候选定义它的终结首符集FIRST() 为: FIRST()={a| *a…,aVT}
执行任务。这个候选就是那个终结首符集含a 的
14
❖ 如何把一个文法改造成任何终结首符集的所有候选首符集两 两不相交呢?其办法是提取公共左因子
❖ 假定关于A 的规则是 A1| 2| … |n| 1| 2|… |m (其中每个不以开头)
那末,可以把这些规则改写成: A A’| 1| 2|… |m A’ 1 | 2 | …| n
S aAS aSbAS aabAS aabbaS aabbaa
S
aA
S
S bAa
a
ba
4
2 自上而下分析面临的问题
❖ 自上而下分析的一般方法:对任何输入串,用一切 可能的方法从文法开始符号(根结)出发,自上而 下地为输入串建立一棵语法树,或寻找一个最左推 导
❖ 这种分析过程本质上是一种试探过程,是反复使用 不同产生式谋求匹配输入串的过程
i+i
E
IP
T
E’
(a)
i+i
E
T
E’
IP
F
T’
i (c)
i+i
E
T
E’
IP
F
T’
(b)
i+i
i+i
E
IP
T
E’
IP
F
T’
i
ε
(d)
E
T
E’
F
T’ + T E’
i
ε F T’ε
iε (e)
17
❖ 假定S是文法G开始符号,对任何非终结符A定义:
FOLLOW(A) = { a | S* …Aa…, aVT } ❖ 若S* …A, 则规定# FOLLOW(A). 也就是说,
❖ 若* ,则规定 FIRST()。 换句话说 FIRST()是的所有可能推导的开头终结符或可能 的
13
❖ 如果非终结符A 的所有候选首符集两两不相交,即
A的任何两个不同的候选i和j
FIRST(i) FIRST(j) =
那么,当要求A匹配输入串时,A 就能根据它所面 临的第一个输入符号a,准确地指派某个候选前去
FOLLOW(A)是所有句型中出现在紧接A之后的终结 符或‘#’
❖ 因此,当非终结符A面临输入符号a,且a不属于A 的任意候选首符集但A的某个候选首符集包含时, 只有当a∈FOLLOW(A),才可能允许A自动匹配
18
❖ 判断某给定文法是否为LL(1)文法其条件为:
① 文法不含左递归
② 对于文法中每个非终结符A的各个产生式的候选首符集 两两不相交。即,若
P | 1 P’| 2 P’|…| n P’ P’1P’| 2P’| …| mP’|
9
❖ 例4.2:文法
E→E+T|T
T→T*F|F
F→(E)|i
消去直接左递归:
E→TE’
E’→+TE’|ε
T→FT’
(4.2)
T’→*FT’|ε
F→(E)|i
❖ 直接左递归和非直接左递归的消除方法均在必须掌握之列
10
❖ 若一个文法不含回路(P* P),也不含以ε为右部 的产生式,则消除一切左递归的算法是:
① 把文法G的所有非终结符排序:P1, P2, … , Pn
② 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规则的直接左递归性
相关文档
最新文档