You are on page 1of 124

编译技术

Compiler Techniques

胡春明
hucm@buaa.edu.cn
2022.8-2022.12

北京航空航天大学计算机学院、软件学院
编译过程是指将高级语言程序翻译为等价的目标程
序的过程。

习惯上是将编译过程划分为5个基本阶段:

词法分析
语法分析
语义分析、生成中间代码
代码优化
生成目标程序

北京航空航天大学计算机学院 2
语法分析的任务:回顾

北京航空航天大学计算机学院 3
自顶向下(Top-Down)分析:推导(Derivations)

+
若Z  S 则 S  L(G[Z]) 否则 S  L(G[Z])
G[Z]

自底向上(Bottom-Up)分析:规约(Reductions)
+
若Z  S 则 S L(G[Z]) 否则 S  L(G[Z])
G[Z]

北京航空航天大学计算机学院 4
自顶向下(Top-Down)分析:推导(Derivations)
+
若Z  S 则 S  L(G[Z]) 否则 S  L(G[Z])
G[Z]

(1)推导顺序:有多个“非终结符”,优先用哪个?
(2)避免二义性:避免文法有多个可用规则

 主要问题: ▪ 主要方法:
➢ 左递归问题 • 递归子程序法
➢ 回溯问题 • LL分析法

北京航空航天大学计算机学院 5
自顶向下分析方法特点:

1. 分析过程是带预测的,对输入符号串要预测属于什么
语法成分,然后根据该语法成分的文法建立语法树。

2. 分析过程是一种试探过程,是尽一切办法(选用不同
规则) 来建立语法树的过程, 由于是试探过程, 难免
有失败, 所以分析过程需进行回溯, 因此也称这种方法
是带回溯的自顶向下分析方法。

3. 最左推导可以编写程序来实现, 但带溯的自顶向下分
析方法在实际上价值不大, 效率低。

北京航空航天大学计算机学院 6
二义性问题

北京航空航天大学计算机学院 7
对于句子S=i+i * i ∈ L( G[E] ),存在不同的规
范推导:
(1) E==>E+E==>E+E*E ==>E+E*i ==>E+i*i ==> i+i * i
(2) E==> E*E ==> E*i ==> E+E*i ==> E+i*i ==> i+i * i

这两种不同的推导对应了两棵不同的语法树:

E E

E + E E * E

i E E E E i
* +

i i i i
北京航空航天大学计算机学院 8
让我们回到文法的世界来看二义性

北京航空航天大学计算机学院 9
若文法是二义性的,则在编译时就会产生不确定性,
遗憾的是在理论上已经证明:文法的二义性是不可判定的,
即不可能构造出一个算法,通过有限步骤来判定任一文法
是否有二义性。
现在的解决办法是:提出一些限制条件,称为无二义性
的充分条件,当文法满足这些条件时,就可以判定文法是无
二义性的。

例:算术表达式的文法 E::= E+T | T


E::= E+E | E*E | (E) | i T ::= T*F | F
F ::= (E) | i

北京航空航天大学计算机学院 10
优先级的实现:层次定义
越靠上层,优先级越低;越靠下层,优先级越高

Source: Stanford CS143 (2012)

北京航空航天大学计算机学院 11
左递归问题

北京航空航天大学计算机学院 12
4.2.2 自顶向下分析存在的问题及解决方法

1 、 左递归文法:

有如下文法:
令U是文法的任一非终结符,文法中有规则
+
U∷=U¨¨或者U U¨¨

这个文法是左递归的。

自顶向下分析的基本缺点是:
不能处理具有左递归性的文法

为什么?

北京航空航天大学计算机学院 13
方法:将左递归规则改为右递归规则

规则三

若:P∷=P| 
则可改写为:P ∷=  P’
P’ ∷= P’| ε

北京航空航天大学计算机学院 14
规则一:(提因子)
规则二:U∷=x|y|……|z|Uv, 则U∷=(x|y|……|z){v}
规则三:右递归P∷=P| ,则P ∷=  P’,P’ ∷= P’| ε

例1 E∷=E+T|T 例2 T∷=T*F|T/F|F
右部无公因子,所以不能 T∷=T(*F|/F) | F 规则一
用规则一。 T∷=F|T(*F|/F)
为了使用规则二, T∷=F{(*F|/F)} 规则二
令E∷=T|E+T 即T∷=F{*F|/F}
∴由规则二可以得到
E∷=T{+T} 右递归:
T ::= FT’
T’ ::= *FT’ | /FT’ | ε

