第5章 自顶向下语法分析方法-g
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
或迭代
S b{a}
34
5.2.2 消除左递归
1.消除直接左递归
AAα|β, α,β ∈ (VN∪VT)*, A ∈ VN, β不以A开头 A ′αA ′|ε 或 A β{α}
则:A βA′
[例] 文法 E E+T | T T T*F | F F (E) | a 消除左递归,得 E TE’ E’ +TE’ | ε T FT’ T’ *FT’ |ε F (E) | a
关键:
寻找句柄的方法。
16
构造最左推导(aabbaa) (1.自顶向下)
SaASa
A SbA SS ba
S
aAS aSbAS aabAS aabbaS aabbaa
S
a
S a
A
b b A
S a a
17
5.2.1 带回溯的自顶向下语法分析
1. 带回溯的自顶向下语法分析实质 它是一个反复使用不同的产生式 进行试探,以 谋求匹配输入串的过程。 该方法分析效率低,在实际中并不适用,但给 出了自顶向下语法分析的思想。
其中: (1) f(A, I, 0)={(A ,I0)}
(2) f(A, I, 1)={(A, I1)} (3) f(A, 0, 1)={(A, 01)} (5) f(A,0,0)={(A,00), (B, ε)} (7) f(B, 0, 0)={(B, ε)} (8) f(B, 1, 1)={(B, ε)} (9) f(B, I, ε)={(B, ε)} (10) f(A, I, ε)={(A, ε)}
大多数的编程语言是确定的
语法分析的任务:有效地模拟PDA
2.固有歧义的语言:就是根本不存在非歧义文法的
Fra Baidu bibliotek语言。
28
二、上下文无关语言的识别装置:Push Down Automata
3 . 文法的非歧义性是不可判定的
只有文法是非歧义的,语法分析才可唯一进行
虽然不存在算法能在有穷步内确定任意文法是
否歧义,但对某些具体文法存在判定算法
如:LL文法和LR文法,可证是非歧义文法,并且
存在算法,能检查一文法是否是LL或LR文法
29
三、自上而下的分析方法
1.主旨:从文法的开始符号S出发,反复使用各种产生式,寻
找”匹配”于输入符号串的推导(从S(根)出发,向下逐步建
立语法树,最终:为输入串寻找一个最左推导)
常用的方法有:
递归下降分析: 利用程序设计语言的递归函数实现,
每个函数对应文法的一个非终极符。
LL(1)分析:由一张预测分析表和一个总控程序组成。 预测分析表给出了当面临输入符号时,运用到非终极符 的推导所选用的产生式。
13
5.2 自顶向下语法分析概述
自 顶 确定的自顶向下语法分析
递归下降分析
预测分析法 ( LL (1) )
第五章 自顶向下语法分析方法
5.1 语法分析概述 5.2 自顶向下语法分析概述 5.3 LL分析法(预测分析法) 5.4 递归子程序
1
5.1 语法分析概述
1.语法分析器的作用
源程序 词法 分析器
单词
取下一 个单词
语法 分析器
分析树
前端的 中间表示 其余部分
符号表
2
5.1 语法分析概述
1.语法分析器的作用 (1)根据词法分析器提供的单词流,为语法正确 的输入构造分析树(或语法树)。 (2)检查输入中的语法错误,并调用出错处理器 进行适当处理。
由于文法中同一非终极符的各候选式有公共的左因 子或隐含有公共的左因子,使得推导无法选择唯一的候 选式,导致盲目试探。
如: S →aS|ab
20
2.带回溯的自顶向下语法分析面临的问题
问题(2): 左递归问题 无论是直接左递归的, 还是间接左递归的,都会 使分析过程无法终止。 例如:
U → Uα 用于最左推导:
向
下 语 法 分
(消除左递归和回溯)
非确定的自顶向下语法分析
析
(带回溯)
14
构造最左推导的关键问题 在构造最左推导的过程中,面对当前读入的单 词符号a和当前被替换的非终极符A,应该选择A的 哪条候选式去替换它(推导)。 关键: 找出选择一个非终极符号的候选式的方法。
15
构造最右推导的关键问题 在构造最右推导的过程中,面对当前读入的单 词符号a,已分析过的符号串中是否已构成一个产 生式的右部,即句柄(可归约)。如果已构成句 柄,即用相应的产生式左部(非终结符号)去替换它 (归约)。
18
5.2.1 带回溯的自顶向下语法分析
例如: 文法G[S] S →aAb A →** | *
S b * a A * (c) 试探成功
19
利用自顶向下语法分析,分析 a*b 是否是合法的句子。
S a A (a) b S a A *
b
(b) 试探失败
2. 带回溯的自顶向下语法分析面临的问题
问题(1): 出现回溯
2. 定理
(1)每一个CFG,都对应一个PDA M,使L(M)=L(G)
(2)存在一个PDA,它识别的语言不能被任何确定的
PDA识别。 归纳:对上下文无关语言的分析,并不总是能以确定 的方式进行,需要回溯。
27
二、上下文无关语言的识别装置:Push Down Automata
小结 1.能够进行确定分析的语言称为确定语言。
23
二、上下文无关语言的识别装置:Push Down Automata
例1. PDA识别成对的括号串,可由 G: SS(S) | ε产生。
(确定)PDA定义如下:
M = ( {A}, {“(”, “)”}, {0, I)}, f, {A}, I) 其中: (1) f ( A,I,“(” ) =(A, I0) (2) f ( A,0,”(” ) =(A, 00) (3) f ( A,0,”)” ) =(A, ε) (4) f ( A, I, ε) =(A, ε)
30
三、自上而下的分析方法
2. 自上而下分析面临的主要问题
1) 如何选择候选式
如果对文法不做任何限制,对候选式的选择成为无根据的, 只好一一试探所有候选式,直至成功或失败。
致命弱点:不断地回溯,大大影响速度。
2)左递归文法将使自上而下分析陷入无限循环 S
例:S Sa | b,若推导’baa’
A’ (α1 | α2 | …| αm )A’ | ε
或 A (β1 | β2 | … | βn ){α1 | α2 | …| αm } 迭代
36
5.2.2 消除左递归
2.消除间接左递归
[例] G[S]: S Qc | c
Q Rb | b
R Sa | a 因 S Qc Rbc Sabc, 是左递归文法
例:S Sa | b, 改为: S b | Sa ,若推导’baa’
S b (不行) S b S a S S b a S a
(不行)
33
3. 自上而下分析法的问题及解决
Q2:左递归文法将使自上而下分析陷入无限循环
2. 将左递归右递归(或迭代) (解决方法2)
如: 左递归文法 S Sa | b 生成语言 L = ba* 右递归文法: S bA A aA|ε
5
5.1 语法分析概述
2 两类语法分析技术
w * w l
语 法
分析器
S
自顶向下分析 w
语 法 分析器 自底向上分析 S * w r
5.1 语法分析概述
(1)自顶向下分析方法 语法分析从顶部(树根、文法的开始符号)到 底部(叶子、语言的终结符号)为输入的符号串建 立分析树。
7
5.1 语法分析概述
9
5.1 语法分析概述
LR分析法能适应一大类文法,在实际中有较强的适 用性和广泛的应用。 LR分析法便于用语法分析器的自动构造工具,自 动构造语法分析器。当前应用最广泛的工具之一是 YACC(Yet Another Compiler Compiler)系列。
10
5.1 语法分析概述
3. 语法分析要点 (1)程序设计语言的绝大部分语法特性属于上下文无关 的,因此语法分析是以上下文无关文法(CFG)作为 程序设计语言语法分析的基础。
例1 G[S]: (1)ScAd | dBa (3) Aa
(2) Aab
(4) Bcd | c, 则‘cad’是否为文法的句子
S
S c A d
S c A d a b
S c A d a
‘dcda’ 是
‘dcdc’ 分析过程是一个试探过程,必须一一试探所有候选式,直至 不是
与输入串匹配成功,或者判定输入串不是正确句子。
确定的自顶向下分析 确定的自顶向下分析方法对文法要求比较严格, 必须无二义性、且消除左递归和回溯。 典型的方法是递归下降分析方法和LL分析方法。
递归下降分析方法便于手工构造语法分析器。
LL分析法便于用语法分析器的自动构造工具,自 动构造语法分析器。
8
5.1 语法分析概述
(2)自底向上分析方法 语法分析从底部到顶部为输入的符号串建立分析树。 最常见的LR分析方法就是自底向上分析方法。而且 是确定的。
24
二、上下文无关语言CFL的识别装置:PDA CFL有一种等价的自动机记号,即“下推自动机”。它 描述并且只描述所有的CFL,作为一种语言的定义机制
是非常有用的(它与CFG等价性)
( )
控制
((
))
I
25
例2. 识别语言{XX-1 | X ∈{0, 1}*}, X-1: X的逆串
由下列文法产生:S 0S0 | 1S1 | ε PDA(该PDA是不确定PDA)如下定义:M=({A,B}, {0,1}, {I,0,1}, f, A, I)
或 E T{+T} (迭代) T F{*F} F (E) | a
35
5.2.2 消除左递归
1.消除直接左递归
若关于A的全部规则为
A Aα1 | Aα2 | …| Aαm | β1 | β2 | … | βn 其中, 每个αi都不等于ε ,每个βi都不以A开头 则消除左递归,得 A (β1 | β2 | … | βn )A’
… S S a
S
a
a
31
3. 自上而下分析法的问题及解决
Q1: 回溯
低效、耗时,对高度递归的语言,无法接受。
解决方案:
对文法加以一定的限制,使每次对候选式的选择是唯一
的,从而进行确定的自上而下分析。
如:LL(1)文法。(详见5.3节)
32
3. 自上而下分析法的问题及解决
Q2:左递归文法将使自上而下分析陷入无限循环 1. 重排规则顺序 (解决方法1)
状态A对应读串的前一半,状态B对应读串的后一半。读前一半时,将所读符号置于 栈顶;读后一半时,边读边与栈顶符号比较,相等则移掉栈顶符号,否则出错。26
(4) f(A, 1, 0)={(A, 10)} (6) f(A, 1, 1)={(A, 11), (B, ε)}
二、上下文无关语言的识别装置:Push Down Automata
3
5.1 语法分析概述
例如:对C程序语句“IF (a<10) b=5;”
词法分析识别出了IF、(、标识符、…等单词符号;
而语法分析则要检查这些单词之间的搭配、结构 是否正确。IF后面是否为(,(后面是否为正确的表 达式等等。
4
5.1 语法分析概述
语法分析是编译过程的核心部分。 主要任务:
按照程序语言的语法规则,在词法分析输出的单 词符号串中识别出各类语法成分,同时进行语法 检查,为语义分析和代码生成作准备。 执行语法分析任务的程序叫语法分析程序或语法 分析器。
(补充内容:选看 包括 23-29页) **
1 定义:下推自动机 PDA(等价于带有下推栈的FA)
PDA是一个六元组(K, Σ, Γ, f, S, Z0)
其中:K:状态的有穷非空集 Σ:有穷输入字母表 Γ:下推字母表,即栈符号的有穷集 f:K× Σ到K的一个映射
S∈K是开始状态
Z0:栈中初始下推符号(可标记何时终止)
属于上下文有关的语法特性在语义分析阶段检查。
11
5.1 语法分析概述
3. 语法分析要点
(2)任何一个歧义文法不存在与其对应的语法分析器, 因此需要为程序设计语言选择能进行确定语法分析的 非歧义文法。 (3)语法分析最终为合法的输入串建立与之匹配的语 法树。
12
5.2 自顶向下语法分析概述
自顶向下分析就是从文法的开始符号出发,按最左推导 方式向下推导,试图推出要分析的输入串。
U Uα Uαα Uααα …
21
一、上下文无关文法的特性
自嵌入性:一个文法G是自嵌入的,若存在一个非 终极符A,有A * αA β, α、β∈V+非空 例如: AaAb|ab 生成语言{anbn| n≥1}
而 AaA|ab
不具有自嵌入性,是三型文法(正则文法)
22
二、上下文无关语言的识别装置:Push Down Automata