计算first集合和follow集合
- 格式:docx
- 大小:91.06 KB
- 文档页数:10
编译原理复习题一、选择题1、编译原理是对(C)。
A、机器语言的执行B、汇编语言的翻译C、高级语言的翻译D、高级语言程序的解释执行2、(A)是一种典型的解释型语言。
A.BASIC B.C C.FORTRAN D.PASCAL3、把汇编语言程序翻译成机器可执行的目标程序的工作是由(B)完成的。
A. 编译器B. 汇编器C. 解释器D. 预处理器4、用高级语言编写的程序经编译后产生的程序叫(B)A.源程序 B.目标程序C.连接程序D.解释程序5、(C)不是编译程序的组成部分。
A.词法分析程序B.代码生成程序C.设备管理程序D.语法分析程序6、通常一个编译程序中,不仅包含词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成等六个部分,还应包括(C)。
A.模拟执行器B.解释器 C.表格处理和出错处理D.符号执行器7、编译程序绝大多数时间花在(D)上。
A.出错处理B.词法分析C.目标代码生成D.表格管理8、源程序是句子的集合,(B)可以较好地反映句子的结构。
A. 线性表B. 树C. 完全图D. 堆栈9、词法分析器的输出结果是(D)。
A、单词自身值B、单词在符号表中的位置C、单词的种别编码D、单词的种别编码和自身值10、词法分析器不能(D)A. 识别出数值常量B. 过滤源程序中的注释C. 扫描源程序并识别记号D. 发现括号不匹配11、文法:G:S→xSx | y所识别的语言是(D)。
A、xyxB、(xyx)*C、x*yx*D、x n yx n (n≥0)12、如果文法G是无二义的,则它的任何句子α(A)A.最左推导和最右推导对应的语法树必定相同B.最左推导和最右推导对应的语法树可能不同C.最左推导和最右推导必定相同D.可能存在两个不同的最左推导,但它们对应的语法树相同13、正则文法(A)二义性的。
A. 可以是B. 一定不是C. 一定是14、(B)这样一些语言,它们能被确定的有穷自动机识别,但不能用正则表达式表示。
编译原理答案编译原理复习回顾题一、填空题1. 汇编程序将翻译成;编译程序将翻译成。
2. 编译程序工作工程可以划分为、、、和等5个基本阶段,同时还会伴有和。
3. 对编译程序而言,输入数据是,输出数据是。
4. 已知文法G[E]: E—>T|E+T|E-F, T->F|T*F|T/F,,F—>(E)|I (“,”是间隔符号,不是文法中的符号)。
该文法的开始符号(识别字符)是,终结符号集合V T是,非终结符号结合V N是,句型T+T*F+i的短语有。
该文法消除直接左递归,改写后的文法为E-> ,T-> ,F -> .5. Chomsky定以来寺中形式语言的文法分别为:文法(又称文法)、文法(又称文法)、文法(又称文法)、文法(又称文法)。
6. 编译过程中扫描器所完成的任务是从中识别出一个个具有。
7. 确定的有穷自动机是一个,通常表示为。
8. LL(k)分析中,第一个L的含义是,第二个L的含义是,“k”的含义是。
9. LL(1)分析中,第一个L的含义是,第二个L的含义是,“1”的含义是。
10.LR(0)分析中,“L”的含义是,“R”的含义是,“0”的含义是。
11.SLR(1)分析中,“L”的含义是,“R”的含义是,“1”的含义是。
12.LR(1)分析中,“L”的含义是,“R”的含义是,“1”的含义是。
13.算术表达式:a*(-b+c)的逆波兰式表示为:。
14.算术表达式:a+b*(c+d/e)的逆波兰式表示为:。
15.在编译程序中安排中间代码生成的目的是和。
16.语法制导的翻译程序能同时进行分析和分析。
17.根据所涉及的程序范围,优化可分为、、三种。
二、简单题1. 有人认为编译程序的词法分析、语法分析、语义分析和中间代码生成、代码优化、目标代码生成五个组成部分是缺一不可的,这种看法正确吗?说明理由。
2. 多边扫描的程序是高质量的编译程序,优于单遍扫描的编译程序”,对吗?为什么?3. LR分析器与优先分析器在识别被归约串时的主要异同时什么?三、给出生成下述语言的上下文无关的文法{1n0m1m0n|n,m>=0}{WaW r|W属于{0|1}*,W r表示W的逆}四、给出生成下列语言的三型文法:{a n|n>=0}{a n b m|n,m>0}{a n b m c k|n,m,k>=0}五、构造正规式1(0|1)*101相应的最小DFA。
编译原理复习题及答案一、选择题1.一个正规语言只能对应(B)A一个正规文法B一个最小有限状态自动机2.文法G[A]:A→εA→aBB→AbB→a是(A)A正规文法B二型文法3.下面说法正确的是(A)A一个SLR(1)文法一定也是LALR(1)文法B一个LR(1)文法一定也是LALR(1)文法4.一个上下文无关文法消除了左递归,提取了左公共因子后是满足LL(1)文法的(A)A必要条件B充分必要条件5.下面说法正确的是(B)A一个正规式只能对应一个确定的有限状态自动机B一个正规语言可能对应多个正规文法6.算符优先分析与规范归约相比的优点是(A)A归约速度快B对文法限制少7.一个LR(1)文法合并同心集后若不是LALR(1)文法(B)A则可能存在移进/归约冲突B则可能存在归约/归约冲突C则可能存在移进/归约冲突和归约/归约冲突8.下面说法正确的是(A)ALe某是一个词法分析器的生成器BYacc是一个语法分析器9.下面说法正确的是(A)A一个正规文法也一定是二型文法B一个二型文法也一定能有一个等价的正规文法10.编译原理是对(C)。
A、机器语言的执行B、汇编语言的翻译C、高级语言的翻译D、高级语言程序的解释执行C.FORTRAND.PASCAL11.(A)是一种典型的解释型语言。
A.BASICB.C12.把汇编语言程序翻译成机器可执行的目标程序的工作是由(B)完成的。
A.编译器B.汇编器C.解释器D.预处理器13.用高级语言编写的程序经编译后产生的程序叫(B)A.源程序B.目标程序C.连接程序14.(C)不是编译程序的组成部分。
A.词法分析程序B.代码生成程序D.解释程序D.语法分析程序C.设备管理程序15.通常一个编译程序中,不仅包含词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成等六个部分,还应包括(C)。
A.模拟执行器B.解释器C.表格处理和出错处理D.符号执行器16.编译程序绝大多数时间花在(D)上。
一、选择1.将编译程序分成若干个“遍”是为了_使程序的结构更加清晰__。
2.正规式 MI 和 M2 等价是指__.M1 和 M2 所识别的语言集相等_。
3.中间代码生成时所依据的是 _语义规则_。
4.后缀式 ab+cd+/可用表达式__(a+b)/(c+d)_来表示。
6.一个编译程序中,不仅包含词法分析,_语法分析 ____,中间代码生成,代码优化,目标代码生成等五个部分。
7.词法分析器用于识别__单词___。
8.语法分析器则可以发现源程序中的___语法错误__。
9.下面关于解释程序的描述正确的是__解释程序的特点是处理程序时不产生目标代码 ___。
10.解释程序处理语言时 , 大多数采用的是__先将源程序转化为中间代码 , 再解释执行___方法。
11.编译过程中 , 语法分析器的任务就是__(2)(3)(4)___。
(1) 分析单词是怎样构成的 (2) 分析单词串是如何构成语句和说明的(3) 分析语句和说明是如何构成程序的 (4) 分析程序的结构12.编译程序是一种__解释程序__。
13.文法 G 所描述的语言是_由文法的开始符号推出的所有终极符串___的集合。
14.文法分为四种类型,即 0 型、1 型、2 型、3 型。
其中 3 型文法是___正则文法__。
15.一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组 _产生式__。
16.通常一个编译程序中,不仅包含词法分析,语法分析,中间代码生成,代码优化,目标代码生成等五个部分,还应包括_表格处理和出错处理__。
17.文法 G[N]= ( {b} , {N , B} , N , {N→b│ bB , B→bN} ),该文法所描述的语言是L(G[N])={b2i+1│ i ≥0}18.一个句型中的最左_简单短语___称为该句型的句柄。
19.设 G 是一个给定的文法,S 是文法的开始符号,如果 S->x( 其中 x∈V*), 则称 x 是文法 G 的一个__句型__。
编译原理与技术模拟试题一一、填空题(20分,每空2分)1.1编译程序的工作过程可划分为词法分析、语法分析、、中间代码生成、代码优化、等阶段,一般在阶段对表达式中运算对象的类型进行检查。
答案:语义分析、目标代码生成、语义分析解释:要求掌握编译器的工作原理和特点。
编译和解释方式是翻译高级程序设计语言的两种基本方式。
解释程序也称为解释器,它或者直接解释执行源程序,或者将源程序翻译成某种中间表示形式后再加以执行;而编译程序(编译器)则首先将源程序翻译成目标语言程序,然后在计算机上运行目标程序。
编译过程包含词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成,以及符号表管理和出错处理。
表达式的类型信息属于语义信息,所以在语义分析阶段进行类型检查。
1.2 和预测分析法是自上而下的语法分析方法。
答案:递归下降法解释:语法分析的任务是根据语言的语法规则,分析单词串是否构成短语和句子,即表达式、语句和程序等基本语言结构,同时检查和处理程序中的语法错误。
根据语法树(或分析树)的建立方式,语法分析可分为自上而下分析和自下而上分析两类,递归下降分析和预测分析属于自上而下的语法分析方法。
1.3常用的存储分配策略有存储分配和动态存储分配,其中,动态存储分配策略包括分配和分配。
答案:静态、栈、堆解释:编译器怎样对存储空间进行组织和采用什么样的存储分配策略,很大程度上取决于程序设计语言中所采用的机制。
编译器具体实现时,根据语言机制的特性,采用静态分配策略、栈分配策略和堆分配策略三种方式的其中若干种。
静态分配策略是指编译时安排所有数据对象的存储,即绑定是静态确定的;栈分配策略是指按栈的方式管理运行时的存储;堆分配策略是指在运行时根据要求从堆数据区动态地分配和释放存储。
1.4移进、归约是分析中的典型操作。
答案:自下而上或LR解释:自下而上分析的一般思路是从句子ω开始,从左到右扫描ω,反复用产生式的左部替换产生式的右部、谋求对ω的匹配,最终得到文法的开始符号,或者发现一个错误。
程序设计语言与编译复习题一、是非题(请在括号内,正确的划√,错误的划×)1.词法分析作为单独的一遍来处理较好。
(× )2.规范归约(最左规约)和规范推导(最右推导)是互逆的两个过程。
(√)3.正规文法产生的语言都可以用上下文无关文法来描述。
(√ )4.编译程序与具体的机器有关,与具体的语言无关。
(× )5.一张转换图只包含有限个状态,其中有一个被认为是初态,最多只有一个终态。
(× )6.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。
(× )7.逆波兰法表示的表达式亦称前缀式。
(√)8.如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。
(√ )9.对于数据空间的存贮分配,FORTRAN采用动态贮存分配策略。
(× )10.甲机上的某编译程序在乙机上能直接使用的必要条件是甲机和乙机的操作系统功能完全相同。
(×)11.递归下降分析法是自顶向下分析方法。
(√ )12.产生式是用于定义词法成分的一种书写规则。
(× )13.符号表中的信息栏中登记了每个名字的属性和特征等有关信息,如类型、种属、所占单元大小、地址等等。
(√)14.程序语言的语言处理程序是一种应用软件。
(× )15.解释程序适用于COBOL 和FORTRAN 语言。
(×)16.编译程序是对高级语言程序的解释执行。
(× )17.语法分析时必须先消除文法中的左递归。
(×)18.逆波兰表示法表示表达式时无须使用括号。
(√ )19.仅考虑一个基本块,不能确定一个赋值是否真是无用的。
(√)20.数组元素的地址计算与数组的存储方式有关。
(√)21.静态数组的存储空间可以在编译时确定。
(√)22.进行代码优化时应着重考虑循环的代码优化,这对提高目标代码的效率将起更大作用。
(√)23.两个正规集相等的必要条件是他们对应的正规式等价。
《编译原理》模拟试题一一、是非题(请在括号内,正确的划错误的划X)(每个2分,共20分)1•计算机高级语言翻译成低级语言只有解释一种方式。
(X)2.在编译中进行语法检查的目的是为了发现程序中所有错误。
(X)3.甲机上的某编译程序在乙机上能直接使用的必要条件是甲机和乙机的操作系统功能完全相同。
(丁 )4.正则文法其产生式为A->a , A->Bb, A.BGVN , a、beVT o (X)5.每个文法都能改写为LL(1)文法。
(V)6.递归下降法允许任一非终极符是直接左递归的。
(V)7.算符优先关系表不一定存在对应的优先函数。
(X)8.自底而上语法分析方法的主要问题是候选式的选择。
(X)9.LR法是自顶向下语法分析方法。
(X)10.简单优先文法允许任意两个产生式具有相同右部。
(X)二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共40分)1.一个编译程序中,不仅包含词法分析,_____ ,中间代码生成,代码优化,目标代码生成等五个部分。
A.()语法分析B.()文法分析C.()语言分析D.()解释分析2.词法分析器用于识别_____ oA.()字符串B.()语句C.()单词D.()标识符3 •语法分析器则可以发现源程序中的______ oA.()语义错误B.()语法和语义错误C.()错误并校正D.()语法错误4.下面关于解释程序的描述正确的是。
(1) 解释程序的特点是处理程序时不产生目标代码(2) 解释程序适用于COBOL 和FORTRAN 语言(3) 解释程序是为打开编译程序技术的僵局而开发的A. ( ) (1) (2)B. () (1)C. () (1)⑵(3)D.()⑵⑶5. _________________________________________ 解释程序处理语言时,大多数采用的是 ___________________________________ 方法。
学号:E******** 专业:计算机科学与技术二班 姓名:王安 实验日期: 2012/6/8 教师签字: 成绩:
《编译原理》 课程实验报告
实验六: 计算first集合和follow集合 计算first集合和follow集合 【实验目的】 掌握first集合和follow集合的概念和计算方法
【实验原理】 计算first集合(根据定义): 根据first集定义对每一文法符号VX计算)(XFIRST。
(1) 若TVX,则}{)(XXFIRST。 (2) 若NVX,且有产生式TVaaX,则)(XFIRSTa。 (3) 若NVX,X,则)(XFIRST。 (4) 若nYYYX,,,,21都NV,而有产生式nYYYX21。当121,,,iYYY
都*时,(其中ni1),则)(},{)(},{)(},{)(121iiYFIRSTYFIRSTYFIRSTYFIRST都包
含在)(XFIRST中。 (5) 当(4)中所有*iY,(ni,,3,2,1),则}{)()()()(21nYFIRSTYFIRSTYFIRSTXFIRST。
反复使用上述(2)~(5)步知道每个符号的FIRST集合不再增大。 【实验程序代码】 #include #include #include using namespace std;
#define MAXS 50 int NONE[MAXS]={0};
string strings,noend,End; string first[MAXS];// 用于存放每个终结符的first集 string First[MAXS];// 用于存放每个非终结符的first集
string Follow[MAXS]; // 用于存放每个非终结符的follow集 int N;
struct STR { string left; string right; };
//求VN和VT void VNVT(STR *p) { int i,j; for(i=0;i{ for(j=0;j<(int)p[i].left.length();j++) { if((p[i].left[j]>='A'&&p[i].left[j]<='Z')) { if(noend.find(p[i].left[j])>100) noend+=p[i].left[j]; } else { if(End.find(p[i].left[j])>100) End+=p[i].left[j]; } } for(j=0;j<(int)p[i].right.length();j++) { if(!(p[i].right[j]>='A'&&p[i].right[j]<='Z')) { if(End.find(p[i].right[j])>100) End+=p[i].right[j]; } else { if(noend.find(p[i].right[j])>100) noend+=p[i].right[j]; } } } }
void getlr(STR *p,int i) { int j; for(j=0;j{ if(strings[j]=='-'&&strings[j+1]=='>') { p[i].left=strings.substr(0,j); p[i].right=strings.substr(j+2,strings.length()-j); } } }
//对每个文法符号求first集 string Letter_First(STR *p,char ch) { if(!(End.find(ch)>100)) { first[End.find(ch)]="ch"; return first[End.find(ch)-1]; } if(!(noend.find(ch)>100)) { for(int i=0;i{ if(p[i].left[0]==ch) { if(!(End.find(p[i].right[0])>100)) { if(First[noend.find(ch)].find(p[i].right[0])>100) { First[noend.find(ch)]+=p[i].right[0]; } } if(p[i].right[0]=='*') { if(First[noend.find(ch)].find('*')>100) { First[noend.find(ch)]+='*'; } } if(!(noend.find(p[i].right[0])>100)) { if(p[i].right.length()==1) { string ff; ff=Letter_First(p,p[i].right[0]); for(int i_i=0;i_i{ if( First[noend.find(ch)].find(ff[i_i])>100) { First[noend.find(ch)]+=ff[i_i]; } }
} else { for(int j=0;j{ string TT; TT=Letter_First(p,p[i].right[j]); if(!(TT.find('*')>100)&&(j+1){ sort(TT.begin(),TT.end()); string tt; for(int t=1;t{ tt+=TT[t]; } TT=tt; tt=""; for(int t=0;t{ if( First[noend.find(ch)].find(TT[t])>100) { First[noend.find(ch)]+=TT[t]; } } } else { for(int t=0;t{ if( First[noend.find(ch)].find(TT[t])>100) { First[noend.find(ch)]+=TT[t]; } } break; } } }
} } } return First[noend.find(ch)]; } } // 求每个非终结符的Follow集 string Letter_Follow(STR *p,char ch) { NONE[noend.find(ch)]++; if(NONE[noend.find(ch)]==2) { NONE[noend.find(ch)]=0; return Follow[noend.find(ch)]; } for(int i=0;i{ for(int j=0;j{ if(p[i].right[j]==ch) { if(j+1==p[i].right.length()) { string gg; gg=Letter_Follow(p,p[i].left[0]); NONE[noend.find(p[i].left[0])]=0; for(int k=0;k{ if(Follow[noend.find(ch)].find(gg[k])>100) { Follow[noend.find(ch)]+=gg[k]; } } } else { string FF; for(int jj=j+1;jj{ string TT; TT=Letter_First(p,p[i].right[jj]); if(!(TT.find('*')>100)&&(jj+1){ sort(TT.begin(),TT.end()); string tt; for(int t=1;t{ tt+=TT[t]; } TT=tt; tt=""; for(int t=0;t{ if( FF.find(TT[t])>100&&TT[t]!='*') { FF+=TT[t]; } } } else { for(int t=0;t{ if( FF.find(TT[t])>100) { FF+=TT[t];