北京航空航天大学计算机学院 15
回溯问题

北京航空航天大学计算机学院 16
消除回溯的文法的两个条件
为了在不采取超前扫描的前提下实现不带回溯的自顶向
下分析,文法需要满足两个条件:

1、文法是非左递归的;
2、 对文法的任一非终结符,若其规则右部有多个选择时, 各选择
所推出的终结符号串的首符号集合要两两不相交。
[定义] 设文法G(不具有左递归性),UVn
U::=  1 |  2 |  3
FIRST(αi) = {a | αi * a…, a Vt }
为避免回溯,对文法的要求是:
FIRST(αi) ∩ FIRST(αj)=φ (ij)

在上述条件下,就可以根据文法构造有效的、不带回溯的
自顶向下分析器。
北京航空航天大学计算机学院 17
*
定义:FOLLOW(A)={a| Z…Aa…,a∈Vt}

A∈Vn , Z识别符号
该集合称为A的后继符号集合。
特殊地:若Z ...A
* 则 #∈FOLLOW(A)

不带回溯的充分必要条件是:对于G的
每一个非终结符A的任意两条规则A::=α|β,下列条件成立:

1、FIRST(α) ∩ FIRST(β) = Ф

* ε, 则FIRST(α) ∩ FOLLOW(A) = Ф
2、若β==>

北京航空航天大学计算机学院 18
LL(1)文法

北京航空航天大学计算机学院 19
LL(1)文法
是一种自顶向下的分析方法(与递归下降类似)。
L:从左向右分析 (Left to right)
L:产生“最左推导”(Left-most derivation)
k=1:向前查看“k=1”个符号

LL(1)
通过向前看1个符号就能够有效分析:
无二义,无左递归,且能够消除回溯
1、FIRST(α) ∩ FIRST(β) = Ф
* ε, 则FIRST(α) ∩ FOLLOW(A) = Ф
2、若β==>
北京航空航天大学计算机学院 20
1. FIRST集的计算

设有文法G[Z]:
*
定义:FIRST(α)={a| αa…,a∈Vt}

α∈V* , 若αε,则ε∈FIRST(α)
*
该集合称为α的头符号集合。

*
定义:FOLLOW(A)={a| Z…Aa…,a∈Vt}

A∈Vn , Z识别符号
该集合称为A的后继符号集合。
特殊地:若Z ...A
* 则 #∈FOLLOW(A)
北京航空航天大学计算机学院 21
构造集合FIRST的算法

设α=X1X2...Xn, Xi∈Vn Vt (即 Xi ∈V )


求FIRST(α)=?

首先求出组成α的每一个符号Xi的FIRST集合

(1) 若Xi∈Vt,则 FIRST(Xi) = {Xi}

(2) 若Xi ∈Vn 且 Xi∷=a…..|ε, a ∈Vt


则 FIRST(Xi)={a,ε}
注:FIRST集合中可以有 ε
北京航空航天大学计算机学院 22
(3) 若Xi ∈Vn 且Xi∷=y1 y2 …yk,则按如下顺序计算FIRST(Xi)
FIRST(Xi)  FIRST(y1) –{ε};
若ε∈FIRST(y1) 则将FIRST(y2)-{ε}加入FIRST(Xi);
若ε∈FIRST(y1)
ε∈FIRST(y2) 则将FIRST(y3)-{ε}加入FIRST(Xi)
........
若ε∈FIRST(yk-1) 则将FIRST(yk)-{ε}加入FIRST(Xi)
若ε ∈FIRST(y1) ~ FIRST(yk)
则将ε加入FIRST(Xi)

注意:要顺序往下做,一旦不满足条件,过程就要中断进行
得到FIRST(Xi),即可求出FIRST(α)。
北京航空航天大学计算机学院 23
2.构造集合FOLLOW的算法

设S, A, B∈Vn ,
算法:连续使用以下规则,直至FOLLOW集合不再扩大

(1) 若S为识别符号,则把“#”加入FOLLOW(S)中

(2) 若A∷=αBβ (β≠ε),则把 FIRST(β)-{ε} 加入FOLLOW(B)

*
(3) 若A∷=αB 或A∷=αBβ, 且βε则把FOLLOW(A)加
入FOLLOW(B)

注:FOLLOW集合中不能有 ε

