编译原理复习
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
M[T′,#]= T′→ ε
⑤对产生式F→(E) | i
First( (E) )={ ( }
置 M[F , ( ] = F→(E)
First( i )={ i }
置 M[F , i ] = F→i
2020/4/16
编译原理复习
21
总控程序框图
J:=1; k:=1; s[k]:= #; k:=k+1;
2020/4/16
编译原理复习
1
编译原理复习 一、引论
1、编译原理”的目的和任务
编译原理是计算机专业的一门重要的 专业课程。介绍编译程序的基本构造、 一般设计方法和常用实现技术。通过本 课程的学习,要求学生掌握高级语言编 译程序的初步设计和实现的基本技能, 并能为不同模式和不同领域的语言的实 现方案寻找解决途径。
AB+CD+*
(a==0&&b>3)||(e&&x!=y)
a0==b3>&&exy!=&&||
a>c∧b==d
ac>bd==∧
2020/4/16
编译原理复习
45
例1:算术表达式求值的属性文法。
规则式
语义规则
1.L→E
print(E.val)
2.E→E1+T 3.E→T
E.val:=E1.val+T.val E.val:=T.val
2、中间代码:逆波兰式、四元式 作用: ①有利于目标代码优化
②有利于目标代码移植
③使各阶段的开发复杂性降低, 有利于编译程序的开发。
2020/4/16
编译原理复习
44
逆波兰式(后缀式):每一运算符都置于其 运算对象之后。(无括号表)
中缀表示
后缀表示
A*B
AB*
A+B*C
ABC*+
(A+B)*(C+D)
M[E , i ]= E→TE′
2020/4/16
编译原理复习
20
②对产生式 E′→+TE′| ε
First(+TE′ )={+}
置 M[E′ , + ]= E′→+TE′
Follow(E′)={ ) , #} 置 M[E′ , ) ]=E′→ ε
M[E′ , # ]=E′→ ε
③对产生式 T→FT′
11
2020/4/16
编译原理复习
12
四、语法分析
2020/4/16
编译原理复习
13
1、上下文无关文法所描述的语言,可以用四种分析 程序来识别:
递归下降分析程序、预测分析器
算符优先分析程序、LR分析法 2、LL(1)文法的定义: ①.文法不含左递归 ②.对文法中每一个非终结符A,如有规则:
4.T→T1*F 5.T→F
T.val:=T1.val*F.val T.val:=F.val
6.F→(E)
F.val:=E.val
7.F→digit
F.val:=digit.lexval
与规则式
关联的每一 个语义规则 的左部符号E, T, F等的属性 值的计算由 右部非终结 符决定,这 种属性称为 综合属性。
例6:已知文法G1:
若一个文法的某个句子对应两棵 不同的语法树,或者有两个不同 的最左(或最右)推导,则称这 个文法是二义的。注意:每个句 子有规范推导,而句型不一定有。
2020/4/16
编译原理复习
9
三、词法分析
1、正规文法与正规式的定义:
2、NFA、DFA的定义:
M=(S , ∑ , f , s0 , Z) NFA:f为多值映射函数,s0是初态集 DFA:f为单值映射函数,s0是唯一初态 3、
2020/4/16
编译原理复习
17
3、递归下降分析程序的构造方法:
①为每一个非终结符,构造相应的递归过程,过程的
名字表示规则左部的非终结符;过程体按规则右部 符号串的顺序编写。
②对于产生式:U→x1 | x2 | …xn 则编写 if ch in FIRST(x1) then p(x1) else if ch in FIRST(x2) then p(x2) …… else error ;
B→dB | ε 该文法是否是SLR(1)文法?证明之。 解:将文法拓广为G[S′]
(0)S′→A
(1)A→aABe (2) A→Ba
(3)B→dB
(4)B→ε
该文法的LR(0)项目有:
S′→. A S′→A .
A→. aABe
A→a .ABe
A→aABe.
A→aA .Be
A→ .Ba A→B .a A→Ba.
2020/4/16
编译原理复习
46
求:3*5+4
L
n E.val=19
E.val=15
+
T.val=4
T.val=15
F.val=4
T.val=3
* F.val=5
digit.lexval=4
F.val=3
digit.lexval=5
digit.lexval=3
编译原理复习
35
ACTION
GOTO
a
b
d
e
f
#
SRT
0
S3
1
1 acc
2
r2
S3
r2
r2
5
3
S6
S4
2
4
r4
r4
r4
r4
5
S10
9
6
S3
7
7
S8
8
r3
r3
r3
r3
9
r1
r1
r1
10 r6
S6
S4
r6
r6
11
11 S12
12 r5
r5
r5
2020/4/16
编译原理复习
36
例4.10 有文法G[A] : A→aABe | Ba
分裂法
子集法
分划法
正规式
NFA
DFA
最小化DFA
正规文法
2020/4/16
编译原理复习
词法分析程序
10
例: 构造自动机A,使得它识别字母表{0,1}上的符 号串,这些符号串由任意的1、0和随后任意的 11、00对组成。
解:正规表达式为 (1 | 0 )* (11 |00)*
2020/4/16
编译原理复习
S[k] ∈VT
n
J:=k-1;
S[j] >. a
n
y
Q=S[j] ; j:=j-1;
S[k]:=a; K:=k+1;
S[j] ∈VT
n J:=j-1;
nn
y
S[j]<. Q y
S[j+1] …S[k]是最左素短 语并归约为N,
k:=j+1;s[k]=N
例4.7
2020/4/16
编译原理复习
29
2020/4/16
编译原理复习
30
6、 LR分析器的构造方法---总控程序框图
2020/4/16
编译原理复习
31
例4.8:文法G[S]: S→(S) | a 拓广: (0)S′→S(1)S→(S) (2)S→a
2020/4/16
编译原理复习
32
2020/4/16
编译原理复习
33
例4.9:对下列文法:
(0)S′→S
③对于符号串x=y1 y2…yn ; p(x)的含义为:
begin p(y1) ; p(y2) ; … p(yn)
end
如果yi∈VT 则if ch=yi then read(ch) else error
④对于U→ε;则 if ch∈Follow(U) then return
else error ;
2020/4/16
编译原理复习
2
2、什么是编译程序
编译程序是一种翻译程序,它将高级语言所写 的程序翻译成等价的机器语言或汇编语言的目标程 序。
错误检查和处理程序
词
源程序
法
分
析
2020/4/16
语
语义
代
目
法
分析
和中
码
标 代
目标
分 析
间代 码产
优
生
化
码 生 成
程序
信息表管理程序
编译原理复习
3
二、编译基础
14
例4.1
例4.2
2020/4/16
编译原理复习
15
例4.3
2020/4/16
编译原理复习
16
例4.4 :将文法改写成LL(1)文法。
S→S*aP | aP | *aP
P→+aP | +a
解:消除文法左递归、提取公共左因子得到:
S→aPS′ | *aPS′ S′→ *aPS′ | ε
P→+aP ′
编译原理复习
25
2020/4/16
编译原理复习
26
5、算符优先分析程序的构造方法
方法:根据最左素短语定理,利用符号 栈来识别最左素短语(先找尾,后找 头),然后归约。
2020/4/16
编译原理复习
27
栈置初值:k:=1;s[k]:= #;
当前输入符号读入a ;
K=2 且a=#
y
结束
y
J:=k;
M[A , b]=A→ α 或 M[Aቤተ መጻሕፍቲ ባይዱ, #]=A→ α
③把M中未定义的元素置为error。
2020/4/16
编译原理复习
19
例4.5:已知文法G[E]: 试构造分析表。
E→TE′
E′→+TE′| ε
T→FT′
T′→*FT′ | ε
F→(E) | i
①对E→TE′产生式:
First(TE′)={( , i } 置 M[E , ( ]= E→TE′
B→ .dB B→d .B
B→dB.
B→ .
A→aAB .e
2020/4/16
编译原理复习
37
S′→A A→aAS无LBR法e(1用)解 A→Ba决冲突 B→dB
B→ε
Follow(B)={a,e}
2020/4/∴16 不是SLR(1)文法
编译原理复习
可以用 SLR(1) 解决冲
突
38
例4.11:设有文法G[E]: (1)S→A (2)S→B (3)A→aAb (4)A→c (5)B→aBb (6)B→d
P′→P | ε
计算每个非终结符的FIRST和FOLLOW集合:
FIRST(S)={a,*}
Follow(S)={#}
FIRST(S′)={*, ε} Follow(S′)={#}
FIRST(P)={+}
Follow(P)={*, #}
FIRST(P′)={+, ε} Follow(P′)={*,#} ∴以上文法是LL(1)文法。
(1)S→bRST
(2)S→bR
(3)R→dSa
(4)R→e
(5)T→fRa
①求各非终结符的First和Follow集合。
②构造该文法的SLR(1)分析表。
解:
First
Follow
S′ b
#
S
b
a,f,#
R
d,e
a,b,f,#
T
f
a,f,#
(6)T→f
2020/4/16
编译原理复习
34
2020/4/16
2020/4/16
编译原理复习
18
4、预测分析器的构造方法----分析表的构造
输入:文法G
输出:分析表M
方法:对文法中每一个产生式A→α,按照下
述规 则确定M中各个元素。
①对于FIRST(α)中的每一个终结符a置为
M[A , a]=A→ α
②若空串ε∈ FIRST(α),则对Follow(A)中的每 一个终结符b置为
Z =>s[k]
y S[k] ∈VT?
N
y
S[k] =T[j]?
N
S[k] =# ?
N
y
y
S[k]=T[j]?
N
error
error
查M[ S[k] , T[j] ]=X→y1y2…yn
stop
y
K:=k-1; J:=j+1;
2020/4/16
N
error
将y1y2…yn逆序推进栈中 若y1y2…yn=ε 则k=k-1
A→ α1 | α2 | …| αn 则下面条件成立 FIRST(αi ) ∩ FIRST(αj )=Ф (i≠j) ③.对文法中每一个非终结符A,若它的某个产生式 首符集包含ε 时 ,则:
FIRST(A) ∩ FOLLOW(A) =Ф 满足以上条件的文法称为LL(1)文法。
2020/4/16
编译原理复习
编译原理复习
22
分析过程
例如:已知文法G,请利用LL(1)分析表给 出输入串i1*i2+i3的分析过程。
G[E]: E→TE′ E′→+TE′| ε T→FT′ T′→*FT′ | ε
F→(E) | i
2020/4/16
编译原理复习
23
E
2020/4/16
编译原理复习
24
例4.6
2020/4/16
First(FT′)={ ( , i }
置
M[T , ( ]= T→FT′
M[T , i ]= T→FT′
④对产生式T′→*FT′ | ε
First(*FT′)={*}
置 M[T′,*]= T′→*FT′
Follow(T′)={ + , ) , # } 置 M[T′,+]= T′→ ε
M[T′,)]= T′→ ε
2020/4/16
编译原理复习
39
例4.12
2020/4/16
编译原理复习
40
2020/4/16
编译原理复习
41
2020/4/16
编译原理复习
42
2020/4/16
编译原理复习
43
五、语义分析和中间代码产生
1、语法制导翻译法的基本思想:对文法的
每一条产生式,设计语义子程序。在语 法分析的过程中,当使用一条产生式推 导或归约时,调用该语义子程序,完成 预定的翻译工作。
1、文法和语言 ①什么是文法:是规则的非空有穷集合,通常定义为
四元组:G[S]=(Vn,Vt,P,S) ②文法的分类:0型,1型,2型,3型
用正规文法描述程序设计语言的词法规则;用上 下文无关文法描述程序设计语言的语法规则。
③什么是语言:文法G全体句子所组成的集合。 L(G[S])={ w | S=>w 且 w∈Vt* }
④已知语言求文法;已知文法求语言。
2020/4/16
编译原理复习
4
例1: 例2:
2020/4/16
编译原理复习
5
例3
2020/4/16
编译原理复习
6
例4:
2020/4/16
编译原理复习
7
2、求句型的短语、直接短语、句柄和最左素短语。
例5:
2020/4/16
最左素短语为:i
编译原理复习
8
3、文法二义性判断: