1》编译程序的框架图与功能块:(1)画出编译程序的总体结构,并简述各部分的主要功能:七个部分(2)编译程序的结构分为几个阶段,各阶段的任务是什么?答编译程序总框架(1)词法分析器,又称扫描器,输入源程序,进行词法分析,输出单词符号。
(2)语法分析器,简称分析器,对单词符号串进行语法分析(根据语法规则进行推导或规约),识别出各类语法单位,最终判断输入串是否构成语法上正确的“程序”。
(3)语义分析与中间代码产生器,按照语义规则对语法分析器归约出(或推导出)的语法单位进行语义分析并把它们翻译成一定形式的中间代码。
(4)优化器,对中间代码进行优化处理。
(5)目标代码生成器,把中间代码翻译成目标程序。
(6)表格管理,登记源程序的各类信息,编译各阶段的进展状况。
(7)出错管理,把错误信息报告给用户。
编译程序的结构分为五个阶段:(1)词法分析.任务是:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词(亦称单词符号或简称符号),如基本字,标识符,常熟,算符和界符。
(2)。
语法分析,任务是:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位(语法范畴)。
(3)语义分析与中间代码产生。
任务:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。
(4)优化。
任务在于对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效(省时间和空间)的目标代码。
(5)目标代码生成。
任务是:把中间代码(或优化出理之后)变换成特定机械上的低级语言代码。
2》.重要概念:a. 编译程序:是指能够把源语言程序转换成逻辑上等价的目标语言程序的一个程序。
b. 单词符号:是语言的基本组成成分,是人们理解和编写程序的基本要素,是语言中具有独立意义的最基本结构,它一般包括:基本字、标识符、常数、运算符和界符等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解:推导过程S⇒bA⇒baS⇒bA⇒baA⇒baa…S⇒bA⇒baA⇒…⇒ba…a归纳得出:L(G2)={ba^n︱n≥1}(2).文法G3:S→AB,A→aA∣a,B→bB∣b解:推导过程S⇒AB⇒abS⇒AB⇒aAB⇒aAb⇒aab⇒a^2bS⇒AB⇒abB⇒abb⇒ab^2…归纳得出L(G3)={a^mb^n︱m,n≥1}(3).若已知文法G6(A): A → c|Ab 请给出G6(A)的语言?解答::L(G6)={c,cb,cbb,⋯} 以c开头,后继若干个b(4).若已知文法G8(S):S→aSBE S→aBEEB→BE aB→ab bB→bb bE→be eE→ee请给出G8(S)的语言?解答: S→a S BES→aaB EB E (S→aBE)S→a aB BEE (EB→BE)S→aa bB EE (aB→ab)S→aab bE E (bB→bb)S→aabb eE(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>=0}▪G1(S)➢S→AA➢A→aAb|ε▪G2(S)➢S→1S0|A➢A→0A1|ε7》.有限自动机(1)DFA举例DFA M = ({0,1,2,3},{a,b},f,0,{3})f定义如下:f(0,a)=1 f(0,b)=2 f(1,a)=3 f(1,b)=2 f(2,a)=1 f(2,b)=3 f(3,a)=3 f(3,b)=3(2).证明t=baab被下图的DFA所接受对于∑*中的任何字α,若存在一条从初态到某一终态的通路,且这条通路上所有弧的标bSUVQabba,ba a记符连接成的字等于α,则称α为DFA M所识别(或接受)证法一:∵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属于终态,故得证证法二:根据上述状态转换图,可以构造确定有限自动机DFA M=〈{S,U,V,Q},{a,b},FM,S,{Q}〉其中,FM 是DFA M的状态转换函数,定义如下:FM (S,a)=U FM (S,b)=VFM (U,a)=Q FM (U,b)=VFM (V,a)=U FM (V,b)=QFM (Q,a)=Q FM (Q,b)=Q∵a,b∈∑∴baab∈∑*由题意可知:对于t=baab,DFA M存在一条经过S、V、U、Q和Q的通路,使得该通路上所有弧的标记符连接成的字等于t因此,t 被DFA M所接受(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的状态转换图及其确定化过程,可以构造与它等价的DFA M。
DFA M =〈{S,A,B,C,D,E,F},{a,b},FM ,S ,{C,D,E,F}〉 这个DFA M 的状态转换图见下图所示。
其中 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 是DFA M 的状态转换函数,定义如下: FM (S,a )=A FM (S,b )=B FM (A,a )=C FM (A,b )=B FM (B,a )=A FM (B,b )=D FM (C,a )=C FM (C,b )=E FM (D,a )=F FM (D,b )=D FM (E,a )=F FM (E,b )=D FM (F,a )=C FM (F,b )=E 8》.语法分析1.文法G[V]: V →N | N[E] E →V | V+E N →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 →BA A →BS|d B →aA|bS|c证明文法G 是LL(1)文法 ,构造LL(1)分析表,写出句子adccd 的分析过程解:一个LL(1)文法的充要条件是对每一个非终结符A 的任何两个不同产生式A →α|β,有下面的条件成立:FIRST(α)∩FIRST(β)=Φ, 若β* ε, 则有FIRST(α)∩FOLLOW(A)=Φ对于文法G[s]: S →BA A →BS|d B →aA|bS|cFIRST 集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 →BA A →BS|d B →aA|bS|c 的 FIRST(B)={a, b, c}; FOLLOW(B)={a, b, c, d };bFIRST(A)={a, b, c, d}; FOLLOW(A)={a, b, c, d };FIRST(S)={a, b, c}。