北京航空航天大学计算机学院 24
LL(1)语言
一个语言如果存在 LL(1) 文法,就是LL(1)语言

p.262, 文法 G=({S,A,B,C}, {a,b,c}, P, S) 是 LL(1) 文法吗?

S→abB
A→SC
A→BAA
A→ε
B→AbA
C→B
C→c

北京航空航天大学计算机学院 25
LL(1)语言
一个语言如果存在 LL(1) 文法,就是LL(1)语言

p.262, 文法 G=({S,A,B,C}, {a,b,c}, P, S) 是 LL(1) 文法吗?

S→abB FIRST FOLLOW


A→SC S {a}
A→BAA
A {ε} U (FIRST(B) -{ε})
A→ε U (FIRST(S) -{ε})
B→AbA
B {b} U (FIRST(A) -{ε})
C→B
C {c} U (FIRST(B) -{ε})
C→c

北京航空航天大学计算机学院 26
LL(1)语言
一个语言如果存在 LL(1) 文法,就是LL(1)语言

p.262, 文法 G=({S,A,B,C}, {a,b,c}, P, S) 是 LL(1) 文法吗?

S→abB FIRST FOLLOW


A→SC S {a}
A→BAA
A {ε, a, b}
A→ε
B {a, b}
B→AbA
C {a, b, c}
C→B
C→c

北京航空航天大学计算机学院 27
LL(1)语言
一个语言如果存在 LL(1) 文法,就是LL(1)语言

p.262, 文法 G=({S,A,B,C}, {a,b,c}, P, S) 是 LL(1) 文法吗?


