计算机编译原理 (13)
编译原理复习题(经典)
编译原理复习题一、是非题1.计算机高级语言翻译成低级语言只有解释一种方式。
(×)3.每个文法都能改写为 LL(1) 文法。
(×)4.算符优先关系表不一定存在对应的优先函数。
(√)5.LR分析方法是自顶向下语法分析方法。
(×)6.“ 用高级语言书写的源程序都必须通过编译,产生目标代码后才能投入运行”这种说法。
(× )7.一个句型的句柄一定是文法某产生式的右部。
(√)8.仅考虑一个基本块,不能确定一个赋值是否真是无用的。
(√ )9.在中间代码优化中循环上的优化主要有不变表达式外提和削减运算强度。
(× )10.对于数据空间的存贮分配,FORTRAN采用动态贮存分配策略。
(×)11.甲机上的某编译程序在乙机上能直接使用的必要条件是甲机和乙机的操作系统功能完全相同。
(× ) 12.递归下降分析法是自顶向下分析方法。
(√ )13.产生式是用于定义词法成分的一种书写规则。
(×)14.在SLR(1)分析法的名称中,S的含义是简单的。
(√)15.综合属性是用于“ 自上而下” 传递信息。
(× )16.符号表中的信息栏中登记了每个名字的属性和特征等有关信息,如类型、种属、所占单元大小、地址等等。
(×)17.程序语言的语言处理程序是一种应用软件。
(×)18.解释程序适用于COBOL 和FORTRAN 语言。
(×)19.一个LL(l)文法一定是无二义的。
(√)20.正规文法产生的语言都可以用上下文无关文法来描述。
(√)21.一张转换图只包含有限个状态,其中有一个被认为是初态,最多只有一个终态。
(×)22.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。
(√)22.逆波兰法表示的表达式亦称后缀式。
(√ )23.如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。
(√ )24.数组元素的地址计算与数组的存储方式有关。
编译原理习题答案
编译原理习题答案1、正规文法又称DA、0型文法B、1型文法C、2型文法D、3型文法2、对于无二义性的文法,规范归约是BA.最左推导B.最右推导的逆过程C.最左归约的逆过程D.最右归约的逆过程。
3、扫描器的任务是从源程序中识别出一个个单词符号4、程序所需的数据空间在程序运行前就可确定,称为A管理技术。
A静态存储B动态存储C栈式存储D堆式存储5、编译过程中,语法分析器的任务是(B)。
①分析单词是怎样构成的②分析单词串是如何构成语句和说明的③分析语句和说明是如何构成程序的④分析程序的结构A、②③B、②③④C、①②③D、①②③④6、文法G:E→E+T|TT→T某P|PP→(E)|i则句型P+T+i的句柄和最左素短语分别为BA.指示器B.临时变量C.符号表D.程序变量8、程序语言的单词符号一般可以分为保留字、标识符、常数、运算符、界符等等。
9、下列B优化方法是针对循环优化进行的。
A.删除多余运算B.删除归纳变量C.合并已知量D.复写传播10、若文法G定义的语言是无限集,则文法必然是AA、递归的B、前后文无关的C、二义性的D、无二义性的11、文法G产生的D的全体是该文法描述的语言。
A、句型B、终结符集C、非终结符集D、句子12、Chomky定义的四种形式语言文法中,0型文法又称为A文法;1型文法又称为C文法。
A.短语文法B.上下文无关文法C.上下文有关文法D.正规文法A.短语文法B.上下文无关文法C.上下文有关文法D.正规文法13、语法分析最常用的两类方法是自顶向下和自底向上分析法。
14、一个确定的有穷自动机DFA是一个AA五元组(K,∑,f,S,Z)B四元组(VN,VT,P,S)C四元组(K,∑,f,S)D三元组(VN,VT,P)A、语法B、语义C、代码D、运行15、B不属于乔姆斯基观点分类的文法。
A、上下文无关文法B、算符优先文法C、上下文有关文法D、正规文法16、一个文法所描述的语言是A;描述一个语言的文法是BA.唯一的B.不唯一的C.可能唯一,可能不唯一A.唯一的B.不唯一的C.可能唯一,可能不唯一17、语法分析是依据语言的语法规则进行的,中间代码产生是依据语言的等价变换规则进行的。
编译廖力习题答案
编译廖力习题答案1、编译过程中,语法分析器的任务不包括()A、分析单词是怎样构成的B、分析单词串是如何构成语句和说明的C、分析语句和说明是如何构成程序的D、分析程序的结构答案:分析单词是怎样构成的2、编写一个计算机高级语言的源程序后,到正式上机运行之前,一般要经过()这几步a、编辑b、编译c、连接d、运行A、abcdB、abcC、acD、ad答案:编译3、解释方式和编译方式的主要区别在于A、能否对源程序查错B、能否生成目标代码C、能否多用户运行D、机器资源利用率高低答案:能否生成目标代码4、若在C语言源程序中出现“&#&”,且不出现在引号和注释里,在编译时会()A、不报错B、语法分析时报错C、词法分析时报错D、代码生成时报错答案:词法分析时报错5、若在C语言程序中出现“aa11bb=123;”,且不出现在引号和注释里,在编译时会()A、词法分析时报错B、语义分析时报错C、生成中间代码时报错D、语法分析时报错答案:语法分析时报错6、面向机器的语言指的是()A、用于解决机器硬件设计问题的语言B、特定计算机系统所固有的语言C、各种计算机系统都通用的语言D、只能在一台计算机上使用的语言答案:特定计算机系统所固有的语言7、面向机器语言的特点是()A、程序的执行效率低,编制效率低,可读性差B、程序的执行效率高,编制效率高,可读性强C、程序的执行效率低,编制效率高,可读性强D、程序的执行效率高,编制效率低,可读性差答案:程序的执行效率高,编制效率低,可读性差8、编译程序是对()A、汇编程序的翻译B、高级语言的解释执行C、机器语言的执行D、高级语言的翻译答案:D满分:2分9、编译程序是一种()软件A、系统B、应用C、MISD、ERP答案:C您的回答:无得分:0分解题思路:无10、()不是编译程序的组成部分A、词法分析器程序B、代码生成程序C、设备管理程序D、语法分析程序答案:设备管理程序11、设有表达式a*b-c,将其中a*b识别为表达式的编译阶段是()A、词法分析B、语法分析C、语义分析D、代码生成答案:语法分析12、编译原理各阶段的工作都涉及到()A、表格管理B、语法分析C、出错处理D、代码优化答案:表格管理;出错处理13、程序语言一般分为()和()A、高级语言B、专用程序语言C、低级语言D、通用程序语言答案:高级语言;低级语言14、高级语言的翻译方式有()和()将高级语言源程序“翻译”成目标程序的方式有()。
《编译原理》第十三章习题答案
答案: 编译程序的实现 应考虑:开发周期、目标程序的效率、可移植性、可调试性、可维护
性、可扩充性等。
盛威网()专业的计算机学习网站
3
C2,然后分 3 步实现。
盛威网()专业的计算机学习网站
问题 3: 什么叫做软件移植?
答案: 通常把某个机器(称为宿主机)上已有的软件移植到另一台机器(称为目标机)
问题 4: 什么叫做交叉编译?
答案: 交叉编译是指把一个源语言在宿主机上经过编译产生目标机的汇编语言或机器语言。
盛威网()专业的计算机学习网站
1
《编译原理》课后习题答案第十三章
附加题
问题 1: 如何用 T 型图 表示一个编译程序的实现?
答案: 用 T 型图 表示编译程序的实现
问题 2: 如何用自展方式在 PC 机上实现 C 语言的编译程序?请用 T 型图 表示。
答案: 用自展方式在 PC 机上实现 C 语言的编译程序,首先把 C 划分成真包含的子集 C1 和
编译原理第十三章习题答案编译原理课后习题答案编译原理习题答案编译原理第六章答案编译原理第七章答案编译原理第四章答案编译原理第三章答案编译原理第五章答案编译原理复习题编译原理习题
《编译原理》课后习题答案第十三章
第 13 章 编译程序的构造
第1题 构造一个编译程序有哪些途径?
答案:
编译程序的实现途径可有: (1)手工构造:用机器语言、汇编语言或高级程序设计语言书写。 (2)自动构造工具:Lex,Yacc。 Lex ,Yacc 分别是词法和语法分析器的生成器。 (3)移植方式:目标程序用中间语言。 (4)自展方式:用 T 型图表示。
《编译原理》课后习题答案第三章第3章文法和语言第1
《编译原理》课后习题答案第三章第3 章文法和语言第1 题文法G=({A,B,S},{a,b,c},P,S)其中P 为:S→Ac|aBA→abB→bc写出L(G[S])的全部元素。
答案:L(G[S])={abc}第2 题文法G[N]为:N→D|NDD→0|1|2|3|4|5|6|7|8|9G[N]的语言是什么?答案:G[N]的语言是V+。
V={0,1,2,3,4,5,6,7,8,9}N=>ND=>NDD.... =>NDDDD...D=>D......D或者:允许0 开头的非负整数?第3题为只包含数字、加号和减号的表达式,例如9-2+5,3-1,7等构造一个文法。
答案:G[S]:S->S+D|S-D|DD->0|1|2|3|4|5|6|7|8|9第4 题已知文法G[Z]:Z→aZb|ab写出L(G[Z])的全部元素。
盛威网()专业的计算机学习网站 1《编译原理》课后习题答案第三章答案:Z=>aZb=>aaZbb=>aaa..Z...bbb=> aaa..ab...bbbL(G[Z])={anbn|n>=1}第5 题写一文法,使其语言是偶正整数的集合。
要求:(1) 允许0 打头;(2)不允许0 打头。
答案:(1)允许0 开头的偶正整数集合的文法E→NT|DT→NT|DN→D|1|3|5|7|9D→0|2|4|6|8(2)不允许0 开头的偶正整数集合的文法E→NT|DT→FT|GN→D|1|3|5|7|9D→2|4|6|8F→N|0G→D|0第6 题已知文法G:<表达式>::=<项>|<表达式>+<项><项>::=<因子>|<项>*<因子><因子>::=(<表达式>)|i试给出下述表达式的推导及语法树。
(5)i+(i+i)(6)i+i*i盛威网()专业的计算机学习网站 2 《编译原理》课后习题答案第三章答案:<表达式><表达式> + <项><因子><表达式><表达式> + <项><因子>i<项><因子>i<项><因子>i( )(5) <表达式>=><表达式>+<项>=><表达式>+<因子>=><表达式>+(<表达式>)=><表达式>+(<表达式>+<项>)=><表达式>+(<表达式>+<因子>)=><表达式>+(<表达式>+i)=><表达式>+(<项>+i)=><表达式>+(<因子>+i)=><表达式>+(i+i)=><项>+(i+i)=><因子>+(i+i)=>i+(i+i)<表达式><表达式> + <项><项> * <因子><因子> i<项><因子>ii(6) <表达式>=><表达式>+<项>=><表达式>+<项>*<因子>=><表达式>+<项>*i=><表达式>+<因子>*i=><表达式>+i*i=><项>+i*i=><因子>+i*i=>i+i*i盛威网()专业的计算机学习网站 3《编译原理》课后习题答案第三章第7 题证明下述文法G[〈表达式〉]是二义的。
编译原理作业参考答案
最左推导:NNDDD3D34
NNDNDDDDD5DD56D568
最右推导:NNDN4D434
NNDN8ND8N68D68568
2*.写出一个文法,使其语言是奇数集,且每个奇数是不以0开头。
答:
SCAB|B(考虑了正负号)
A1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | AA | A0 |
低级语言:机器语言和汇编语言。
高级语言:是人们根据描述实际问题的需要而设计的一个记号系统。如同自然语言(接近数学语言和工程语言)一样,语言的基本单位是语句,由符号组和一组用来组织它们成为有确定意义的组合规则。
翻译程序:能够把某一种语言程序(源语言程序)改变成另一种语言程序(目
标语言程序),后者与前者在逻辑上是等价的。其中包括:编译程序,解释程序,汇编程序。
{2,4}a = {1,0},{2,4}b = {3,5},无需划分
{3,5}a = {3,5},{3,5}b = {2,4},无需划分
{0,1}a = {1},{0,1}b = {2,4},无需划分
因此,最终的划分为:{0,1}、{2,4}和{3,5},化简后的结果:
5.(P65,14)构造一个DFA M,它接受={0,1}上所有满足如下条件的字符串:每个1都有0直接跟在右边。
T*(i+i)F*(i+i)i*(i+i)
⑵构造语法树
E最左推导构造语法树
E + T
E + T i
T i
i
3.(P36, 9)证明下面的文法是二义的:
SiSeS | iSi
答:对于句子iiiei有两棵不同的语法树。因此该文法是二义的。
SiSeSiiSeSiiieSiiiei
编译原理考试试题与答案(汇总)
对输入串ab#给出分析过程为:
一、是非题:
1.一个上下文无关文法的开始符,可以是终结符或非终结符。 ( )
2.一个句型的直接短语是唯一的。 ( )
3.已经证明文法的二义性是可判定的。 ( )
4.每个基本块可用一个DAG表示。 ( )
5.每个过程的活动记录的体积在编译时可静态确定。 ( )
1.编译程序是对高级语言程序的解释执行。(× )
2.一个有限状态自动机中,有且仅有一个唯一的终态。(×)
3.一个算符优先文法可能不存在算符优先函数与之对应。(√ )
4.语法分析时必须先消除文法中的左递归。(×)
5.LR分析法在自左至右扫描输入串时就能发现错误,但不能准确地指出出错地点。(√)
6.逆波兰表示法表示表达式时无须使用括号。(√ )
2.考虑文法G[S]:
S → (T) | a+S | a
T → T,S | S
消除文法的左递归及提取公共左因子。
解:消除文法G[S]的左递归:
S→(T) | a+S | a
T→ST′
T′→,ST′| ε
提取公共左因子:
S→(T) | aS′
S′→+S | ε
T→ST′
T′→,ST′| ε
3.试为表达式w+(a+b)*(c+d/(e-10)+8)写出相应的逆波兰表示。
8.一个过程相应的DISPLAY表的内容为(现行活动记录地址和所有外层最新活动记录的地址)
10.常用的两种动态存贮分配办法是(栈式)动态分配和(堆式)动态分配。
11.一个名字的属性包括( 类型)和(作用域 )。
12.常用的参数传递方式有(传地址),(传值),(传名)
编译原理第三版王生原
编译原理第三版王生原编译原理是计算机科学中非常重要的一门课程,它涉及到编程语言的设计、编译器的构建以及程序的执行过程等方面。
《编译原理》第三版由王生原编著,是一本经典的教材,被广泛应用于计算机相关专业的教学和研究中。
本书共分为13章,内容涵盖了编译原理的基本概念、词法分析、语法分析、语法制导翻译、中间代码生成、运行时环境等多个方面。
每一章都详细介绍了相关的理论知识,并通过大量的实例和案例分析,帮助读者深入理解和掌握编译原理的核心内容。
在第一章中,王生原介绍了编译原理的基本概念和编译器的工作原理。
他首先阐述了编译器在程序设计和执行过程中的重要作用,然后详细介绍了编译器的基本结构和工作流程。
通过对编译器的整体框架和各个模块的功能进行分析,读者可以清晰地了解编译器的工作过程,为后续的学习打下坚实的基础。
接下来的几章分别介绍了词法分析和语法分析的原理和方法,包括正规表达式、有限自动机、上下文无关文法等内容。
王生原通过丰富的例子和图表,生动地阐述了这些复杂概念,帮助读者理解和掌握这些重要的知识点。
在中间代码生成和运行时环境这两个关键章节中,王生原详细介绍了中间代码的生成过程和运行时环境的组织结构,为读者展示了编译器如何将高级语言程序翻译成目标代码,并在目标机器上执行的全过程。
除了理论知识的讲解,本书还包括了大量的实例和案例分析,帮助读者将理论知识应用到实际的编译器设计和实现中。
通过这些实例,读者可以更加直观地了解编译原理的应用,提高自己的实际编程能力。
总的来说,王生原的《编译原理》第三版是一本很好的教材,它系统全面地介绍了编译原理的基本概念和核心技术,适合计算机相关专业的学生和从业人员阅读和参考。
通过学习本书,读者可以全面深入地了解编译原理的知识体系,提高自己的编程能力,为今后的学习和工作打下坚实的基础。
编译原理(第2版)课后习题答案详解
第1 章引论第1 题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)源程序:源语言编写的程序称为源程序。
(3)目标程序:目标语言书写的程序称为目标程序。
(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第2 题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和查找等一系列表格工作。
表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。
bit编译原理
bit编译原理编译原理是计算机科学与技术中的一门关键课程,主要研究编程语言的编译过程。
编译器将高级编程语言代码转化为机器语言,使计算机能够执行代码。
在本文中,我们将讨论编译原理的基本概念、过程和相关技术。
首先,我们将介绍编译原理的基本概念。
编译器是一种将高级编程语言转化为低级机器语言的程序。
编译器的主要任务包括词法分析、语法分析、语义分析、优化和代码生成等。
词法分析器将源代码分解成标记(tokens)的序列,语法分析器将标记组织成语法树,而语义分析器在语法树上执行类型检查等操作。
优化器通过改进代码结构来提高性能,代码生成器将优化后的代码转化为目标机器代码。
接下来,我们将讨论编译原理的过程。
编译器的主要过程分为两个阶段:分析(Analysis)和综合(Synthesis)。
分析阶段将源码转化为中间表示形式(IR,Intermediate Representation),并对其进行语法和语义分析。
综合阶段将IR转化为目标代码,并进行优化处理。
在分析阶段,词法分析器将源码分解为标记流,语法分析器将标记流组成语法树。
在综合阶段,代码生成器将语法树转化为中间表示形式,优化器对中间表示进行优化,最后生成目标代码。
编译原理涉及的相关技术有很多。
词法分析中常用的技术有有限自动机(DFA)和正则表达式。
语法分析中常用的技术有上下文无关文法(CFG)和递归下降分析。
语义分析中常用的技术有类型检查和语义动作。
优化器中常用的技术有数据流分析和代码重排。
代码生成中常用的技术有寄存器分配和指令选择。
编译原理在计算机科学与技术中有着广泛的应用。
编译器是现代软件开发的核心工具之一,几乎所有的程序语言都需要经过编译过程才能运行。
编译原理的研究对于提高软件性能、减少资源消耗和提高开发效率都有着重要的作用。
总结起来,编译原理是计算机科学与技术中一门重要的课程,主要研究编程语言的编译过程。
通过词法分析、语法分析、语义分析、优化和代码生成等过程,编译器将高级编程语言转化为机器语言。
编译原理习题答案
第三章
1.P64,8(1),(3)
给出正规表达式: 以01结尾的二进制数串 分析题意,要求的是二进制小,即由0和1构成的串 ,并且必须以01结尾,所以本题可以分两部分去完 成,一部分实现由0和1构成的任意串,一部分即01 ,然后将它们连接到一起就可以了,所以本题的解 答是:(0|1)*01。
(3)包含奇数个1或奇数个0的二进制数串。 本题求二进制串,并且要求包含奇数个0或奇数个1,由于0和1都可以在二 进制串中任何地方出现,所以本题只需要考虑一种情况,另外一种情况也可 以类似求得。考虑包含奇数个0的字符串:由于只关心0的个数的奇偶数,我 们可以把二进制串分成多段来考虑,第1段为二进制串的开始到第1个0为止 ,这一段包含1个0,并且0的前面有0个或多个1,对于剩下的二进制串按 照每段包含两个0的方式去划分,即以0开始,以0结尾,中间可以有0个或 多个1,和果一个二进制串被这样划分完后,剩下的部分如果全部是全1串( 这些全1串在前面划分的串之间或最后),则该二进制串就具有奇数个0,所 以该二进制串可以这样描述:以第1段(1*0)开始,后面由全1串(1*)以及包 含两个0的串(01*0)组成,所以包含奇数个0的正规表达式为 :1*0(1|01*0)*,本题的解答则是:1*0(1|01*0)*|0*1(0|10*1)*。
最后E.turelist={1,8},E.falelish={4,5,7}
P218.7 : 把下面的语句翻译成四元式序列: While A<C and B<D do If A=1 then C:=C+1 else while A<=D do A:=A+2;.
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (j<,A,C,3) (j,-,-,16) (j<,B,D,5) (j,-,-,16) (j=,A,1,7) (j,-,-,10) (+,C,1,T1) (:=,T1,-,C) (j,-,-,1) (j<=,A,D,12) (j,-,-,1) (+,A,2,T2) (:=,T2,-,A) (j,-,-,10) (j,-,-,1)
计算机编译原理
专升本-计算机编译原理模拟卷一单选1、文法描述的语言是(B)○A a|(bc)*○B、(a|bc)○C、(alcb)*OD、(alb)*c2、通常一个编译程序中,不仅包含词法分析,语法分析,中间代码生成,代码优化,目标代码生成等五个部分,还应包括_A-.○A、表格处理和出错处理○B、符号执行器○C、解释器○D、模拟执行器3、有限自动机识别的语言是(C)。
○A、上下文有关文法语言○B、上下文无关文法语言○C、正规文法语言○D、短语文法语言4、在规范归约中用来刻画可归约串的是(A)。
OA、句柄○B、最左素短语○C、短语○D、素短语5、文法G产生的 A 的全体是该文法描述的语言。
OA、句子○B、终结符集○C、句型○D、非终结符集6、文法G[E]:该文法句型E+F·(E+T)的简单短语是下列符号串中的_①(E+T)②E+T ③F ④F·(E+T)可选项有:OA、②和③OB、③和④OC、①和③OD、③7、已知文法G1={A,B,C},{a,b,c},P,A),其中P由以下产生式组成:A→abclaBbc Bb→bB Bc→Cbcc bC→Cb aC→aaB aC→aa此文法所表示的语言是OA.(abc)nIn>0}○B、([anbncn|n>0}O C、(anbncnln=0}OD、{(ab)ncnn>0}8、文法G[S]=(a},{S,P),S,(S→a|aP,P-aS),该文法所描述的语言是( )。
OA L(G[S)=(a2zlj20}○B、L(GI[S)=(a2i+1P1)○C、L(G[S])=[a2i+1j=0}OD、L(G[S)=1al20}9、已知文法GIS]:S-US+U[S-U,U-VUVUN,V-(S)li句型U+UV+的所有简单短语是()。
OA. i、U*V○B、U*V、第一个U○C、i、U*V、第一个U〇D、i、第一个U10、语言是()。
OA、句子的集合○B、函数的集合○C、程序的集合○D、文法的集合11、设有文法G[I]:1→|1|I0|la|lclalblc下列符号串中是该文法句子的有------。
计算机编译原理
本课程的目的
构造编译器基本知识
编译的阶段和相关的活动 相关数据结构和算法
计算机科学中相关的基础理论
形式语言与自动机
进一步加深对软件开发的认识
第一章 概述
【课前思考】 ◇ 什么是编译程序? ◇ 编译过程和编译程序的结构? 【学习目标】 介绍语言翻译的基本概念
程序和语言 翻译和解释
介绍翻译的步骤和相关的活动 介绍编译器的开发方法
输入字符串(即源程序) 输出单词符号(最基本的语法单位) 。
词法分析举例
一个C源程序片段:
int a; a=a+2; 词法分析后返回(如右 图):
单词类型 保留字 标识符 界符 标识符 算符(赋值) 标识符 算符(加) 整数 界符 单词值 int a ; a = a + 2 ;
(2) 语法分析(Syntax analysis)
程序的执行方式
高级语言程序通常采用两种方式执行:解释方 式和翻译方式 解释方式:逐个语句地分析和执行,如Basic, Prolog
优点:易于查错 缺点:效率低,运行速度慢
翻译方式:对整个程序进行分析,翻译成等价 机器语言程序后执行,如Pascal,Fortran,C
优点:只需分析和翻译一次, 缺点:在运行中发现的错误必须在源程序中查找
编译程序的功能
从功能上看,一个 编译程序就是一个 语言翻译程序。 源语言通常是一个 高级语言,如 FORTRAN,C 或 Pascal。 目标语言通常是一 个低级语言,如汇编 或机器语言。
出错和警告信息
编译程序
源语言程序
目标语言程序
T形图
常用T形图来表示编译程序涉及的三个语言: S I 其中: S:源语言(程序),Source language(program) O:目标语言(程序), target/object language(program) I:实现语言, implementation language O
编译原理
自底向上分析方法是从给定的单词串开始,试图归约(推导的逆操作)为文法的开始符,如果能归约到文法 开始符,则确认单词串是正确的程序,否则是错误的程序。
自底向上语法分析要解决的问题是如何快速、确定的找到合适的归约过程(如果存在),用于其的方法有简 单优先法、算符优先法、LR分析法等。
语义处理
在计算机上执行一个高级语言源程序一般分为两步:一是通过编译程序把源程序 翻译成机器语言程序,也叫目标程序;二是执行目标程序。但是对高级语言源程序的 处理也可以采用边翻译边执行的解释执行方式。这种方式下的翻译程序称为解释程序。
解释程序与编译程序的比较
编译程序 解释程序
执行方式
将源程序翻译成目标语言程
序,然后在计算机上运行目 标程序
或者直接解释执行源程序,
或者将源程序翻译成某种中 间表示形式后再加以执行
处理程序 翻译源程序
机器上运行的是与源程序等 价的目标程序,源程序和编 译程序都不再参与目标程序
的执行过程
将源程序翻译成独立的目标 程序
解释程序和源程序(或某种等 价表示)要参与到程序的运行 过程中,运行程序的控制权
编译程序也称为编译器,是指把用高级程序设计语言书写的源程序,翻译成等价的 机器语言格式目标程序的翻译程序。编译程序属于采用生成性实现途径实现的翻译程序。 它以高级程序设计语言书写的源程序作为输入,而以汇编语言或机器语言表示的目标程 序作为输出。编译出的目标程序通常还要经历运行阶段,以便在运行程序的支持下运行, 加工初始数据,算出所需的计算结果。
语法分析
语法分析就是确认作为词法分析结果的单 词序列是否为给定语言的一个正确序列。在语 法分析中,给定语言用文法表示,如果给定的 程序能够与该文法相匹配,则认为程序是正确 的,否则程序是错误的。单词序列与给定文法 匹配的方式有两种:自顶向下分析法和自底向 上分析法。
编译原理-计算机科学技术系
3 语义分析
检查代码意义并发现和纠正语义错误。
2 语法分析
将标记组成语法树以检查语法正确性。
4 代码生成
生成目标语言的代码。
词法分析
流程
源代码 => 单词流
实现
正则表达式 => 自动机
应用
编译器中的第一步,用于通 过扫描源码确定单词。
语法分析
1
Top-down分析
由上往下,层层分解源程序。
Bottom-up分析
2
由下往上,将单词组合成分析树。
3
LL分析
从左端向右端进行分析,是常用的一
LR分析
4
种自上而下语法分析方法。
从右端向左端进行分析,比LL更加通 用。
语义分析
变量声明与检查
检查变量声明和使用是否符合语法和类型。
类型检查
检查类型匹配情况和错误类型转换。
处理语言之间的差异、解决 类型检查等问题、优化代码 的性能。
编译原理-计算机科学技 术系
编译原理是计算机科学技术系的关键课程之一,是研究如何将高级语言翻译 为机器可执行代码的理论和技术。
编译过程
源代码输入
通过编辑器或IDE输入源代码。
编译器设计
确定编译器的结构和编译过程 的流程。
程序优化
对代码进行优化以提高代码质 量和性能。
生成可执行代码
将编译后的代码生成可执行文 件。
控制流分析
分析程序的控制流程以确定正确的行为和错误情况。
代码生成
汇编代码生成
将源代码转换为汇编代码的过 程。
输出文件类型
生成的可执行文件的类型取决 于操作系统和编译器。
优化技术
使用优化技术提高代码质量和 性能。
计算机编译原理课后习题及答案详细解析
在此深情而热烈的感谢沈仲秋同学的大力支持和帮助,同时希望本文档对各位有些帮助。
一1、画出编译程序的总体结构图,简述其部分的主要功能。
[答案]编译程序的总框图见下图。
图编译程序的总体结构图其中词法分析器,又称扫描器,它接受输入的源程序,对源程序进行词法分析,识别出一个个的单词符号,其输出结果上单词符号。
语法分析器对单词符号串进行语法分析(根据语法规则进行推导或归纳),识别出程序中的各类语法单位,最终判断输入串是否构成语语义分析及中间代码产生器,按照语义规则对语法分析器归纳出(或推导出)的语法单位进行语义分析并把它们翻译成一定形式的中间优化器对中间代码进行优化处理。
一般最初生成的中间代码执行效率都比较低,因此要做中间代码的优化,其过程实际上是对中间代码目标代码生成器把中间代码翻译成目标程序。
中间代码一般是一种与机器无关的表示形式,只有把它再翻译成与机器硬件相关的机器能表格管理模块保持一系列的表格,登记源程序的各类信息和编译各阶段的进展状况。
编译程序各个阶段所产生的中间结果都记录在表格出错处理程序对出现在源程序中的错误进行处理。
如果源程序有错误,编译程序应设法发现错误,把有关错误信息报告给用户。
编译程2、计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?[答案]计算机执行用高级语言编写的程序主要途径有两种,即解释与编译。
像Basic之类的语言,属于解释型的高级语言。
它们的特点是计算机并不事先对高级语言进行全盘翻译,将其变为机器代码,而是每读总而言之,是边翻译边执行。
像C,Pascal之类的语言,属于编译型的高级语言。
它们的特点是计算机事先对高级语言进行全盘翻译,将其全部变为机器代码,再统1.文法G[S]为:S->Ac|aBA->abB->bc写出L(G[S])的全部元素。
[答案]S=>Ac=>abc或S=>aB=>abc所以L(G[S])={abc}2. 文法G[N]为:N->D|NDD->0|1|2|3|4|5|6|7|8|9G[N]的语言是什么?[答案]G[N]的语言是V+。
编译原理流程
编译原理流程编译原理是计算机科学的重要分支,主要研究如何将高级语言程序转化为机器语言的过程。
编译原理的流程可以分为词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等几个阶段。
1. 词法分析词法分析是编译原理的第一步,主要任务是将源代码分解成一个个的词法单元,如标识符、关键字、运算符和常量等。
词法分析器会根据预先定义的词法规则,逐个扫描源代码,将识别出的词法单元转化为记号(token)并生成记号流。
2. 语法分析语法分析是编译原理的第二步,主要任务是根据词法分析生成的记号流,判断程序是否符合语法规则。
语法分析器会根据预先定义的语法规则,逐个分析记号流,构建语法树(parse tree)。
如果程序存在语法错误,则会报告错误信息。
3. 语义分析语义分析是编译原理的第三步,主要任务是对语法树进行语义检查,并生成中间代码。
语义分析器会根据预先定义的语义规则,对语法树进行遍历,检查变量的声明和使用是否符合规范,以及类型的一致性等。
同时,语义分析器会根据语义规则生成中间代码,用于后续的优化和目标代码生成。
4. 中间代码生成中间代码生成是编译原理的第四步,主要任务是将源代码转化为一种中间表示形式,以便进行优化和目标代码生成。
中间代码可以是抽象语法树(Abstract Syntax Tree,AST)、三地址码(Three Address Code)或虚拟机代码等。
中间代码的生成可以通过遍历语法树并根据语法规则进行转换。
5. 代码优化代码优化是编译原理的第五步,主要任务是对中间代码进行优化,以提高程序的执行效率。
代码优化包括常量折叠、公共子表达式消除、循环优化等技术。
优化器会根据预先定义的优化规则,对中间代码进行分析和转换,以减少不必要的计算和内存访问。
6. 目标代码生成目标代码生成是编译原理的最后一步,主要任务是将中间代码转化为目标机器代码,使得程序可以在目标机器上运行。
目标代码生成器会根据目标机器的特定指令集和寄存器分配策略,将中间代码转化为对应的目标机器代码,并生成可执行文件或目标文件。
《编译原理》训练题1
《编译原理》训练题第一章一.填空题1.一个编译程序是一个①,编译程序完成从②语言所写的源程序到③语言所写的目标程序的翻译工作。
2.编译程序的整个工作划分成阶段进行的,典型的划分方法,将编译过程分成六个阶段:①,②,③,④,⑤,⑥。
3.对编译程序而言,输入数据是①,输出结果是②。
4.编译方式与解释方式的根本区别在于。
二判断题()1.汇编程序是一个编译程序,它把汇编语言程序翻译成机器语言执行。
() 2.编译程序是一个语言翻译程序,它把汇编语言程序翻译成机器语言执行。
三.选择题1.汇编程序是将(1)翻译成(2);编译程序是将(3)翻译成(4)。
可选项有:a.汇编语言程序b.机器语言程序c.高级语言程序d.汇编语言程序或机器语言程序e.汇编语言程序或高级语言程序f.机器语言程序或高级语言程序2.用高级语言编写的程序经编译后产生的程序叫(1)。
用不同语言编写的程序产生(1)后,可用(2)连接在一起生成机器可执行的程序。
在机器中真正执行的是(3)。
可选项有:a.源程序b.目标程序c.函数d.过程e.机器指令代码f.模块g.连接程序h..程序库3.编译程序与具体的机器(1),与具体的语言(2)。
可选项有:a.有关b.无关4.编译程序是一种常用的软件。
可选项有:a.应用b.系统5.编译程序生成的目标程序是机器语言的程序。
可选项有:a.一定b.不一定四、思考题1.给出一个典型的编译程序的结构框图。
2.什么是前端和后端?设想相同的前端不同的后端,相同的后端不同的前端生成的编译程序分别有何特征?第二章一.填空题1. INT O A在每个过程目标程序的入口都有这样一条指令,用以完成①的工作,A域的值为②。
2. OPR O O在每个过程目标程序的①都有这样一条指令,用以完成②的工作。
3.PL/0编译程序运行时的存储分配策略采用栈式动态分配,用①链和②链的方式解决递归调用和非局部变量的引用问题。
4. 是构成语言文法的单词,是语法成分的最小单位。
129677548599719473编译原理实验指导书(新)
前言编译原理是计算机科学与技术、软件工程等专业的主干课和必修课,由于这门课程相对抽象且内容较复杂,一直是比较难学的一门课程。
在编译原理的学习过程中,实验非常重要,只有通过上机实验,才能使学生对比较抽象的课程内容产生一个具体的感性认识。
但是,目前国内市场上很少有较详细且比较适合我院实际的实验指导书,为此,我们特编了这份指导书,希望能对我院的《编译原理》教学工作有所帮助。
本书实验环境主要为C环境(由于兼容性问题,建议使用Turboc2.0)及一个词法分析器自动生成工具FLEX和一个语法分析器自动生成工具BISON。
书中给出的参考源程序也是C源程序,但由于实验者熟悉精通的语言工具不尽相同,因而强求采用统一的编程语言编程是不现实的。
实验者在掌握了编译程序各个阶段的功能和原理之后,不难借助使用其他自己熟悉的语言实现相关功能。
实验者在实验过程中应该侧重写出自己在算法分析、设计思路、实现功能或程序代码等方面的特色,写出设计和实现过程中遭遇到的难点和解决办法,可以不拘泥于实验指导给出的参考性设计思路,尽可能在深度和广度上加以拓展。
只有这种各具特色的实验报告,才将更有利于体现实验者在创新思维和动手能力上的差异。
通过这些实验,能使学生对这些部份的工作机理有一个详细的了解,达到“知其然,且知其所以然”的目的。
并可在C环境下对自动生成工具生成的词法、语法分析器进行编译调试。
由于手工生成词法和语法分析器的工作量太大,在实际中常用自动生成工具来完成之。
这些工具中最著名的当属贝尔实验室的词法分析器生成工具LEX和语法分析器生成工具YACC。
它们现已成为UNIX的标准应用程序同UNIX一起发行。
与此同时GNU推出与LEX完全兼容的FLEX,与YACC完全兼容的BISON。
这两个程序都在Internet上以源代码的形式免费发行,所以很容易在其它操作系统下重新编译安装。
我们实验采用的就是for dos的FLEX和BISON。
本书有关的编译工具及其源程序例子,可到BISON的网站上下载。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.1 过程的动态特性
5.1.1 过程与活动
<1> 过程、活动、生存期 过程的每一次运行称为一次 活动 ( activation )。 活 动是一个动态的概念,它有有限的生存期(life time)。 定义5.1 活动的生存期是指从进入活动的第一条指令执行到 离开此活动前的最后一条指令执行的这段时间,其中包括 调用其它过程时其它活动的生存期。 ■
重点:详细讨论
20
<3> 堆分配策略
5.2.2 静态与动态分配简介(续2)
特点:可任意分配和撤消数据;对程序设计语言没有限制; 静态、栈与堆的关系: 可以静态分配的数据均可以栈分配 可以静态和栈分配的数据均可以堆分配 反之不一定 堆分配的基本思想:(用一个双向队维护可用空间信息)
21
期末安排
• • • •
19
<2> 栈分配策略
5.2.2 静态与动态分配简介(续1) 特点:按栈的方式分配存储空间 限制: 1. 当活动停止后,局部于活动的名字值不能保持(会出现悬 空引用); 2. 无法处理需要随时分配或撤销(不满足LIFO)的动态数据; 3. 被调用者的活动比调用者的活得更长,此时,活动树不能 正确描绘过程间的控制流。(send/receive) 存储安排:
2
5.1.1 过程与活动(续1)
<2> 活点是有去必有回 • 顺序调用:生存期不交 • 嵌套调用:生存期嵌套,关系由活动执行轨迹的 条件(例如参数等)动态确定 • 容易混淆的概念:过程的并行定义和嵌套定义( 作用域不交和嵌套) 2. 消息传递:send/receive,特点是可以有去无回。
28
<3> 调用序列和返回序列内容 调用序列 调用者(①): 传递参数 维护访问链(如果必要) 保存返回地址和控制链 保存机器状态 (指令计数器寄存器等) 将控制转向被调用者 被调用者(②): 设置新的活动记录大小 为可变数组分配空间(若有) 初始化本地数据(若必要) ...(开始可执行代码)
5.3.2 调用序列与返回序列(续2) 返回序列 被调用者(③): 保留返回值(若为函数) 恢复访问链(如果必要) 恢复调用时机器状态 恢复控制链 将控制返回调用者 调用者(④): 接收返回值(若有的话) ...(继续执行代码)
25
5.3.1 控制栈中的活动记录(续2) 例5.5 控制栈的变化过程(从s到r、q(1,9)、q(1,3)、q(1,0))
26
5.3.2 调用序列与返回序列
<1> 简化的活动记录 任何时刻 top和sp 都是唯一的! (因为只有一个栈) top→ 参数与返回值 控制链 (调用与返回序列引用) sp→ 本地数据 临时变量 (过程运行时引用)
top→
问题:如何使得过程调用和返回时能够实现: 1. 程序控制流正确转移 2. 活动记录正确切换 解决方案: 在过程运行代码的适当位置,加入实现这些功能的代码。 称它们为调用序列和返回序列
27
5.3.2 调用序列与返回序列(续1) <2> 调用序列和返回序列的位置 调用序列:①、② 返回序列:③、④ <3> 调用序列和返回序列的内容
5
5.1.1 过程与活动(续4) 例5.1 考虑快排序过程: program sort(input, output); procedure readarray; function partition(y, z: integer):integer; procedure quicksort(m,n:integer); i:=partition(y,z)的结果: 考虑sort的执行: 时间缩为一个点,且翻转:
16
5.2 运行时数据空间的组织
5.2.1 运行时内存的划分与数据空间的存储分配策略
可执行代码(静态数据区)[注] 静态数据区(static data) 栈(stack) ↓ ↑ 堆(heap) [注] 当前情况下,源程 序代码与可执行代码是一 对一的关系,因此可以静 态绑定。 OOPL允许对代码重置 (override),因此代码 也存在动态绑定问题。
5.1.2 控制栈与活动记录
控制流与活动树的关系
<1> 程序控制流:对应活动树从根开始的一次深度优先遍历。 <2> 活动树上各节点之间具有下述关系: 同一层次的活动生存期不交; 任一时刻,处在生存期的活动构成一条从根到某节点的路径; 路径上各节点生存期是嵌套的(后进先出)。
8
控制流与活动树的关系(续) <3> 控制栈与活动记录 控制栈:保存所有在生存期的活动(一条后进先出的路径) 活动记录(activation record):栈中的每个元素称为一 个活动记录,为活动提供的活动场所。 活动记录中至少应该存放两类信息: 1. 控制信息:控制活动的正确调用与返回和控制活动记 录的正确切换; 2. 访问信息:用于为当前活动提供对数据,如本地数据 和非本地数据的访问。
14
<4> 环境与状态
5.1.3 名字的绑定(续4)
环境与状态是1对多的映射: 允许递归调用的情况下,同一作用域中的一个名字,可 以同时绑定到多个存储单元。如同一个快排序过程的三个活 动的活动记录q(1,9)、q(1,3)和q(1,0)均被放在控制栈中; 由于一个存储单元可以存放不同的值,状态也是一个一 对多的映射。
15
5.1.3 名字的绑定(续5) <5> 影响存储分配策略的因素 编译器怎样对存储空间进行组织和采用什么样的存储分 配策略,很大程度上取决于程序设计语言采用的机制,如: • 过程能否递归 • 过程能否嵌套 • 过程调用时参数如何传递 • 哪些实体可以作为参数和返回值 • 是否允许动态的为对象分配和撤销存储空间 • 存储空间是否必须显式地释放 • 等等
23
5.3 栈式动态分配
5.3.1 控制栈中的活动记录
<1> 活动记录的具体内容(控制信息+访问信息 ) 1. 参数与返回值 2. 控制链(可选) 3. 访问链(可选) 4. 保存的机器状态 5. 本地(局部)数据 6. 临时变量 其中: 1. 参数与返回值:存放实参和返回值; 2. 控制链(可选):指向调用者活动记录 的指针,用于当调用返回时,将当前 栈顶正确切换到调用者的活动记录; 3. 访问链(可选):用于在可嵌套定义的 过程中指示访问非本地数据;
正课:6月5日、12日 复习:6月19日(课程内容、习题、考试相关问题) 考试:7月5日5、6节 考前答疑:课代表与同学和辅导老师商量确定(两个 半天) • 注:若同学希望作业讲解,则课代表与辅导老师商量 确定
苯鸟先飞
勤能补拙
结束(2007年5月29日)
22
上次课程内容
1. 过程的动态特性 • 过程、活动、活动的生存期 • 顺序执行程序的控制流 • 活动树与控制栈 • 控制栈与活动记录 2. 名字的绑定 • 绑定是运行时名字与存储空间的结合 • 环境与状态、名字与存储空间1对多的关系 3. 影响存储分配策略的因素 4. 运行时内存的划分和数据空间的分配策略 • 静态数据区 (静态分配策略) • 动态数据区—栈数据区(栈分配策略) —堆数据区(堆分配策略)
3
<3> 顺序执行程序的控制流
5.1.1 过程与活动(续2)
特点:程序的执行在时间上是顺序的和排他的。即在程 序执行的任一瞬间,有且仅有一个活动正在活动。 假想时间是一支笔,则任何一个顺序执行程序的执行 过程(控制流)是一个“一笔画”。 控制流满足: ① 控制流是连续的; ② 过程间的控制流可以用树来表示。
9
5.1.2 控制栈与活动记录(续1) 例5.2 快排序程序运行时某状态的控制栈:
控制栈中保存了任何时刻所有在生存期活动的活动记录
10
5.1.3 名字的绑定
<1> 名字的绑定 定义 5.3 运行时为名字 X 分配存储空间 S , 这一过程 称为绑定(binding)。 ■ 换句话说,绑定是名字X与存储空间S的结合。 X是一个对象: • 既可以是数据对象,如变量,与之结合的是一个 存储单元; • 也可以是操作对象,如过程,与之结合的是可执 行的代码。 • 我们的讨论仅限于X是一个数据对象。
数据区与分配策略: 1. 静态分配策略:编译时安排所有数据对象的存储,即绑 定是静态确定的; 2. 栈分配策略:按栈的方式管理运行时的数据存储空间; 3. 堆分配策略:在运行时根据要求从堆数据区动态地分配 和释放数据存储空间。 17
5.2.2 静态与动态分配简介
<1> 静态分配策略: 特点:绑定是1对1的映射。名字在程序编译时与存储空 间结合,每次过程活动时,它的名字映射到同一存储单元。 程序运行时不再有对存储空间的分配。
6
5.1.1 过程与活动(续5) 活动树的实质是反映了顺序执行程序的调用和时序关系,它 把每个活动的生存期缩小到了一点。 其中: 例5.1 快排序程序的一次执行的活动树: s-sort r-readarray q-quicksort p-partition
5
8
10
20
30
仅关心活动是否可正确执行,不关心活动执行了多长时间 7
18
<1> 静态分配策略(续) 静态分配的限制: 1. 数据对象的大小和它在内存中位置的限制必须在编译时确定, 如数组的大小不能是动态的; 2. 不允许程序递归,因为一个过程的所有活动使用同样的名字 绑定,即绑定是一对一的; 3. 不能动态生成或撤消数据,因为运行时没有存储分配机制。 完全采用静态分配的语言:早期的FORTRAN。 允许分别编译的数据定义模块 ( 如全程引用的数据 ) , 也可以采用静态分配,因为它们一般在整个程序运行的 期间被共享。
11
<2> 静态与动态
5.1.3 名字的绑定(续1)
名字的声明与名字的绑定均需要有对应的存储空间,而存 储空间的对应方式,一个是静态的,一个是动态的。 声明时关心的是声明的作用域,即当一个名字被引用时, 在不同的作用域中与该名字的不同声明结合;名字和作用域是 静态的一对一关系。 绑定时关心的是绑定的生存期,即当一个名字在运行时被 实际分配的存储单元,名字与存储单元结合的这段时间被称为 绑定的生存期,显然此生存期应该和名字的生存期一致。 运行时名字与存储单元的结合可以是一对多的关系。 静 态 动 态 过程的定义 过程的活动 名字的声明 名字的绑定 声明的作用域 绑定的生存期 12 符号表 活动记录