编译原理重点题型简答综合选择填空.docx
《编译原理重点题型简答综合选择填空.docx》由会员分享,可在线阅读,更多相关《编译原理重点题型简答综合选择填空.docx(16页珍藏版)》请在冰豆网上搜索。
编译原理重点题型简答综合选择填空
•乔姆斯基把文法分成4种类型:
0型也叫(短语文法);1型也叫(上下文有关文法);2型也叫(上下文无关文法);3型也叫(正则文法)。
•自上而下分析方法一般需要消除(左递归)和回溯。
•一般而言,编译器的分析部分包括(词法分析),(语法分析),(语义分析)二综合部分包括(中间代码生成),(代码优化),(代码生成)。
以上六个阶段都涉及到(符号表)管理和(出错)管理。
•任何NFA都存在一个与之等价的(DFA)。
•假设G是一个文法,S是文法开始符,若Sx,则称x是句型。
•文法G产生的句子的全体是该文法描述的语言。
•LL
(1)分析法中,第一个L的含义是从左到右分析,第二个L的含义是最左推导,“1”的含义是向前看一个符号。
•自下而上语法分析法的基本思想是:
从待输入的符号串开始,利用文法的产生式步步向上进行归约,直至文法的开始符。
•算符优先分析法定义的可归约串叫做最左素短语,
•LR分析中定义的可归约串称为句柄。
•LR
(1)分析法的名字中,“R”指的是最右推导逆过程。
•高级语言编译程序常用的语法分析方法中,递归下降分析法属于自上而下分析方法;SLR分析法属于自下而上分析方法。
•LR分析法中,语法分析栈中存放的状态是识别规范句型活前缀的DFA的状态。
•编译过程中,每当扫描器识别出一个新名字,就将它填进符号表。
•确定的有穷自动机是一个五元组,通常表示为(S,Σ,δ,s0,F)。
•已知文法G[S]:
S→eT|RT
•T→DR|ε
•R→dR|ε
•D→a|bd
•则FIRST(S)={a,b,d,e,ε},FOLLOW(R)={a,b,#}
•在编译过程中:
词法分析的常用方法有有穷自动机理论;语法分析常用的方法有自顶向下匹配和自底向上归约中间代码生成的常用方法有语法制导翻译方法;
•一个句型中的最左直接(简单)短语称为该句型的句柄。
短语:
假定αβδ是文法G的一个句型,S是文法的开始符,若有:
S=*>αAδ且A=+>β,则称β是句型αβδ相对于非终结符A的短语
直接短语:
在短语定义的基础上,若有A=>β,则称β是句型αβδ相对于规则A→β的直接短语
句柄:
一个句型的最左直接短语称为该句型的句柄
自上而下分析的主要分析方法:
预测分析法
自下而上语法分析:
(2)主要问题:
怎样判断栈顶符号串的可归约性,以及如何进行归约
不同的自下而上分析法主要区别自可归约串的不同定义
(3)主要分析方法:
算符优先分析法、LR(k)分析法
三种LR文法的判别方法:
1)LR(0)文法是所有的LR(0)项目集中没有移进-归约冲突或归约-归约冲突(或LR(0)分析表中不含多重定义)
2)SLR
(1)文法是LR(0)项目集中所有含冲突的项目集都能用SLR规则解决冲突(或SLR
(1)分析表中不含多重定义)
3)LR
(1)文法是所有的LR
(1)项目集中没有移进-归约冲突或归约-归约冲突(或LR
(1)分析表中不含多重定义)
LR(0)项目集中可能的各种项目:
归约项目、接受项目、移进项目、待约项目
1、语法分析通常采用语法制导翻译方法
2、语法制导翻译的基本思想是:
文法中的每个符号都有一些编译程序关心的信息,称为文法符号的属性;
为文法中的每个产生式给定一组计算相关属性的动作——语义动作
所谓语法制导翻译,是指在语法规则的制导下,通过计算语义规则,完成对输入符号串的翻译。
3、属性文法:
为每个文法符号引进一组属性,且让该文法中的重写规则附加以语义规则时,称该上下文无关文法为属性文法
4、文法符号的属性有继承属性和综合属性两种
属性之间存在依赖关系,因而属性的计算有一定的顺序要求
若要一遍扫描完成翻译工作,则必须对文法进行修改,使得在计算每个属性之前,它所依赖的属性已全部计算出来
5、语义分析通常生成中间代码形式,常见的中间代码有逆波兰、四元式、三元式、三地址代码、抽象语法树等
6、语法制导翻译法和翻译方案(或称翻译模式)是属性文法的两种不同形式
语法制导翻译法:
是在语法分析的过程中,依随分析的过程,在使用语法规则进行推导或归约的同时,根据每个产生式添加的语义动作进行翻译的方法。
即:
在语法规则的制导下,通过对语义规则的计算,完成对输入符号串的翻译
翻译方案/翻译模式:
将属性文法中的语义规则用括号对{}括住,插在规则右部的任何地方,指明语义规则的计算次序,陈述一些实现细节,得到一种语义动作与语法分析交错的表示方法,以表达语义动作在语法分析过程中的执行时刻
1、编译过程中需要使用源程序中各种名字的相关信息,这些信息通常用一张或几张符号表保存起来。
不同的名字需要保存在符号表中的信息各不相同
2、编译过程中,每当扫描器识别出一个名字后,就查看符号表,看该名字是否在其中。
若是一个新名字就将它填进符号表。
符号表的信息将在词法分析、语法分析-语义分析过程中陆续填入
3、符号表在整个编译期间的作用主要有两条:
辅助语义的正确性检查、辅助代码生成
4、符号表的组织
每一表项包含两个部分:
名字栏和信息栏,分别存放标识符的名字和相关属性
可按名字的不同种属使用不同的符号表,如:
常量表、变量表、过程名表等等
5、符号表的数据结构和查找方法
符号表的数据结构可以是线性表、树结构、散列表等
查找算法很多:
线性查找、折半法、杂凑技术等
6、过程嵌套结构的栈式符号表
采用栈符号表:
新名字总是从栈顶填入,每进一层过程,要为在该层过程中新说明的标识符建立一张子符号表;而退出过程时,则要删除(释放)相应的子符号表,使现行符号表与进入此过程前的内容保持一致
引入一个显示层次关系表(DISPLAY),称为过程的嵌套层次表。
DISPLAY也是一个栈,其栈顶值总是指向当前正在处理的最内层过程的子符号表在栈符号表中的起始位置
在符号表中的查找范围由当前的DISPLAY栈顶值和当前的符号表栈顶值TOP控制
1、编译程序必须组织与分配目标程序运行时的数据空间
2、运行阶段的存储组织与分配是指编译程序在编译阶段为源程序中出现的用户定义的变量与常量、临时工作单元、过程或函数调用时需要的连接单元与返回地址等分配其在运行阶段的存储空间
3、运行阶段的存储组织与分配有两种方式:
静态存储分配动态存储分配
4、几个相关概念
数据区:
指一片连续的存储单元。
在编译时,任何变量运行时的存储单元都可以由(数据区编号,位移)表示
过程的活动与活动记录:
一个过程的活动:
指该过程的一次执行
过程的活动记录:
使用一个连续的存储块记录某活动的相关信息,一般包括:
连接数据、返回地址、动态链、静态链、形式单元、局部数据
5、非局部名字访问的实现:
静态链和活动记录:
在数据区中引入静态链指针,指向该过程直接外层过程的最新活动记录的起始地址
嵌套层次显示表和活动记录:
引进嵌套层次显示表(display)
假定现进入的过程的层数为i,在它的display表含有i+1个单元。
此表本身是一个栈,自上而下依次存放现行层、直接外层„直至最外层(0层、主程序层)等每一层过程的最新活动记录的基地址
过程的层数可以静态确定,因而每个过程的display表的体积在编译时即可确定,将display表作为活动记录的一部分
每当调用发生时,只需将调用者的display地址作为连接数据之一传送给被调用者,被调用者就可以建立起自己的display表——从调用者的display表中取i个(i为被调用者的静态层次数)单元,再加上被调用者的活动记录首地址即可
6.文法G[S]:
S→aAa|aBb|bAb|bBa
A→d
B→d
判断该文法是LR(0)、SLR
(1)文法吗?
如是构造其分析表,并分析符号串adb是否是文法的句子
拓广文法:
(0)S′→S
(1)S→aAa
(2)S→aBb
(3)S→bAb
(4)S→bBa
(5)A→d
(6)B→d
构造LR(0)项目集:
I0=CLOSURE({S′→·S})={S′→·S,S→·aAa,S→·aBb,S→·bAb,S→·bBa}
I1=GO(I0,S)=CLOSURE({S′→S·})={S′→S·}
I2=GO(I0,a)=CLOSURE({S→a·Aa,S→a·Bb})
={S→a·Aa,S→a·Bb,A→·d,B→·d}
I3=GO(I2,d)={A→d·,B→d·}
I3中含有多个归约项目,故该文法不是LR(0)文法
又:
FOLLOW(A)=FOLLOW(B)={a,b}
因此该文法也不是SLR
(1)文法
练习:
写出下列程序段产生的中间代码
A:
=1;B:
=6;YES:
=1;
WHILE(A
BEGIN
I:
=1;
WHILE(I<=100)DO
BEGIND[I,100]:
=I;
IF(C>D)THENBEGINH:
=H+D[I,J];J:
=J+1;END
ELSEYES:
=0;
I:
=I+1;
END;
END;
•下面的文法是否是左递归的?
如果是,该如何消除?
E→E+T|T
T→T*F|F
F→(E)|id
答:
存在。
E->TE’
E’->FT’
T->FT’
T’->*FT’|ε
F->(E)|id
1、文法G[S]:
S→S*S|S+S|(S)|a,该文法是否有二义性?
为什么?
是该文法存在句子a=a*a;该句子存在两颗不同的语法数。
•构造下面文法的LL
(1)分析表
S→aBc|bAB
A→aAb|b
B→b|ε
构造其LL
(1)分析表,并分析符号串baabbb是否是该文法的句子
答:
FIRST(S)={a,b}
FIRST(A)={a,b}
FIRST(B)={b,ε}
FOLLOW(S)={#}
FOLLOW(A)={b,#}
FOLLOW(B)={c,#}
LL
(1)分析表:
分析符号串baabbb的过程:
•设有文法G[S]:
S→CC
(1)
C→cC
(2)
C→d(3)
求:
1)拓广文法
2)文法的LR
(1)项目集规范族(识别活前缀的DFA)
3)构造规范LR分析表
4)给出句子cdd的LR
(1)分析过程
1)拓广文法
S’→S(0)S→CC
(1)C→cC
(2)C→d(3)
2)LR
(1)项目集规范族
I0={[S’→•S,#],[S→•CC,#],[C→•cC,c/d],[C→•d,c/d]}
I1=GO(I0,S)={[S’→S•,#]}
I2=GO(I0,C)={[S→C•C,#],[C→•cC,#],[C→•d,#]}
I3=GO(I0,c)=GO(I3,c)={[C→c•C,c/d],[C→•cC,c/d],[C→•d,c/d]}
I4=GO(I0,d)=GO(I3,d)={[C→d•,c/d]}
I5=GO(I2,C)={[S→CC•,#]}
I6=GO(I2,c)=GO(I6,c)={[C→c•C,#],[C→•cC,#],[C→•d,#]}
I7=GO(I2,d)=GO(I6,d)={[C→d•,#]}
I8=GO(I3,C)={[C→cC•,c/d]}
I9=GO(I6,C)={[C→cC•,#]}
14、给出下述文法对应的正规式:
S→0A|1B
A→1S|1
B→0S|0
分析与解析:
将A,B产生式的右部代入S中
01S|01|10S|10=(01|10)S|(01|10)
所以,(01|10)*(01|10)
15、已知文法G[A]:
A→B|AaB|AbB
B→C|BcC|BdC
C→fAg|e
给出符号串eceae的最右推导、语法树
16、设有文法G[S]=({S,A,B},{a,b},P,S),其中P为:
S→AB
A→Aa|bB
B→a|Sb
求句型baSb的全部短语、直接(简单)短语和句柄。
短语有:
ba,Sb,a,baSb直接短语:
a,Sb句柄:
a
17、设有文法G[E]:
E→EE+
E→EE*
E→a
(1)构造该文法的LR(0)项目集规范族
(2)该文法的LR
(1)文法吗,请说明理由?
若是请构造它的LR
(1)分析表
解答:
首先拓广文法如下:
S→E
E→EE+
E→EE*E→a
(1)构造该文法的LR(0)项目集规范族:
I0=CLOSOURE({S→·E})={S→·E,E→·EE+,
E→·EE*,E→·a}
I1=GO(I0,E)={S→E·,E→E·E+,E→E·E*,E→·EE+,
E→·EE*,E→·a}
I2=GO(I0,a)=GO(I1,a)={E→a·}
I3=GO(I1,E)=GO(I3,E)={E→EE·+,E→EE·*,E→E·E+,E→E·E*,E→·EE+,E→·EE*,E→·a}
I4=GO(I3,+)={E→EE+·}
I5=GO(I3,*)={E→EE*·}
(2)该文法是LR
(1)文法,因为:
在LR(0)项目集规范族的每个项目子集中,都不存在移进-归约冲突和归约-归约冲突,所以该文法是LR(0)文法,自然也是SLR
(1)文法和LR
(1)文法,现构造LR
(1)项目集族如下:
I0=CLOSURE({[S→·E,#]})={[S→·E,#],[E→·EE+,#/a],
[E→·EE*,#/a],[E→·a,#/a]}
I1=GO(I0,E)={[S→E·,#],[E→E·E+,#/a],[E→E·E*,#/a],
[E→·EE+,+/*/a],[E→·EE*,+/*/a],[E→·a,+/*/a]}
I2=GO(I0,a)={[E→a·,#/a]}
I3=GO(I1,E)={[E→EE·+,#/a],[E→EE·*,#/a],
[E→E·E+,+/*/a],[E→E·E*,+/*/a],E→·EE+,+/*/a],
[E→·EE*,+/*/a],[E→·a,+/*/a]}
I4=GO(I1,a)=GO(I3,a)=GO(I7,a)={[E→a·,+/*/a]}
I5=GO(I3,+)={[E→EE+·,#/a]}
I6=GO(I3,*)={[E→EE*·,#/a]}
I7=GO(I3,E)=GO(I7,E)={[E→EE·+,+/*/a],[E→EE·*,+/*/a],
[E→E·E+,+/*/a],[E→E·E*,+/*/a],[E→·EE+,+/*/a],
[E→·EE*,+/*/a],[E→·a,+/*/a]}
I8=GO(I7,+)={[E→EE+·,+/*/a]}
I9=GO(I7,*)={[E→EE*·,+/*/a]}
18、假设有以下算符优先文法:
G[A]:
A→A;D|DD→D(E)|FF→a|(A)E→E+A|A
(1)给出该文法的算符优先关系表。
(2)写出句子(a+a)的算符优先分析过程。