FIRST FOLLOW
S→abB
S {a} {#} U FIRST(C) -{ε}
A→SC
A→BAA A {ε, a, b} {b} U FIRST(A)-{ε} U
FOLLOW(A) U
A→ε
FOLLOW(B)
B→AbA
B {a, b} {} U FOLLOW(S) U
C→B
FIRST(A) -{ε} U
C→c
FOLLOW(A) U
FOLLOW(C)
28
北京航空航天大学计算机学院C {a, b, c} {} U FOLLOW(A)
LL(1)语言
一个语言如果存在 LL(1) 文法,就是LL(1)语言

p.262, 文法 G=({S,A,B,C}, {a,b,c}, P, S) 是 LL(1) 文法吗?


FIRST FOLLOW
S→abB
S {a} {#, a, b, c}
A→SC
A→BAA A {ε, a, b} {b} U {a, b} U
FOLLOW(A) U
A→ε
FOLLOW(B)
B→AbA
B {a, b} {#, a, b, c} U {a, b} U
C→B
FOLLOW(A) U
C→c
FOLLOW(C)
C {a, b, c} {} U FOLLOW(A)
北京航空航天大学计算机学院 29
LL(1)语言
一个语言如果存在 LL(1) 文法,就是LL(1)语言

p.262, 文法 G=({S,A,B,C}, {a,b,c}, P, S) 是 LL(1) 文法吗?


FIRST FOLLOW
S→abB
S {a} {#, a, b, c}
A→SC
A→BAA A {ε, a, b} {a, b} FOLLOW(A) U
FOLLOW(B)
A→ε
B→AbA B {a, b} {#, a, b, c} U
FOLLOW(A) U
C→B
FOLLOW(C)
C→c
C {a, b, c} {} U FOLLOW(A)

北京航空航天大学计算机学院 30
LL(1)语言
一个语言如果存在 LL(1) 文法,就是LL(1)语言

p.262, 文法 G=({S,A,B,C}, {a,b,c}, P, S) 是 LL(1) 文法吗?


FIRST FOLLOW
S→abB
S {a} {#, a, b, c}
A→SC
A→BAA A {ε, a, b} {#, a, b, c}
A→ε B {a, b} {#, a, b, c}
B→AbA C {a, b, c} {#, a, b, c}
C→B
C→c

北京航空航天大学计算机学院 31
LL(1)语言
一个语言如果存在 LL(1) 文法,就是LL(1)语言

p.262, 文法 G=({S,A,B,C}, {a,b,c}, P, S) 是 LL(1) 文法吗?

S→abB FIRST(SC) = {a}


A→SC FIRST(BAA) = {a,b}
A→BAA
所以:FIRST(SC)∩FIRST(BAA) ≠ ∅
A→ε
B→AbA
C→B
C→c

北京航空航天大学计算机学院 32
LL(1)语言
一个语言如果存在 LL(1) 文法,就是LL(1)语言

p.262, 文法 G=({S,A,B,C}, {a,b,c}, P, S) 是 LL(1) 文法吗?

S→abB
A→SC A→abBC
A→BAA A→AbAAA A→bAAA{A}
A→ε
A→ AbAAA | ε | abBC
B→AbA
C→B A→ (abBC | ε ) A’
C→c A’ →bAAAA’
A’ →ε

北京航空航天大学计算机学院 33
LL(1)语言
一个语言如果存在 LL(1) 文法,就是LL(1)语言

p.262, 文法 G=({S,A,B,C}, {a,b,c}, P, S) 是 LL(1) 文法吗?

S→abB FIRST FOLLOW


A→ abBCA’ S {a} {#, a, b, c}
A’ →bAAAA’ A {ε, a} {#, a, b, c}
A’ →ε A’ {ε, b} {#, a, b, c}
A→ε B {a, b} {#, a, b, c}
B→AbA
C {a, b, c} {#, a, b, c}
C→B
C→c
北京航空航天大学计算机学院 34
LL(1)语言
一个语言如果存在 LL(1) 文法,就是LL(1)语言

p.262, 文法 G=({S,A,B,C}, {a,b,c}, P, S) 是 LL(1) 文法吗?

S→abB FIRST(abBCA’) = {a}


A→ abBCA’ FOLLOW(A) = {#, a, b, c}
A’ →bAAAA’
所以:FIRST(abBCA’)∩FOLLOW(A)≠{}
A’ →ε
A→ε FIRST(bAAAA’) = {b}
B→AbA FOLLOW(A’) = {#, a, b, c}
C→B 所以:FIRST(bAAAA’)∩FOLLOW(A’)≠{}
C→c
北京航空航天大学计算机学院 35
预测分析法:LL(1)分析

北京航空航天大学计算机学院 36
12.1 LL分析法

LL-自左向右扫描、自左向右地分析和匹配输入串。
 分析过程表现为最左推导的性质。

1、LL分析程序构造及分析过程
输入串
#
由三部分组成:
分析表 符号栈 执行程序
执行程序 (总控程序) #
分析表
符号栈 (分析栈)

北京航空航天大学计算机学院 37
输入串

在实际语言中,每一种
符号栈 执行程序
语法成分都有确定的左右界
#
符,为了研究问题方便,统 分析表
一以‘#’表示。

(1)分析表:二维矩阵M, A ∈Vn , a ∈ Vt U {#}


A→αi
M[A,a]=
error

北京航空航天大学计算机学院 38
M[A,a] = A→αi
表示当要用A去匹配输入串时,且当前输
入符号为a时,可用A的第i个选择去匹配
*
即 当αi≠ε时,有αi a…;
当αi=ε时,则a为A的后继符号

M[A,a] = error
表示当用A去匹配输入串时,若当前输入符
*
号为a,则不能匹配,表示无Aa…,或a不是A的
后继符号

北京航空航天大学计算机学院 39
(2)符号栈: 有四种情况

• 开始状态
xxxxxx#

符号栈
#E E#

a
• 工作状态
X X::=i
查分析表得:
a……#
X ∈Vn, M[X,a] = X∷=αi
符号栈
X a…
+
#…..X

X….# X ∈Vt, X = a

北京航空航天大学计算机学院 40
a
• 出错状态 X error
a……#
查分析表得:
符号栈
#…..X X ∈Vn, M[X,a] = error
无X a…
+

X….#
X ∈Vt, X  a

• 结束状态
#

符号栈
# #

北京航空航天大学计算机学院 41
a……#
符号栈
#…..X

(3)执行程序
X….#
执行程序主要实现如下操作:

1. 把#和文法识别符号E推进栈, 读入下一个符号,
重复下述过程直到正常结束或出错。

2. 测定栈顶符号X和当前输入符号a,执行如下操作:

(1) 若X=a=#,分析成功,停止。E匹配输入串成功。
(2) 若X=a≠#,把X推出栈,再读入下一个符号。
(3) 若X∈Vn,查分析表M。

北京航空航天大学计算机学院 42
(3) 若X∈Vn,查分析表M

a) M[X,a] = X∷= UVW #…..X #…..WVU


则将X弹出栈,将UVW压入
注:U在栈顶 (最左推导) X….# UVW….#

b) M[X, a] = error 转出错处理

c) M[X, a] = X::=ε, a
— a为X的后继符号 X X::=UVW

则将X弹出栈 (不读下一符号)
继续分析。

北京航空航天大学计算机学院 43
2、分析表的构造

目标: 终结符号

非 规则或Error



a) M[X, a] = error 转出错处理


b) M[X,a] = X∷= UVW ---需要求First集
c) M[X, a] = X::=ε,
— a为X的后继符号---如何知道X的后继符号,
引入Follow(X)
北京航空航天大学计算机学院 44
2、构造分析表

基本思想: 终结符号
当文法中某一非终结符呈现在 非
栈顶时, 根据当前的输入符号, 终

分析表应指示要用该非终结符 符
的哪一条规则去匹配输入串 号
(即进行一步最左推导)

根据这个思想, 不难把构造分析表算法构造出来!

北京航空航天大学计算机学院 45
算法:
设A∷=αi为文法中的任意一条规则,a为任一终结符或#。
1、若a ∈FIRST( αi ),则A::= αi ==> M[A,a]
表示:A在栈顶,输入符号是a,应选择αi 去匹配
+
2、若αi =ε或αi  ε,而且a ∈FOLLOW(A),
则A::= αi ==>M[A,a],表示A已经匹配输入串成功,
其后继符号终结符a由A后面的语法成分去匹配。
终结符号
3、把所有无定义的M[A,a]都标上error





北京航空航天大学计算机学院 46
例:文法G[E]
E ::= E +T | T
消除左递归 E ::= TE’
T ::= T * F | F
F ::= (E)|i E ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε
F ::= (E)|i

北京航空航天大学计算机学院 47
例:文法G[E]

E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε
F ::= (E)|i

北京航空航天大学计算机学院 48
例:文法G[E]

E ::= TE’ FIRST FOLLOW


E’ ::= +TE’|ε E {}U Fi(T)
E’ {+, ε}
T ::= FT’
T {}U Fi(F)
T’ ::= *FT’|ε
T’ {*, ε}
F ::= (E)|i F {(, i}

北京航空航天大学计算机学院 49
例:文法G[E]

E ::= TE’ FIRST FOLLOW


E’ ::= +TE’|ε E {(, i}
E’ {+, ε}
T ::= FT’
T {(, i}
T’ ::= *FT’|ε
T’ {*, ε}
F ::= (E)|i F {(, i}

北京航空航天大学计算机学院 50
例:文法G[E]

E ::= TE’ FIRST FOLLOW


E’ ::= +TE’|ε E {(, i} {), #}
E’ {+, ε} {} U Fo(E)
T ::= FT’
T {(, i} {}U fi(E’)-{ε} U Fo(E)
T’ ::= *FT’|ε U Fo(E’)
F ::= (E)|i T’ {*, ε} {} U Fo(T)
F {(, i} {} U Fi(T’)-{ε} U
Fo(T’) U Fo(T)

北京航空航天大学计算机学院 51
例:文法G[E]

E ::= TE’ FIRST FOLLOW


E’ ::= +TE’|ε E {(, i} {), #}
E’ {+, ε} {} U Fo(E)
T ::= FT’
T {(, i} {+}U Fo(E) U Fo(E’)
T’ ::= *FT’|ε
T’ {*, ε} {} U Fo(T)
F ::= (E)|i F {(, i} {*} U Fo(T’) U Fo(T)

北京航空航天大学计算机学院 52
例:文法G[E]

E ::= TE’ FIRST FOLLOW


E’ ::= +TE’|ε E {(, i} {), #}
E’ {+, ε} {), #} U Fo(E)
T ::= FT’
T {(, i} {+, ), #}U Fo(E) U
T’ ::= *FT’|ε Fo(E’)
F ::= (E)|i T’ {*, ε} {+, ), #}U Fo(T)
F {(, i} {*, +, ), #} U Fo(T’) U
Fo(T)

北京航空航天大学计算机学院 53
例:文法G[E]

E ::= TE’ FIRST FOLLOW


E’ ::= +TE’|ε E {(, i} {), #}
E’ {+, ε} {), #}
T ::= FT’
T {(, i} {+, ), #}
T’ ::= *FT’|ε
T’ {*, ε} {+, ), #}
F ::= (E)|i F {(, i} {*, +, ), #}

北京航空航天大学计算机学院 54
E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε
E ::= TE’
F ::= (E)|i First(E) = {(, i}
i + * ( ) #
E
E’
T
T’
F

北京航空航天大学计算机学院 55
E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε
E ::= TE’
F ::= (E)|i First(E) = {(, i}
i + * ( ) #
E E::=TE’ E::=TE’
E’
T
T’
F

北京航空航天大学计算机学院 56
E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε
E’::= +TE’|ε
F ::= (E)|i First(E’) = {+, ε}
i + * ( ) #
E E::=TE’ E::=TE’
E’
T
T’
F

北京航空航天大学计算机学院 57
E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε E’::= +TE’|ε
F ::= (E)|i
First(E’) = {+, ε}
Follow(E’) = {), #}
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’
T
T’
F

北京航空航天大学计算机学院 58
E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε E’::= +TE’|ε
F ::= (E)|i
First(E’) = {+, ε}
Follow(E’) = {), #}
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T
T’
F

北京航空航天大学计算机学院 59
E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε T::= FT’
F ::= (E)|i
First(T) = {(, i}

i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T
T’
F

北京航空航天大学计算机学院 60
E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε T::= FT’
F ::= (E)|i
First(T) = {(, i}

i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’
F

北京航空航天大学计算机学院 61
E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε T’::= *FT’|ε
F ::= (E)|i
First(T’) = {*, ε}
Follow(T’) = {+, ), #}
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’
F

北京航空航天大学计算机学院 62
E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε T’::= *FT’|ε
F ::= (E)|i
First(T’) = {*, ε}
Follow(T’) = {+, ), #}
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=*FT’
F

北京航空航天大学计算机学院 63
E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε T’::= *FT’|ε
F ::= (E)|i
First(T’) = {*, ε}
Follow(T’) = {+, ), #}
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F

北京航空航天大学计算机学院 64
E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε F::= (E)|i
F ::= (E)|i
First(T’) = {(, i}

i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F

北京航空航天大学计算机学院 65
E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε F::= (E)|i
F ::= (E)|i
First(T’) = {(, i}

i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

北京航空航天大学计算机学院 66
E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε
F ::= (E)|i

i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

北京航空航天大学计算机学院 67
E ::= TE’
E’ ::= +TE’|ε
T ::= FT’
T’ ::= *FT’|ε
F ::= (E)|i

i + * ( ) #
E E::=TE’ (ERROR) (ERROR) E::=TE’ (ERROR) (ERROR)
E’ (ERROR) E’::=+TE’ (ERROR) (ERROR) E’::=ε E’::=ε
T T::=FT’ (ERROR) (ERROR) T::=FT’ (ERROR) (ERROR)
T’ (ERROR) T’::=ε T’::=*FT’ (ERROR) T’::=ε T’::=ε
F F::=i (ERROR) (ERROR) F::=(E) (ERROR) (ERROR)

北京航空航天大学计算机学院 68
用此构造分析表的算法,可以构造任何文法的分析表,
但对于某些文法,有些M[A,a]中可能有若干条规则,这称
为分析表的多重定义或者多重入口。
可以证明: 如果G是左递归的,或者是二义性的文法,则至少有一
个多重入口。

左递归: U∷=U…| a …
则有:FIRST(U…)∩FIRST(a…)≠φ
∴M[U,a]={U∷=U…, U∷=a…}

二义文法: 对文法所定义的某些句子存在着两个最左推导,
即在推导的某些步上存在多重定义,有两条规则
可用,所以分析表是多重定义的。

北京航空航天大学计算机学院 69
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: E 输入串为: i+i*i#


# E i + i * i #

北京航空航天大学计算机学院 70
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: E 输入串为: i+i*i#


# E E::=TE’ i + i * i #

北京航空航天大学计算机学院 71
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: T 输入串为: i+i*i#


# E’ T i + i * i #

E::=TE’

北京航空航天大学计算机学院 72
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: T 输入串为: i+i*i#


# E’ T T::=FT’ i + i * i #

E::=TE’

北京航空航天大学计算机学院 73
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: F 输入串为: i+i*i#


# E’ T’ F i + i * i #

E::=TE’::=FT’E’

北京航空航天大学计算机学院 74
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: F 输入串为: i+i*i#


# E’ T’ F F::=i i + i * i #

E::=TE’::=FT’E’

北京航空航天大学计算机学院 75
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: i 输入串为: i+i*i#


# E’ T’ i i + i * i #

E::=TE’::=FT’E’::=iT’E’

北京航空航天大学计算机学院 76
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: T’ 输入串为: i+i*i#


# E’ T’ i + i * i #

E::=TE’::=FT’E’::=iT’E’

北京航空航天大学计算机学院 77
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: T’ 输入串为: i+i*i#


# E’ T’ T’::=ε i + i * i #

E::=TE’::=FT’E’::=iT’E’

北京航空航天大学计算机学院 78
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: E’ 输入串为: i+i*i#


# E’ i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’

北京航空航天大学计算机学院 79
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: E’ 输入串为: i+i*i#


# E’ E’::=+TE’ i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’

北京航空航天大学计算机学院 80
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: + 输入串为: i+i*i#


# E’ T + i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’

北京航空航天大学计算机学院 81
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: T 输入串为: i+i*i#


# E’ T i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’

北京航空航天大学计算机学院 82
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: T 输入串为: i+i*i#


# E’ T T::=FT’ i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’

北京航空航天大学计算机学院 83
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: F 输入串为: i+i*i#


# E’ T’ F i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’

北京航空航天大学计算机学院 84
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: F 输入串为: i+i*i#


# E’ T’ F F::=i i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’

北京航空航天大学计算机学院 85
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: i 输入串为: i+i*i#


# E’ T’ i i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’::=i+iT’E’

北京航空航天大学计算机学院 86
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: T’ 输入串为: i+i*i#


# E’ T’ i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’::=i+iT’E’

北京航空航天大学计算机学院 87
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: T’ 输入串为: i+i*i#


# E’ T’ T’::=*FT’ i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’::=i+iT’E’

北京航空航天大学计算机学院 88
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: * 输入串为: i+i*i#


# E’ T’ F * i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’::=i+iT’E’::=i+i*FT’E’

北京航空航天大学计算机学院 89
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: F 输入串为: i+i*i#


# E’ T’ F i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’::=i+iT’E’::=i+i*FT’E’

北京航空航天大学计算机学院 90
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: F 输入串为: i+i*i#


# E’ T’ F F::=i i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’::=i+iT’E’::=i+i*FT’E’

北京航空航天大学计算机学院 91
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: i 输入串为: i+i*i#


# E’ T’ i i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’::=i+iT’E’::=i+i*FT’E’
::=i+i*iT’E’

北京航空航天大学计算机学院 92
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: T’ 输入串为: i+i*i#


# E’ T’ i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’::=i+iT’E’::=i+i*FT’E’
::=i+i*iT’E’

北京航空航天大学计算机学院 93
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: T’ 输入串为: i+i*i#


# E’ T’ T’::=ε i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’::=i+iT’E’::=i+i*FT’E’
::=i+i*iT’E’

北京航空航天大学计算机学院 94
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: E’ 输入串为: i+i*i#


# E’ i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’::=i+iT’E’::=i+i*FT’E’
::=i+i*iT’E’::=i+i*iE’

北京航空航天大学计算机学院 95
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: E’ 输入串为: i+i*i#


# E’ E’::=ε i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’::=i+iT’E’::=i+i*FT’E’
::=i+i*iT’E’::=i+i*iE’

北京航空航天大学计算机学院 96
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: # 输入串为: i+i*i#


# i + i * i #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’::=i+iT’E’::=i+i*FT’E’
::=i+i*iT’E’::=i+i*i

北京航空航天大学计算机学院 97
i + * ( ) #

E E::=TE' E::=
TE'
E' F::=i E'::= E'::=ε E'::=ε
+TE'
T T::=FT' T::=
FT'
T' T'::= T'::= T'::=ε T'::=ε
ε *FT'
F F::=i F::=
(E)

输入串为: i+i*i#

步骤 符号栈 读入符号 剩余符号串 使用规则


1. #E E# i +i*i#
2. #E’T TE’# i +i*i# E::=TE’
3. #E’T’F FT’E’# i +i*i# T::=FT’
4. #E’T’ i iT’E’# i +i*i# F::= i
5. #E’T’ T’E’# + i*i# (出栈,读下一个符号)
6. #E’ E’# + i*i# T::= ε
7. #E’T+ +TE’# + i*i# E’::=+TE’
北京航空航天大学计算机学院 98
i + * ( ) #

E E::=TE' E::=
TE'
E' F::=i E'::= E'::=ε E'::=ε
+TE'
T T::=FT' T::=
FT'
T' T'::= T'::= T'::=ε T'::=ε
ε *FT'
F F::=i F::=
(E)

步骤 符号栈 读入符号 剩余符号串 使用规则


8. #E’T i *i#
9. #E’T’F i *i# T::=FT’
10. #E’T’ i i *i# F::= i
11. #E’T’ * i#
12. #E’T’F* * i# T’::=*FT’
13. #E’T’F i #
14. #E’T’ i i # F::= i
15. #E’T’ #
16. #E’ # T’::= ε
17. # # E’::= ε
北京航空航天大学计算机学院 99
推导过程:

E  TE'  FT'E'  iT'E' iE'


 i+TE'  i+FT'E'  i+iT'E'
 i+i*FT'E'  i+i*iT'E'
 i+i*iE'  i+i*i

最左推导。

北京航空航天大学计算机学院 100
4、LL分析的错误恢复

当符号栈顶的终结符和下一个输入符号不匹配,或栈
顶是非终结符A, 输入符号a,而M[A,a]为空白(即error)时,
分析发现错误。

错误恢复的基本思想是: 跳过一些输入符号,直到期望
的同步符号之一出现为止。
同步符号(可重新开始继续分析的输入符号)集合通
常可按以下方法确定:

北京航空航天大学计算机学院 101
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: F 输入串为: i+i*+#


# E’ T’ F i + i * + #

E::=TE’::=FT’E’::=iT’E’::=iE’::=i+TE’::=i+FT’E’::=i+iT’E’::=i+i*FT’E’

北京航空航天大学计算机学院 102
i + * ( ) #
E E::=TE’ E::=TE’
E’ E’::=+TE’ E’::=ε E’::=ε
T T::=FT’ T::=FT’
T’ T’::=ε T’::=*FT’ T’::=ε T’::=ε
F F::=i F::=(E)

符号栈顶: F 输入串为: i+i*+#


# E’ T’ F (ERROR) i + i * + #

北京航空航天大学计算机学院 103
一个LL(1)分析的例子

北京航空航天大学计算机学院 104
Source: Stanford CS143 (2012)

北京航空航天大学计算机学院 105
FIRST集的计算

文法没有 x→ε,不需要计算 FOLLOW 集


Source: Stanford CS143 (2012)

北京航空航天大学计算机学院 106
Source: Stanford CS143 (2012)

北京航空航天大学计算机学院 107
Source: Stanford CS143 (2012)

北京航空航天大学计算机学院 108
Source: Stanford CS143 (2012)

北京航空航天大学计算机学院 109
Source: Stanford CS143 (2012)

北京航空航天大学计算机学院 110
关于LL(1)和LL(k)的其他故事

北京航空航天大学计算机学院 111
LL(1)文法CFG会有二义性吗?

北京航空航天大学计算机学院 112
LL(1)文法会有二义性吗?

北京航空航天大学计算机学院 113
让我们回到文法的世界来看二义性

北京航空航天大学计算机学院 114
让我们回到文法的世界来看二义性

北京航空航天大学计算机学院 115
LL(k+1)与LL(k)的关系

北京航空航天大学计算机学院 116
LL(k+1)与LL(k)的关系

北京航空航天大学计算机学院 117
无二义的CFG都能按照规则得到LL(1)文法吗?

北京航空航天大学计算机学院 118
无二义的CFG都能按照规则得到LL(1)文法吗?

北京航空航天大学计算机学院 119
LL(k)的其他有趣发现

北京航空航天大学计算机学院 120
打包带走…

LL(1)文法作为一个文法类,和CFG的关系

LL(1)文法的判定条件

自顶向下的LL(1)自动分析器结构

LL(1)分析表构造

LL(1)分析过程,及与文法推导的关系

FIRST集、FOLLOW集的含义和计算技巧

北京航空航天大学计算机学院 121
作业
计算FIRST集、FOLLOW集的技巧
判断一个语言是否是LL(1)
构造LL(1)分析表
• P264.练习12-1:第1题
• P264.练习12-1:第2题
• P265.练习12-1:第6题(证明)
• 补充题(见下页)
北京航空航天大学计算机学院 122
补充题:有文法G[S]
S::= iCtSS'|a
S'::=eS|ε
C ::= b
(1) 证明该文法是二义性文法
(2) 求FIRST和FOLLOW
(3) 构造LL分析表,证明该文法是非LL(1)文法

北京航空航天大学计算机学院 123
谢谢!

北京航空航天大学计算机学院 124

You might also like