编译原理复习资料档Word格式文档下载.docx
《编译原理复习资料档Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理复习资料档Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
c.中间代码:
是一种含义明确,便于处理的记号系统,它通常独立于具体的硬件。
d.遍:
就是对源程序或源程序的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。
e.上下文无关文法(CFG):
它所定义的语法范畴(或语法单位)完全独立于这种范畴可能出现的环境之外,不宜描述自然语言。
自然语言中,句子和词等往往与上下文紧密相关
f.LL(K)分析法:
第一个L表示从左到右扫描输入串,第二个L表示最左推导,K表示分析时每一步需要向前查看K个符号。
g.LR分析法:
L表示从左到右扫描输入串,R表示构造一个最右推导的逆过程。
h.算符优先法:
就是定义算符之间的某种优先关系,借助于这种关系寻找“可归约串”和进行归约。
i.属性文法:
是在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备若干相关的“值“(称为属性),对于文法的每个产生式都配备了一组属性的计算规则(称为语义规则)。
3》.有哪些存储分配策略,并叙述何时用何种存储分配策略?
答:
有静态与动态存储分配策略。
动态的存储分配策略包括栈式动态分配策略与堆式动态分配策略。
静态分配策略在编译时对所有数据对象分配固定的存储单元,且在运行时始终保持不变。
栈式动态分配策略在运行时把存储器作为一个栈进行管理,运行时,每当调用一个过程,它所需要的存储空间就动态地分配于栈顶,一旦退出,她所占空间就予以释放。
堆式动态分配策略在运行时把存储器组织成堆结构,以便用户关于存储空间的申请与归还(回收),凡申请者从堆中分给一块,凡释放者退回给堆。
4》.编译过程中可进行的优化如何分类?
最常用的代码优化技术有哪些?
根据优化涉及范围与程序范围可以分为:
局部优化,循环优化和全局优化。
最常用的代码优化技术有:
删除公共子表达式,复写传播,删除无用代码,代码外提,强度削弱和删除归纳变量。
5》.一个编译程序的代码生成要着重考虑哪些问题?
代码生成器的设计要着重考虑目标代码的质量问题,而衡量目标代码的质量主要从占用空间和执行效率两个方面综合考虑。
【代码生成要着重考虑两个问题:
1).如何使生成的目标代码较短2.)如何充分利用计算机的寄存器。
(减少目标代码中访问存储单元的次数。
)这两个问题都直接影响目标代码的执行速度】
6》.语言和文法的转换的例题
(1).文法G2:
S→bA,A→aA∣a
解:
推导过程SbAba
SbAbaAbaa
…
SbAbaA…ba…a
归纳得出:
L(G2)={ba^n︱n≥1}
(2).文法G3:
S→AB,A→aA∣a,B→bB∣b
推导过程SABab
SABaABaAbaaba^2b
SABabBabbab^2
归纳得出L(G3)={a^mb^n︱m,n≥1}
(3).若已知文法G6(A):
Ac|Ab请给出G6(A)的语言?
解答:
:
L(G6)={c,cb,cbb,}以c开头,后继若干个b
(4).若已知文法G8(S):
S→aSBES→aBE
EB→BEaB→abbB→bbbE→beeE→ee
请给出G8(S)的语言?
S→aSBES→aaBEBE(S→aBE)
S→aaBBEE(EB→BE)
S→aabBEE(aB→ab)
S→aabbEE(bB→bb)
S→aabbeE(bE→be)
S→aabbee(eE→ee)
L(G8)={a^nb^ne^n|n≥1},上下文有关文法
(5)给出生成下述语言的上下文无关文法:
(1){a^nb^na^mb^m|n,m>
=0}
(2){1^n0^m1^m0^n|n,m>
▪G1(S)
Ø
S→AA
A→aAb|ε
▪G2(S)
S→1S0|A
A→0A1|ε
7》.有限自动机
(1)DFA举例DFAM=({0,1,2,3},{a,b},f,0,{3})
f定义如下:
f(0,a)=1f(0,b)=2f(1,a)=3f(1,b)=2f(2,a)=1f(2,b)=3f(3,a)=3f(3,b)=3
(2).证明t=baab被下图的DFA所接受
对于*中的任何字,若存在一条从初态到某一终态的通路,且这条通路上所有弧的标记符连接成的字等于,则称为DFAM所识别(或接受)
证法一:
∵a,b∈∑∴baab∈∑*
f(S,baab)=f(f(S,b),aab)=f(V,aab)=f(f(V,a),ab)=f(U,ab)=f(f(U,a),b)=f(Q,b)=Q。
Q属于终态,故得证
证法二:
根据上述状态转换图,可以构造确定有限自动机DFAM=〈{S,U,V,Q},{a,b},FM,S,{Q}〉
其中,FM是DFAM的状态转换函数,定义如下:
FM(S,a)=UFM(S,b)=V
FM(U,a)=QFM(U,b)=V
FM(V,a)=UFM(V,b)=Q
FM(Q,a)=QFM(Q,b)=Q
由题意可知:
对于t=baab,DFAM存在一条经过S、V、U、Q和Q的通路,使得该通路上所有弧的标记符连接成的字等于t
因此,t被DFAM所接受
(2):
下图是一个NFA的状态转换图,请将其转化为一个DFA。
●
采用NFA确定化算法(或子集法)。
状态集合I的ε-闭包表示为ε-closure(I)。
状态集I中任何状态S经任意条ε弧而能到达的状态集S∈ε-closure(I)。
状态集合I的a弧转换表示为move(I,a),定义为状态集合J,其中:
J是所有那些可从I中的某一状态经过一条a弧而到达的状态的全体。
¡
Ia=move(I,a)=ε-closure(J)。
因此得出上表。
根据上述NFA的状态转换图及其确定化过程,可以构造与它等价的DFAM。
DFAM=〈{S,A,B,C,D,E,F},{a,b},FM,S,{C,D,E,F}〉
这个DFAM的状态转换图见下图所示。
●其中S={i,1,2}A={1,2,3}B={1,2,4}
C={1,2,3,5,6,f}D={1,2,4,5,6,f}E={1,2,4,6,f}F={1,2,3,6,f}
FM是DFAM的状态转换函数,定义如下:
FM(S,a)=AFM(S,b)=BFM(A,a)=CFM(A,b)=B
FM(B,a)=AFM(B,b)=DFM(C,a)=CFM(C,b)=E
FM(D,a)=FFM(D,b)=DFM(E,a)=FFM(E,b)=D
FM(F,a)=CFM(F,b)=E
8》.语法分析
1.文法G[V]:
V→N|N[E]E→V|V+EN→i
是否为LL
(1)文法?
若不是,如何改造成LL
(1)文法?
LL
(1)文法的基本条件是不含左递归和回溯(公共左因子),而G[V]中含有回溯,所以先消除回溯得到文法G’[V]:
G’[V]:
V→NV’V’→ε|[E]V’
E→VE’E’→ε|+EE’N→i
由LL
(1)文法的充要条件可证G’[V]是LL
(1)文法
2.文法G[s]:
S→BAA→BS|dB→aA|bS|c
证明文法G是LL
(1)文法,构造LL
(1)分析表,写出句子adccd的分析过程
一个LL
(1)文法的充要条件是对每一个非终结符A的任何两个不同产生式A→α|β,有下面的条件成立:
FIRST(α)∩FIRST(β)=Φ,若β*ε,则有FIRST(α)∩FOLLOW(A)=Φ对于文法G[s]:
FIRST集FIRST(B)={a,b,c};
FIRST(A)={a,b,c,d};
FIRST(S)={a,b,c}。
FOLLOW集FOLLOW(S)={#}
对S→BA有FIRST(A)\{ε}加入FOLLOW(B),即FOLLOW(B)={a,b,c,d}
对A→BS有FIRST(S)\{ε}加入FOLLOW(B),即FOLLOW(B)={a,b,c,d}
对B→aA有FOLLOW(B)加入FOLLOW(A),即FOLLOW(A)={a,b,c,d}
对B→bS有FOLLOW(B)加入FOLLOW(S),即FOLLOW(S)={#,a,b,c,d}
由A→BS|d得FIRST(BS)∩FIRST(d)={a,b,c}∩{d}=Φ
由B→aA|bS|c得FIRST(aA)∩FIRST(bS)∩FIRST(c)={a}∩{b}∩{c}=Φ
由于文法G[s]不存在形如β→ε的产生式,故无需求解形如FIRST(α)∩FOLLOW(A)的值也即,文法G[S]是一个LL
(1)文法由G[s]:
S→BAA→BS|dB→aA|bS|c的
FIRST(B)={a,b,c};
FOLLOW(B)={a,b,c,d};
FIRST(A)={a,b,c,d};
FOLLOW(A)={a,b,c,d};
FOLLOW(S)={#,a,b,c,d}
可构造LL
(1)预测分析表如下:
a
b
c
d
#
S
S->
BA
A
A->
BS
B
B->
aA
bS
在分析表的控制下,句子adccd的分析过程如下:
3.对于文法G(E):
E→TE E→+TE| T→FT T→*FT|F→(E)|i
构造每个非终结符的FIRST和FOLLOW集合FIRST(E)={(,i}FOLLOW(E)={),#}
FIRST(E)={+,}FOLLOW(E)={),#}FIRST(T)={(,i}FOLLOW(T)={+,),#}
FIRST(T)={*,}FOLLOW(T)={+,),#}FIRST(F)={(,i}FOLLOW(F)={*,+,),#}
4.已知文法G[S]:
S→eT|RTT→DR|R→dR|D→a|bd
构造该文法的LL
(1)分析表。
FIRST(S),FIRST(T),FIRST(R),FIRST(D)
FOLLOW(S),FOLLOW(T),FOLLOW(R),FOLLOW(D)
LL
(1)分析表
FIRST(S)={a,b,d,e,}FOLLOW(S)={#}
FIRST(T)={a,b,}FOLLOW(T)={#}FIRST(R)={d,}
FOLLOW(R)={a,b,#}FIRST(D)={a,b}FOLLOW(D)={d,#}
⏹该文法的LL
(1)分析表如下:
e
S→RT
S→eT
T
T→DR
R
D
D→a
D→bd
5.例:
文法G[E]:
E→E+T|TT→T*F|FF→(E)|id
考虑文法G[E]上的句子id1+id2*id3。
给出其最右推导和分析树,并根据分析树指出句子中的短语、直接短语和句柄
从E1推导可得到id1+id2*id3
id1+id2*id3是句型id1+id2*id3相对于E1的短语
id1+id2不是句型id1+id2*id3中相对于任何非终结符的短语
因为找不到任何一个非终结符,它的子树中的所有叶子构成id1+id2
短语以非终结符为根的子树中所有从左到右排列的叶子
⏹
⏹E1E2+id2*id3T2+id2*id3F1+id2*id3id1+id2*id3
id1是相对于非终结符E2、T2和F1的短语
相对于F1的直接短语,也是句柄
6.例4.2文法:
E→E+T|TT→T*F|FF→(E)|i
经消去直接左递归后变成:
E→TEE→+TE|
T→FTT→*FT|F→(E)|i
7.例:
对于文法G(E)
E→TEE→+TE|
T→FTT→*FT|
F→(E)|i
构造每个非终结符的FIRST和FOLLOW集:
FIRST(E)={(,i}FOLLOW(E)={),#}
FIRST(E)={+,}FOLLOW(E)={),#}
FIRST(T)={(,i}FOLLOW(T)={+,),#}
FIRST(T)={*,}FOLLOW(T)={+,),#}
FIRST(F)={(,i}FOLLOW(F)={*,+,),#}
T→FT;
T→*FT|;
FOLLOW(T)∈FOLLOW(F)
8.例:
E→TEE→+TE|T→FTT→*FT|F→(E)|i
构造每个非终结符的FIRST和FOLLOW集合:
FIRST(E)={(,i}FOLLOW(E)={),#}FIRST(E)={+,}FOLLOW(E)={),#}
FIRST(T)={(,i}FOLLOW(T)={+,),#}FIRST(T)={*,}FOLLOW(T)={+,),#}
FIRST(F)={(,i}FOLLOW(F)={*,+,),#}
9.文法G[V]:
V→N|N[E]E→V|V+EN→i
由LL
(1)文法的充要条件可证:
G’[V]是LL
(1)文法
11.已知文法G[S]:
S→eT|RTT→DR|R→dR|D→a|bd
FOLLOW(S),FOLLOW(T),FOLLOW(R),FOLLOW(D)LL
(1)分析表
FIRST(S)={a,b,d,e,}FOLLOW(S)={#}FIRST(T)={a,b,}FOLLOW(T)={#}FIRST(R)={d,}FOLLOW(R)={a,b,#}
FIRST(D)={a,b}FOLLOW(D)={d,#}
9》。
中间语言形式
常用的中间语言:
a.后缀式表示法b.图表示法:
DAG抽象语法树
三地址代码:
三元式四元式间接三元式
1.abc+*等价a*(b+C)
表达式x+y≤z∨a>0∧(8+z)>3的逆波兰表示为xy+z≤a0>8z+3>∧∨
表达式﹁A∨﹁(C∨﹁D)的逆波兰表示为A﹁CD﹁∨﹁∨
表达式a∧b∨c∧(b∨x=0∧c)的逆波兰表示为ab∧cbx0=c∧∨∧∨
表达式(A∨B)∧(C∨﹁D∧E)的逆波兰表示为AB∨CD﹁E∧∨∧
一个带有四个域的记录结构,这四个域分别称为op,arg1,arg2及result
例:
a:
=b*-c+b*-c的四元式
oparg1arg2result
(0)uminuscT1
(1)*bT1T2
(2)uminuscT3
(3)*bT3T4
(4)+T2T4T5
(5):
=T5a
2.例:
=b*-c+b*-c的三元式
三个域:
op、arg1和arg2
oparg1arg2
(0)uminusc
(1)*b(0)
(2)uminusc
(3)*b
(2)
(4)+
(1)(3)
(5)assigna(4)
3.例如,语句X:
=(A+B)*C;
Y:
=D↑(A+B)的间接三元式表示如右图
4.表达式-a+b*c+d+(e*f)/d*e,如果优先级由高到低依次为-、+、*、/,且均为左结合,则其后缀式为a-b+cd+ef*+*de*/
5.如果优先级由高到低依次为-、+、*、$(乘幂),且均为右结合,则表达式2+3-2+2*2*1$2$3-3-2+1的后缀式为232-2++21**2332--1+$$
6.如果某表达式的后缀式为ab+cd+*,则其中缀形式的表达式为(a+b)*(c+d)
7.请将表达式-(a+b)*(c+d)-(a+b)分别表示成三元式、间接三元式和四元式序列
三元式间接三元式
(1)(+a,b)间接三元式序列 间接码表
(2)(+c,d)
(1)(+a,b)
(1)
(3)(*
(1),
(2))
(2)(+c,d)
(2)
(4)(-(3),/)(3)(*
(1),
(2)) (3)
(5)(+a,b)(4)(-(3),/) (4)
(6)(-(4),(5))(5)(-(4),
(1))
(1)
(5)
四元式
(1)(+,a,b,t1)
(2)(+,c,d,t2)
(3)(*,t1,t2,t3) (4)(-,t3,/,t4)
(5)(+,a,b,t5) (6)(-,t4,t5,t6)
必考题:
构造一个DFA,它接收Σ={a,b}上所有满足下述条件的字符串:
字符串中的每个a都有至少有一个b直接跟在其右边。
由题意可得其正规式为(b*abb*)*,画出相应的DFM.
仅供参考,如有什么不对的地方尽请谅解