编译原理 第四章 语法分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章 语法分析
1
回顾 一个语句的翻译
position:= initial + rate * 60
词法分析器
id 1 := id 2 + id 3 * 60
语法分析器
:= id 1 id 2 id 3
语义分析器
+ * 60
:=
符号表
id 1 id 2
+ * id 3 inttoreal 60
中间代码生成器
的规则改写为
A→αA’|γ1|γ2|… | γm和 A'→β1|β2|…|βn

结果:
S→ if E then SS’|other S'→ε|else S

22
(7)CFG的使用限制

没有一种方法能够有效地分析所有上下文 无关文法

存在无法处理的2型文法(CFG) 每种方法都有适用范围

每种方法能够处理一部分上下文无关文法
20
(6)解决回溯问题-提取左因子

例:if语句的原始文法

S→ if E then S |if E then S else S |other


影响分析:遇到 if 时难以 判断用哪一个产生式进行 匹配(推导) 存在左因子 if E then S
21
左因子提取方法
将形如
A→αβ1|αβ2|…|αβn |γ1|γ2|… | γm
分析器的输入:Token序列 分析器的输出 分析树 出错处理:定位、续编译
词法 分析器 记 号 语法分析器 取下一个 记号 符号表
5

分析方法 自顶向下(递归下降、预测分析) 自底向上(算符优先、LR分析器)
源程序
语法 树
前端的其 它部分
中间 表示
4.2
自顶向下分析面临的问题 与CFG的改造
(1)候选式的确定与回溯

给定文法S→cAd
S c a A b d
A→ab|a
S c A a d
?句子cad是该文法定义语言的句子

产生式(候选式)的选择与回溯(Backtracking):当要进行关于某个语法 变量的推导时,希望能够根据当前符号确定候选式。如果有几个候选式 (右部)左端第一个符号相同,则分析程序无法根据当前输入符号选择 29 产生式,只能试探。
E’→ + T E’|ε
T→ F T’ T’→* F T’|ε F→ ( E )|id
18
例: 间接左递归的消除
S→Ac|c
A→Bb|b B→Sa|a 将B的定义代入A产生式得:A→Sab|ab|b 将A的定义代入S产生式得: S→Sabc|abc|bc|c 消除直接左递归: S→abcS’|bcS’|cS’ S’→abcS’|ε 删除“多余的”产生式:A→Sab|ab|b和 B→Sa|a 结果: S→abcS’|bcS’|cS’ 19 S’→abcS’|ε
(2)无回溯的条件

设A→α1|α2|…|αn是所有的A产生式 如果各个αi能推导出的首终结符各不相 同,则可以构造无回溯的分析。
30
自顶向下分析希望文法满足的条件

从左到右扫描输入串,寻找它的一个最左推 导;

对于G的每个非终结符 A,当A有多个不同的 候选式时,在选择产生某个终结符号时能唯 一选定一个。

表达式文法的语法符号的 FIRST 集
E→TE' E'→+TE’|ε T→FT' T'→*FT’|ε F→(E)|id
FIRST(F)={(,id} FIRST(T)=FIRST(F)={(,id} FIRST(E)=FIRST(T)={(,id} FIRST(E')={+,ε} FIRST(T')={*,ε} FIRST(+)={+}, FIRST(*)={*} FIRST(()={(} FIRST())={)}
(1)自顶向下的分析 从文法的开始符号出发,寻求所给的输入符 号串的一个最左推导。 从树根S开始,构造所给输入符号串的语法树 例:G为:S→xAy A→**|*,输入串:x**y
SxAy S x
x**y
A
y
6
输入串x**y
(2)存在问题
【1】回溯 x * * y
S→xAy A→**|*
例2:给定文法G: S→cAd A→ab|a 对于句子cad,是否为 该文法定义语言的句 子?
26

T F T’ + ε F E’ T
id + id * id 最左推导与语法树的生成对
1、E→TE’ 2、T→FT' 3、F→id 4、T'→ε 5、E'→+TE’ 6、T→FT’ 7、F→id 8、T'→*FT’ 9、F→id 10、T'→ε 11、E'→ε

文法S→Say|* 与它的句子*ayay
S *
*ayay SSay
不对!
Sayay
Sayayay
一个无限 循环!
9
……
Sayay……ayay
(2)存在问题

例 CFG:简单算术表达式的文法(语法)
E→E+T|E-T|T T→T*F|T/F|F F→(E)|id VN={E,T,F,P,FUN,L} VT={id,+,-,*,/,(,)} S=E
36
FOLLOW集的定义
例 文法 G (1) S→aBC (2) B→bC (4) B→ ε (5) C→c 请分析句子ada。
2
第四章

语法分析
递归子程序法
从根开始,逐 步为某语句构 造一棵语法树
语法分析方法

文法产生语 言
自顶向下 预测分析法(LL(1)) 算符优先分析法
相反,将一句 子归约为开始 符号
Top Down
自动机识别语言

自底向上
Bottom Up LR(0)、SLR(1)[LR(1)、LALR]
假定文法是压缩的:即删除了单位产生式和无用产生式。

无法根据左递归文法进行自顶向下的分析 A a1a2……ai……an 直接左递归

A Aα
当前变量
输入指针
(栈顶、最左变量)
间接左递归 A+Aα 左递归的消除方法 将A→Aα|β替换为A→βA′
和 A′→αA′|ε
17
例:表达式文法直接左递归的消除
E → E + T|T T → T * F|F F → ( E )|id E→ T E’
S xAy x*y
S
xAy x**y
匹配成功
S x A y
发ຫໍສະໝຸດ Baidu不匹配,需要回退
x * * y
S x A y
7
存在回溯的原因

文法中每个非终结符A的产生式右部称为 A的候选式,如果有多个候选式左端第一 个符号相同,则语法分析程序无法根据 当前输入符号选择产生式,只能试探。
8
(2)存在问题
【2】左递归问题
3
主要内容



4.1 4.2 4.3 4.4 4.5 4.6 4.7
语法分析的功能 自顶向下分析面临的问题与CFG的改造 自顶向下的分析方法 预测分析器(LL(1)分析器) 自底向上分析 LR(Left-Right)分析法 LR(1)分析
4
4.1

语法分析的功能
检查由扫描器输出的单词符号序列是否符 合该语言的文法——句子
1 2 3 4
position initial rate
… … …
temp1 := inttoreal(60) temp2 := id3 *temp1 temp3 := id2 +temp2 id1 := temp3
代码优化器
temp1 := id3 *60.0 id1 := id2 + temp1
13
一个句子有两棵不同的语法树
S S E E S S If a≠0 then if a>0 then b=1 else b=-1 S S E E S S If a≠0 then if a>0 then b=1 else b=-1
(4)消除二义性

重写文法:引入新的语法变量
S→U|M U→if E then S U→if E then M else U M→if E then M else M|other
每个else与前面最近的没有配对的then配对,即:出现在then 和else之间的语句必须是配对的
15
按照改造后的文法构造的语法树
M→if E then M else M|other
S U S M
E
If a≠0 then if
E
a>0 then
M
M
b=1 else b= -1
(5)消除左递归

11
(4)消除二义性
例:简单算术表达式的文法 二义性文法 E→E+E|E-E|E*E|E/E|(E)|id 非二义性文法 E→E+T|E-T|T T→T*F|T/F|F F→(E)|id 改造方法:使文法含有更多的信息,引入语法变量 12
(4)消除二义性
再例:If语句 S→if E then S S→if E then S else S S→other 设执行下列语句前b=0, If a≠0 then if a>0 then b=1 else b=-1 当a=1时,b=1;当a=-1时,b=-1 If a≠0 then if a>0 then b=1 else b=-1 当a=1时,b=1;当a=-1时,b=0
消除左递归的一般方法

用产生式组

Aβ1 B|β2 B |…|βn B Bα1 B|α2 B |…|αn B|ε A→Aα1|Aα2|…|Aαn|β1|β2|…|βm 其中:B为新变量,相当于A’


替换产生式组


消除左递归的算法见P135的算法4.19
为非终结符编号,再采用代入法将间接左递归变 为直接左递归,消除直接左递归
4.3 自顶向下的分析方法

基本思想

寻找输入符号串的最左推导 试图根据当前输入单词判断使用哪个产生式

基本过程

从根开始,按与最左推导相对应的顺序,构 造输入符号串(Token)的分析树
25
例1:表达式文法G: E → T E’ E’→ + T E’|ε T → F T’ T’→ * F T’|ε F → ( E )|id 对于句子: id + id * id , 按照最左推导过程, 构造分析树
E’ T’ ε
id
id
* F T’ id ε
id + id * id的最左推导再现 E TE’ FT’E’ idT’E’ idE’ id+TE’ id+FT’E’ id+idT’E’ id+id*FT’E’ id+id*idT’E’ id+id*idE’ id+id*id E →TE’ T →FT’ F →id T’→ε E’→+TE’ T →FT’ F →id T’→*FT’ F →id T’→ε E’→ε

23
(8)常用文法与分析方法

LL文法和 LR 文法都是CFG的子集(无二义性)

可用不同的文法来描述同一语言 LL文法 ── 递归下降分析法、预测分析法

对于不同的文法,可用不同的分析方法

LR文法 ── LR分析法
LL 文法多用于编译的手工实现 LR 文法多用于编译的自动生成
24
31
4.3.1

FIRST 和 FOLLOW 集
First集的定义 对于α∈(VT∪VN)* 定义:α的首符号集

FIRST(α)={a|α*a…,a∈VT *}
32
求文法非终结符的FIRST集方法
1) 对X为终结符,则FIRST(X)={X} ; 2) 对X∈VN,则FIRST(X): {a|X→a…∈P}; FIRST(X)= X→εP
{a|X→a…∈P}∪{ε}; X→ε∈P
33
3)对X∈VN,重复如下过程,直到所有FIRST集不变 若 X→Y…∈P ,且 Y∈VN, 则 FIRST(X)= FIRST(X)∪(FIRST(Y)-{ε}); 若 X→Y1…Yn∈P,且Y1...Yi-1*ε, 则 对k=1到i-1: FIRST(X)= FIRST(X)∪(FIRST(Yk)-{ε}) ; 若 Y1...Yn*ε, 则 FIRST(X)=FIRST(X)∪{ε} 。


10
(3)重要概念回顾




推导: αAβαγβ (依据:A→γ) 最左(Left-most)推导——最左分析 左句型 最左推导对应最右归约 最右(Right-most)推导——最右分析 规范推导、规范句型(右句型) 最右推导对应最左归约(规范归约) 二义性(先天二义性语言、二义性文法)
FIRST(id)={id}
35
求FIRST(α) 的算法


令α= X1…Xn
初值



FIRST(α)= FIRST(X1)-{ε}; k=1; 循环 while ε∈FIRST(Xk)&k<n do FIRST(α)= FIRST(α)∪(FIRST(Xk+1)-{ε}) ; K=k+1; 结束处理 if k=n&ε∈FIRST(Xk) then FIRST(α)=FIRST(α)∪{ε}
相关文档
最新文档