中科大编译原理考研真题答案USTC
- 格式:doc
- 大小:52.30 KB
- 文档页数:5
中国科技大学继续教育学院2009-2010 学年度(第二学期)《编译原理》试题姓名_______ 班级__________ 学号__________一、单项选择题(本大题共20小题,每小题2分,共40分)1、语法分析器则可以发现源程序中的()。
A.语义错误B.语法和语义错误C.错误并校正D.语法错误2、一个文法所描述的语言是();描述一个语言的文法是()。
A.唯一的B.不唯一的C.可能唯一,可能不唯一A.唯一的B.不唯一的C.可能唯一,可能不唯一3、()和代码优化部分不是每个编译程序都必需的。
A.语法分析B.中间代码生成C.词法分析D.目标代码生成4.文法分为四种类型,即0型、1型、2型、3型。
其中2型文法是()。
A.短语文法B.正则文法C.上下文有关文法D.上下文无关文法5、语法分析的常用方法是()。
①自顶向下②自底向上③自左向右④自右向左A.①②③④B.①②C.③④D.①②③6、编译过程中,比较常见的中间语言有()。
①波兰表示②逆波兰表示③三元式④四元式⑤树形表示A.①③④B.②③④C.③④①⑤D.②③④⑤7、一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组()。
A.句子B.句型C.单词D.产生式8、一个句型中的最左()称为该句型的句柄。
A.短语B.简单短语C.素短语D.终结符号9、词法分析器用于识别()。
A.句子B.句型C.单词D.产生式10、采用自上而下分析,必须()。
A. 消除左递归B.消除右递归C. 消除回溯D.提取公共左因子11、用高级语言编写的程序经编译后产生的程序叫()。
A. 源程序B.目标程序C.连接程序D.解释程序12、文法 G[N]= ( {b} , {N , B} , N ,{N→b│bB ,B→bN} ),该文法所描述的语言是()A.L(G[N])={bi│i≥0}B.L(G[N])={b2i│i≥0}C.L(G[N])={b2i+1│i≥0}D.L(G[N])={b2i+1│i≥1}13、正规式 M 1 和 M 2 等价是指()。
编译原理试题及答案
编译原理是计算机科学中的一门重要课程,它涉及到程序设计语言的语法、语义分析以及编译器的设计与实现等内容。
下面我们将为大家提供一些编译原理的试题及答案,希望能够帮助大家更好地理解和掌握这门课程的知识。
1. 什么是编译原理?
编译原理是研究编译器的设计与实现的一门学科,它主要包括词法分析、语法分析、语义分析、中间代码生成、代码优化和代码生成等内容。
2. 什么是词法分析?
词法分析是编译原理中的一个重要内容,它主要负责将源程序转换成一个个的单词符号,也就是词法单元。
3. 什么是语法分析?
语法分析是编译原理中的另一个重要内容,它主要负责将词法单元序列转换成抽象语法树,以便进行后续的语义分析和中间代码生成。
4. 什么是语义分析?
语义分析是编译原理中的一个关键环节,它主要负责对源程序进行语义检查,以确保程序的正确性和合法性。
5. 什么是中间代码生成?
中间代码生成是编译原理中的一个重要环节,它主要负责将源程序转换成一种中间形式的代码,以便进行后续的代码优化和代码生成。
6. 什么是代码优化?
代码优化是编译原理中的一个关键环节,它主要负责对中间代码进行优化,以提高程序的执行效率和减少资源消耗。
7. 什么是代码生成?
代码生成是编译原理中的最后一个环节,它主要负责将优化后的中间代码转换成目标机器代码,以便计算机能够执行。
以上就是关于编译原理的一些试题及答案,希望能够帮助大家更好地理解和掌握这门课程的知识。
如果大家对编译原理还有其他疑问,可以随时向我们提问,我们将竭诚为大家解答。
编译原理考研题库及答案编译原理考研题库及答案编译原理是计算机科学与技术领域中的一门重要课程,也是计算机专业研究生考试中的一项必考科目。
为了更好地备战考研,我们需要充分了解编译原理考研题库及答案。
本文将对编译原理考研题库及答案进行介绍和分析,帮助考生更好地掌握这门课程。
一、词法分析题词法分析是编译原理中的重要内容,也是考研题库中常见的题型之一。
下面是一道典型的词法分析题:题目:对于以下C语言代码片段,请给出相应的词法单元序列。
```cint a = 10;float b = 3.14;char c = 'A';```答案:词法单元序列为:int、a、=、10、;、float、b、=、3.14、;、char、c、=、'A'、;。
二、语法分析题语法分析是编译原理中另一个重要的内容,也是考研题库中常见的题型之一。
下面是一道典型的语法分析题:题目:给定以下文法G:```S -> aABA -> b | εB -> c | ε```请问对于输入串"abc",是否属于文法G的语言?答案:对于输入串"abc",可以通过以下推导过程验证是否属于文法G的语言:```S -> aAB -> aAcB -> abcB -> abc```由于推导过程可以得到输入串"abc",因此"abc"属于文法G的语言。
三、语义分析题语义分析是编译原理中的另一个重要内容,也是考研题库中常见的题型之一。
下面是一道典型的语义分析题:题目:给定以下C语言代码片段,请写出相应的语义动作。
```cint a = 10;float b = 3.14;float c = a + b;```答案:相应的语义动作为:```1. 将10存入变量a中。
2. 将3.14存入变量b中。
3. 将变量a和变量b相加的结果存入变量c中。
本书习题可分为思考题和必做题,这里仅给出必做题的参考答案。
习题11-1至1-11均为思考题。
习题22-1至2-14均为思考题。
习题33-1至3-13均为思考题。
习题44-1至4-4均为思考题。
4-5 解:上下文有关文法(1型文法),产生的语言L(G){=a i b i c i | i≥1,i为整数} 4-6 解:3型文法,L(G)={a i | i≥1,i为奇数}4-7 解:2型文法,L(G)={a i b i | i≥1,i为整数}4-8 解:1型文法,L(G)={a i b i c i | i≥1,i为整数}4-9 解:1. 最左推导最右推导S⇒ (A) ⇒ (B) ⇒(SdB) S⇒ (A) ⇒ (B) ⇒ (SdB)⇒ ((A)dB) ⇒ ((B)dB) ⇒ (SdS) ⇒ (Sda)⇒ ((S)dB) ⇒ ((b)dB) ⇒ ((A)da ⇒ ((B)da)⇒ ((b)dS) ⇒ ((b)da) ⇒ ((s)da⇒ ((b)da)2. 语法树4-10解:1. 因为存在推导S ⇒ SbF ⇒ SbP ⇒ Sbc ⇒ Fbc ⇒ FaPbc所以FaPbc是文法G (S) 的一个句型。
2. 语法树4-11解:因为串aaabaa可有下列两棵不同的语法树所以文法G (S)是二义文法。
4-12解:因为串i (*可有下列两棵不同的语法树4-13解:假定所设计的语言面向的机器为一般通用机。
按照题目给出的问题,如果不考虑输入和输出语句,那么所要设计的语言仅包含字符串数据类型和赋值语句。
语言设计如下:<程序>→<分程序><分程序>→begin<语句说明表>;<执行语句>end<说明语句表>→<说明语句>|<说明语句表>;<说明语句><说明语句>→<变量说明><变量说明>→string<变量表>说明:string是变量的类型,表示变量为字符串。
《编译原理》考试试题及答案(汇总)一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分)1.编译程序是对高级语言程序的解释执行。
(× )2.一个有限状态自动机中,有且仅有一个唯一的终态.(×)3.一个算符优先文法可能不存在算符优先函数与之对应。
(√ )4.语法分析时必须先消除文法中的左递归。
(×)5.LR分析法在自左至右扫描输入串时就能发现错误,但不能准确地指出出错地点。
(√)6.逆波兰表示法表示表达式时无须使用括号。
(√ )7.静态数组的存储空间可以在编译时确定。
(×)8.进行代码优化时应着重考虑循环的代码优化,这对提高目标代码的效率将起更大作用。
(×) 9.两个正规集相等的必要条件是他们对应的正规式等价。
(× )10.一个语义子程序描述了一个文法所对应的翻译工作。
(×)二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共40分) 1.词法分析器的输出结果是_____。
A.( ) 单词的种别编码B.( )单词在符号表中的位置C.( )单词的种别编码和自身值D.()单词自身值2.正规式M 1 和M 2 等价是指_____。
A.() M1和M2的状态数相等B.( ) M1和M2的有向边条数相等C.( )M1和M2所识别的语言集相等D.( ) M1和M2状态数和有向边条数相等3.文法G:S→xSx|y所识别的语言是_____.A.()xyx B.()(xyx)*C.( ) xnyxn(n≥0) D.()x*yx* 4.如果文法G是无二义的,则它的任何句子α_____。
A.( )最左推导和最右推导对应的语法树必定相同B.() 最左推导和最右推导对应的语法树可能不同C.()最左推导和最右推导必定相同D.()可能存在两个不同的最左推导,但它们对应的语法树相同5.构造编译程序应掌握______.A.( )源程序B.()目标语言C.()编译方法D.( )以上三项都是6.四元式之间的联系是通过_____实现的。
编译原理答案1-2《编译原理习题精选》第一章形式语言基础1.1文法与语言的形式定义1.2推导树与二义性文法1.3综合题第二章有限状态自动机和词法分析2.1有限状态自动机2.2词法分析2.3综合题第三章自顶向下句法分析3.1下推自动机与句法分析3.2LL(1)文法及其句法分析方法3.3递归子程序句法分析方法3.4综合题第四章自底向上句法分析4.1优先文法及其句法分析方法4.2LR(0)、SLR(1)文法及其句法分析方法4.3LR(1)、LALR(1)文法4.4综合题第五章句法制导翻译方法与中间代码生成5.1中间代码5.2属性文法与句法制导翻译5.3综合题第六章运行时存储和环境管理6.1存储分配6.2环境建立与管理6.3形实参数通讯6.4综合题第七章代码优化7.1基本块内代码优化7.2全局优化7.3综合题第八章综合习题精选第一章形式语言基础§1.1文法与语言的形式定义一、要点提示1.文法G是一个四元组G=(VT,VN,P,)其中:VT是非空有限的终结符集合,VN是非空有限的非终结符集合,P是非空有限产生式集合,VN是文法G的开始符号,集合P中的产生式的一般形式是(或::=),其中''是元符号,称为产生式的左部,称为产生式的右部。
Chomky根据产生式的不同形式,将文法分为四类。
分别是:0型文法(又称短语结构文法);1型文法(又称上下文有关文法);2型文法(又称上下文无关文法);3型文法(又称正则文法);编译程序所涉及的主要是2型与3型文法,分别用于句法分析与词法分析。
2型文法的一般形式为,VN,(VN∪VT)某。
3型文法的一般形式为a或a,、VN,aVT(或a,a)。
2.文法G[]中,是文法的开始符号,对某,若(VN∪VT)某,则称是G的一个句型,若VT某,则称是G的一个句子。
文法G[]的句子的全体所组成的集合称为G[]的语言,记作L(G[])={w|某w,wVT某}。
3.从实用的角度出发,在编译原理中所讨论的文法是被简化了的文法,即:a)文法中不含形如的产生式。
中国科学技术大学一九九一年招收硕士学位研究生入学考试试题试题名称:编译原理和操作系统编译原理部分(50分)一.填空(10分)1.Chomsky定义的四种形式语言文法是(1)______文法(又称_____文法)(2)______文法(又称_____文法)(3)______文法(又称_____文法)(4)______文法(又称_____文法)2.程序设计语言的语法分析方法可分为两大类,____________和_____________;其中,前者采用__________分析方法;后者采用_______或_______分析方法;3.逻辑表达式的计算有_________和_________两种方式,选择哪种计算方式取决于_________________.4.在一遍扫描的编译程序中,我们必须采取________手段来解决转移目标不明确的困难.5.Lex是用于___________的工具;Yacc是用于___________的工具.6.根据连接在文法符号上的属性间的依赖关系,属性被分为____________ ,_____________互不相交的二大类.7.参数传递方式有________ , __________ , ___________等几种.二.简答题(4分)1.整数和实数的算术运算是可兼容的,为什么编译器要区分它们?2.什么是代码优化?举出至少三种用于代码优化的手段.三.下列文法是否属于LR(1),若是,则给出分析表;若不是,指出原因(分析过程中可能遇到的麻烦),并考虑能否使其成为LR(1)文法,如何做?为什么? (10分)S ? ASES | AS | fE ? Ea | EbA ? c | d四.说明Pascal语言和C语言的变量定义对编译程序实现的影响.(8分)a, b, c : integer ;AR V : 的变量说明Pascal : 例C的变量说明: int a, b, c;五.Pascal程序设计语言不允许越过父过程或函数调用其中的子过程或函数,例如:procedure Aprocedure B┇procedure Cprocedure D┇在过程D中不允许调用过程B,试解释其原因(8分).六.给出将二进制数直接翻译成十六进制数的翻译方案.假定属性hex用于存放十六进制位串,串并置采用算符‘||'.二进制数文法如下:S ? BS | BB ? 0 | 1操作系统部分(50分)一.填空(每空1分,共15分)1.操作系统的基本特征是_________和__________.2.______________是用户和外设、外存之间的接口.3.产生死锁的原因是___________和____________.4.有一个530字的程序.考虑如下访问内存的逻辑地址序列:10,11,104,107,73,526,185,245,246,309,458,364,442,247,248,434.假定页面大小为100字,则其对应的页面走向序列为:_______________________________________________________.如每个进程最多可分给300字内存空间,且采用LRU算法,则其缺页次数为________次,其缺页率为_________.5.段表中设“改变位”的目的是____________________________________.6.为了_________________________而引入多道程序设计.7.逻辑设备是___________________________________._____________________________,和___________________的作用是JCB8.它由_____________________建立.9.临界资源是__________________________________________.二.选择(四择一,每题1分,共5分)1.软件共享的必要性是为了( ).A. 节约内存空间B. 缩短运行时间C. A和CC. 减少内外存对换信息量2.请求页面存储管理采用( ).A.动态定位,静态分配,静态链接B.动态定位,动态分配,动态链接C.动态定位,动态分配,静态链接D.静态定位,静态分配,静态链接3.用户的虚拟CPU功能( ).A.和物理CPU完全一样B.可以执行所有机器指令以及软件“指令”C.不能执行特权指令D.可以执行除特权以外的机器指令以及软件“指令”4.虚拟存储管理中,段(或页)表需要( ),而快表中可以没有它.A.中断位B.引用位D.B 和 CC.改变位5.OPEN操作的目的是为了( ).A.将制定的文件记录复制到内存中B.将制定的文件复制到内存中C.将制定的文件说明复制到内存中D.将制定的共享文件复制到内存中三.判断并改正(前4题各1分,第5题6分,共10分)1.( ) 虚拟存储器空间的大小由外存容量决定.2.( ) 在生产速度和消费速度完全相同时,只要用单缓冲就可以完全并行工作.3.( ) 进程间的同步与互斥工具也是一种通讯工具.4.( ) 虚拟设备和物理设备一一对应.?a,…和一个无穷序列,n…,,甲进程序…个环形缓冲区设有5.n1,2,3,n1列顺序逐个的把信息写入环形缓冲区中,而乙进程则逐个的把缓冲区信息读出.请叙述甲、乙二进程的相互制约关系(1).(2)下列用P、V操作表示的同步算法有何错误.初值 := 0 ; := n;SS21甲进程乙进程)P( V() 11读出┇┇写入P() V()S2.、PV操作写出正确的同步算法(3)用四.(10分)1.叙述请求页面存储管理所需要的数据结构、软件支持和硬件支持.2.叙述(或加说明画出)执行一条访内指令的过程.五.(10分)P、,有二组缓冲区: 设有四个进程、、PPP3421 : 由7个缓冲区组成;: 由100个缓冲区组成.QP中送初始信息;的功能: 不断的往、12PQQ的空缓冲区中;满缓冲区的信息加工后存入的功能: 不断的取321Q满缓冲区的信息并打印不断的取. 的功能: 2请:(1)列出过程间的相互制约关系;(2)设置必要的信号量;(3)用P、V操作设计这四个进程的同步算法.)试题完(。
编译原理课程测试第六套卷(附解析)1、(10分)用正规式表示字母表{a, b}上a不会相邻的所有句子的集合,并给出接受该语言的最简DFA。
2、(15分)(1)为下面文法构造规范LR(1)分析表,画出像教材上图3.19这样的状态转换图就可以了。
S →V = E | EV →*E | idE →V(2)上述状态转换图有同心项目集吗?若有,合并同心项目集后是否会出现动作冲突?3、(10分)为字母表{0, 1}上的回文数集合写一个LR文法;若你认为该语言不存在LR文法,则说明理由。
(注:一个数字串,从左向右读和从右向左读都一样时,称它为回文数。
)4、(10分)下面的翻译方案计算0和1的串的值(解释为二进制的正整数)。
B →B1 0 { B.val = B1.val ⨯ 2 }B →B1 1 { B.val = B1.val⨯ 2 + 1 }B → 1 { B.val = 1 }重写该翻译方案,使得它基础文法没有左递归,并且为整个输入串计算的B.val和原来的一样。
5、(10分)若布尔表达式有异或xor(exclusive-or)运算(异或运算的结果为真,当且仅当它的一个运算对象为真),请按照教材上表7.4的风格给出异或运算的语义规则。
(备注:该题目设计得不好。
)6、(5分)在面向对象语言中,编译器给每个类建立虚方法表,如教材上图11.3和图11.4那样。
请简要说明,为什么编译器给每个类仅建立虚方法表,而不是建立所有方法的方法表。
7、(15分)C语言和Java语言的数组声明和数组元素引用的语法形式同教材上7.3.3节和7.3.4节讨论的不一样,例如float A[10][20]和A[i+1][j-1],并且每一维的下界都是0。
若适应这种情况的赋值语句的文法如下:S →L := EE →E + E | (E ) | LL →L [E ] | id(1)重新设计教材上7.3.3节数组元素的地址计算公式,以方便编译器产生数组元素地址计算的中间代码。
编译原理课程测试第五套卷(附解析)1、(10分)用子集构造法给出由下面的NFA 得到的DFA 的转换表2、(20分)(1)通过构造识别活前缀的DFA 和构造分析表,来证明文法E → E + id | id 是SLR(1)文法。
(2)下面左右两个文法都和(1)的文法等价 E → E + M id | id E → M E + id | id M → ε M → ε请指出其中有几个文法不是LR(1)文法,并给出它们不是LR(1)文法的理由。
3、(10分)下面是C 语言两个函数f 和g 的概略(它们不再有其它的局部变量): int f (int x) { int i; …return i +1; … } int g (int y) {int j; … f (j +1); … }请按照教材上例6.5中图6.13的形式,画出函数g 调用f ,f 的函数体正在执行时,活动记录栈的内容及相关信息,并按图6.12左侧箭头方式画出控制链。
假定函数返回值是通过寄存器传递的。
4、(10分)C 语言函数f 的定义如下: int f (int x, int *py, int **ppz){**ppz +=1; *py +=2; x +=3; return x + *py + **ppz; }变量a 是指向b 的指针,变量b 是指向c 的指针,c 是整型变量并且当前值是4。
那么执行f (c, b, a)的返回值是多少? 5、(10分)Java 语言的实现通常把对象和数组都分配在堆上,把指向它们的指针分配在栈上,依靠运行时的垃圾收集器来回收堆上那些从栈不可达的空间(垃圾)。
这种方式提高了语言的安全性,但是增加了运行开销。
编译时能否采用一些技术,以降低垃圾收集所占运行开销?概述你的方案。
6、(5分)在面向对象语言中,编译器给每个对象分配空间的第1个域存放虚方法表的指针。
是否可以把虚方法表指针作为最后1个域而不是第1个域?请简要说明理由。
华中科技大学武昌分校《编译原理》试卷A专业班级:_________学号:_________姓名:__________总分一、单项选择题(共10小题,每小题2分) (题分 20分)1.语言是A .句子的集合B .产生式的集合C .符号串的集合D .句型的集合 2.编译程序前三个阶段完成的工作是 A .词法分析、语法分析和代码优化 B .代码生成、代码优化和词法分析C .词法分析、语法分析、语义分析和中间代码生成D .词法分析、语法分析和代码优化3.一个句型中称为句柄的是该句型的最左A .非终结符号B .短语C .句子D .直接短语 4.下推自动机识别的语言是A .0型语言B .1型语言C .2型语言D .3型语言5.扫描器所完成的任务是从字符串形式的源程序中识别出一个个具有独立含义的最小语法单位即A . 字符B .单词C .句子D .句型 6.对应Chomsky 四种文法的四种语言之间的关系是 A .L 0⊂L 1⊂L 2⊂L 3 B .L 3⊂L 2⊂L 1⊂L 0 C .L 3=L 2⊂L 1⊂L 0 D .L 0⊂L 1⊂L 2=L 3 7.词法分析的任务是A .识别单词B .分析句子的含义C .识别句子D .生成目标代码 8.常用的中间代码形式不含A .三元式B .四元式C .逆波兰式D .语法树 9. 代码优化的目的是A .节省时间B .节省空间C .节省时间和空间D .把编译程序进行等价交换装 订 线得分10.代码生成阶段的主要任务是 A .把高级语言翻译成汇编语言B .把高级语言翻译成机器语言C .把中间代码变换成依赖具体机器的目标代码D .把汇编语言翻译成机器语言二、填空题(本大题共5小题,每小题2分)(题分 10分)1.编译程序首先要识别出源程序中每个( ),然后再分析每个( )并翻译其意义。
2.编译器常用的语法分析方法有( )和( )两种。
3.通常把编译过程分为分析前端与综合后端两大阶段。
2003年编译原理考研真题1.(10分)叙述下面的正规式描述的语言,并画出接受该语言的最简DFA的状态转换图。
( 1 | 01 )* 0*2.(10分)某语言有两种语句:S 过程调用语句| 下标变量赋值语句过程调用语句的形式是:id(id, id, …, id),即过程名加置于圆括号中的变量表。
下标变量赋值语句的形式是:id(id, id, …, id):= id(id, id, …, id),赋值号两边都是数组名加置于圆括号中的变量表。
(a) 请你完成过程调用语句和下标变量赋值语句的文法设计,得到一个以语句S为开始符号的LR(1)文法。
不得超过6个产生式,不需要给出你的文法是LR(1)文法的证明。
(b) 如果想在LR分析的同时完成语义分析和中间代码生成,基于你的文法有什么困难?3.(10分)(a) 为下面的算术表达式文法写一个语法制导的翻译方案,它将每个子表达式E的符号(即值大于零还是小于零)记录在属性E.sign中(属性值分别用POS 或NEG表示)。
你可以假定所有的整数都不为零,这样就不用担心零的符号。
E E *E | +E | E | unsigned_integer(b) 为上面的表达式产生栈机器代码。
代码执行后,表达式的值留在栈上。
你自己设计所需的栈机器指令,并写清楚指令的含义。
4.(10分)在C语言的教材上,称&为XXX运算符,&a为变量a的XXX。
但是教材上没有说明表达式&a的类型是什么。
另外,教材上说,数组名代表数组的首XXX,但是也没有说明这个值的类型。
它们所带来的一个问题是,如果a 是一个数组名,那么表达式a和&a的值都是数组a的首XXX,但是它们的使用是有区别的,初学时很难掌握。
下面我们给出4个C文件,请你根据编译报错信息和程序运行结果,写出表达式a和&a的类型表达式。
若你能掌握它们的类型,那么它们的区别就清楚了,你也就会正确使用它们了。
2003年真题部分答案1.该正规式描述的语言是,所有不含子串001的0和1的串。
2.(a) S → Call | AssignCall → id (id_list)Assign → id (id_list) := id (id_list)id_list → id_list, id | id(b) 由于过程参数和下标表达式的中间代码是不一样的,在id 和id_list, id 向id_list 归约时,不知按哪种方式处理。
3.(a) E → E 1 *E 2{if E 1.sign = E 2.sign then E .sign := POS else E .sign := NEG } E → +E 1 { E .sign := E 1.sign }E → -E 1 {if E 1.sign = POS then E .sign := NEG else E .sign := POS}E → unsigned _integer {E .sign := POS}(b) 指令的解释如下:PUSH 值: 将值压栈NEG : 将栈顶值取出,计算其相反数,把结果压入栈MUL : 将栈顶和次栈顶的值取出,将它们相乘,把结果压栈 产生代码的翻译方案如下:E → E 1 *E 2 { emit(MUL)}E → +E 1 { }E → -E 1 {emit(…NEG ‟)}E → unsigned _integer {emit(…PUSH ‟ unsigned _integer .lexval )}4.对一个t 类型的数组a[ i 1 ][ i 2 ]…[ i n ]来说,表达式a 的类型是: pointer(array(0.. i 2 –1, … array(0.. i n –1, t)…))而表达式&a 的类型是:pointer(array(0.. i 1 –1, … array(0.. i n –1, t)…))2004年真题部分答案1.对活前缀ac 和bc 有效的项目集分别为{[A → c ·, d ], [B → c ·, e ]}和{[A → c ·, e ], [B → c ·, d ]},它们是同心的。
2003年真题部分答案1.该正规式描述的语言是,所有不含子串001的0和1的串。
2.(a) S → Call | AssignCall → id (id_list)Assign → id (id_list) := id (id_list)id_list → id_list, id | id(b) 由于过程参数和下标表达式的中间代码是不一样的,在id 和id_list, id 向id_list 归约时,不知按哪种方式处理。
3.(a) E → E 1 *E 2{if E 1.sign = E 2.sign then E .sign := POS else E .sign := NEG } E → +E 1 { E .sign := E 1.sign }E → -E 1 {if E 1.sign = POS then E .sign := NEG else E .sign := POS}E → unsigned _integer {E .sign := POS}(b) 指令的解释如下:PUSH 值: 将值压栈NEG : 将栈顶值取出,计算其相反数,把结果压入栈MUL : 将栈顶和次栈顶的值取出,将它们相乘,把结果压栈 产生代码的翻译方案如下:E → E 1 *E 2 { emit(MUL)}E → +E 1 { }E → -E 1 {emit(…NEG ‟)}E → unsigned _integer {emit(…PUSH ‟ unsigned _integer .lexval )}4.对一个t 类型的数组a[ i 1 ][ i 2 ]…[ i n ]来说,表达式a 的类型是: pointer(array(0.. i 2 –1, … array(0.. i n –1, t)…))而表达式&a 的类型是:pointer(array(0.. i 1 –1, … array(0.. i n –1, t)…))2004年真题部分答案1.对活前缀ac 和bc 有效的项目集分别为{[A → c ·, d ], [B → c ·, e ]}和{[A → c ·, e ], [B → c ·, d ]},它们是同心的。
合并后变成{[A →c ·, d /e ], [B →c ·, d /e ]},产生归约-归约冲突。
因此该文法不是LALR(1)文法。
2. S → L . R S. val := L. val + R. val3 start 0 0 1 . 1 0 1 2S → L S. val := L. valL → L1 B L. val := L1. val⨯2 + B. valL → B L. val := B. valR → B R1R. val := (R1. val + B. val)/2R → B R. val := B. val/2B → 0 B. val := 0B → 1 B. val := 13.C语言对除结构类型以外的所有类型使用结构等价,而对结构类型使用名字等价。
第1个函数能通过结构等价的检查,而第2个函数不能通过名字等价的检查。
4.在结构的字节数较少时,则为该结构各域分别产生值传送指令。
在结构的字节数较多时,则根据值传送的源地址(b的地址)、目的地址(a 的地址)和该结构的长字数,产生简洁的重复传送指令,以提高效率。
2005年真题部分答案1. D → T L ;T → int | floatL → L, id | id2.给非终结符E一个综合属性v,其值可取lvalue或rvalue,分别表示E是左值表达式和右值表达式,那么语法制导定义如下(无输出则表示无错):E'→ EE → E1 + E2 E.v := rvalueE → ( E1 ) E.v := E1.vE → E1 ++ if E1.v = rvalue then printf(“invalid lvalue in increment”);E.v := rvalueE →id E.v := lvalueE →num E.v := rvalue3.历史上,C语言中有参函数定义的一般形式是:类型标识符函数名(形式参数列表)形式参数声明对于这种形式的声明,C语言编译器是不做实在参数和形式参数的个数和类型是否一致的检查的。
如本题中函数f1的声明是这种形式。
现在,ANSI新标准允许使用另一种方法声明形式参数,即在函数名后的括号中列出形式参数的同时,声明形式参数的类型。
本题中函数f2的声明是这种形式。
C语言编译器对于这种形式的函数声明是要进行实在参数和形式参数的个数和类型是否一致的检查的。
因此,在编译函数调用f2(10.0)时,会把浮点数10.0转换成整数10,并产生将整数10压栈的指令。
因此函数调用f2(10.0)的结果是100。
而在编译函数调用f1(10.0)时,会把浮点数10.0转换成双精度型(参见《编译原理习题精选》第5.8题),并产生将该双精度型数压栈的指令。
双精度数占8个字节。
它低地址的4个字节看成整数时正好是0。
因此函数调用f1(10.0)的结果是0(参见/~yiyun 上2003年编译原理试题第7题)。
4.优化时,通过复写转播和常量合并等会发现,对i 和j 的赋值都是无用赋值,可以删除,从而对i 和j 的存储分配没有必要。
2006年真题部分答案1.对于LL(1)分析方法,两个文法都不合适,左边的文法是左递归的,右边文法有公共左因子。
修改右边文法来适应LL(1)分析的要求,相对来说比较容易一些,因为只要提公共左因子。
对于LR 的各种分析方法,两个文法都适用,但是采用左边的文法更好一些。
用左边的文法时,分析器一边扫描一边归约,占用分析栈的空间较少。
而用右边的文法时,分析器要把所有的标识符都移进栈后才进行归约,因此使用较多的分析栈空间。
(结合语法制导的翻译,采用左边的文法还有好处:便于确定T 的类型属性在栈中的位置。
)2.用SLR(1)文法能定义的语言集合 ⊂ 用LALR(1)文法能定义的语言集合,用LALR(1)文法能定义的语言集合 ⊂ 用LR(1)文法能定义的语言集合。
3. 变量名 偏移 字节数c -1(%ebp) 1p -8(%ebp) 4ch -9(%ebp) 1m -24(%ebp) 124.buf 定义在文件link1.c 中,使用在文件link2.c 中。
由于:∙ 目标文件连接时并不检查名字的类型,因此,虽然两个文件对buf 的类型持不同的观点,但仍然能连接成目标程序;∙ 目标文件连接时,是让不同文件中的同一名字的地址相同。
因此,运行时,由于buf 的内容是100,取*buf 的值就是取地址100的内容。
该地址不在用户数据区内,因此报错。
2007年真题部分答案1、(10分)由正规式b*(abb*)*(a| ε)定义的语言是字母表{a, b}上不含子串aa 的所有串的集合。
最简DFA 如下:2、(10分)先给出接受该文法活前缀的DFA 如下:start 1 a b b 2I 0和I 3都只有移进项目,肯定不会引起冲突;I 2和I 4都无移进项目并仅含一个归约项目,也肯定不会引起冲突;在I 1中,E '的后继符号只有$,同第2个项目的展望符号“+”不一样,因此I 1也肯定不会引起冲突。
由此可以断定该文法是SLR(1)的。
3、(10分)语法制导定义如下。
S → id := E { S.type := if (lookup (id.entry) = bool and E.type = bool) or (lookup (id.entry) = int and E.type = int)then type_ok else type_error }E → E 1 and E 2 { E.type := if E 1.type = bool and E 2.type = bool then bool else type_error }E → E 1 + E 2 { E.type := if E 1.type = int and E 2.type = int then int else type_error }E → E 1 = E 2 { E.type := if E 1.type = int and E 2.type = int then bool else type_error }E → id { E.type := lookup (id.entry) }4、(5分)对于函数f1,局部变量x 声明的作用域是整个函数体,导致在函数体中不可能访问形式参数x 。
由于这是一个合法的C 语言函数,因此编译器给出警告错误。
对于函数f2,由于局部变量x 的作用域只是函数体的一部分,不会出现上述问题,因而编译器不报错。
5、(5分)使用非优化编译时,变量s, pi, r 在局部数据区都分配4个字节的空间。
使用优化编译时,由于复写传播,pi*r*r 变成3.14159*r*r ,pi=3.14159成为无用赋值而删去,函数中不再有pi 的引用,因此不必为pi 分配空间。
类似地,s=3.14159*r*r 也是一个无用赋值(表达式要计算,但赋值是无用的),也不必为s 分配空间。
这样,和非优化情况相比,局部数据区少了8个字节, 因此r 的地址向高地址方向移动了8个字节。
E ' →·EE →·E + idE →·idI 0E ' → E · E → E ·+ id I 1 E → id ·I 2 E id+ E → E +·id I 3 E → E + id · I 4id2008年真题部分答案1、正规式b *a(bb *a) *b *体现的特点是,每个a 的左边都有若干b ,除非a 是第一个字母。
该正规式定义的语言是:至少含一个a ,但不含子串aa 的所有a 和b 的串集。
最简DFA 如下:2、 消除左递归后的文法如下:B → 1 B 'B ' → 0 B ' | 1 B ' | ε相应的翻译方案如下:B → 1 {B '.i := 1 }B '{B.val := B '.val }B ' → 0 {B '1.i := B '.i ⨯ 2 } B '1 {B '.val := B '1.val }| 1 {B '1.i := B '.i ⨯ 2 +1} B '1 {B '.val := B '1.val }| ε {B '.val := B '.i }3、表达式&i 的类型表达式是pointer(long),表达式&i -&j 的类型表达式是long 。