以编译方式翻译C/C++源程序的过程中,类型检查在( )阶段处理。
A. 词法分析
B. 语义分析
C. 语法分析
D. 目标代码生成
正确答案是 B。
解析
本题考查的是编译器工作过程。
A选项词法分析阶段处理的错误:非法字符、单词拼写错误等。与题意不符。
B选项静态语义分析阶段(即语义分析阶段)处理的错误:运算符与运算对象类型不合法等错误。本题选择B项语义错误。
C选项语法分析阶段处理的错误:标点符号错误、表达式中缺少操作数、括号不匹配等有关语言结构上的错误。与题意不符。
D选项目标代码生成(执行阶段)处理的错误:动态语义错误,包括陷入死循环、变量取零时做除数、引用数组元素下标越界等错误。与题意不符。
综上所述,本题选B。
下图所示的二叉树表示的算术表达式是( )(其中的*、/、一表示乘、除、减运算)。
A. a*b/c- d
B. a*b/(c-d)
C. a*(b/c- d)
D. a*(b-c/d)
正确答案是 C。
解析
本题考查算术表达式相关问题。
算术表达式与树的中缀表达式类似,按照左根右的顺序,其中在算术表达式中符号位表示根。
根据该二叉树的表示,我们可以得知*为该树的总根,将左子树和右子树分隔开来。左边部分是a,右边部分是以-作为右子树的总根,左边是b/c,右边是d综合得出算术表达式应该为a*(b/c-d),答案选C。
某有限自动机的状态转换图如下图所示,该自动机可识别( )。
A. 1001
B. 1100
C. 1010
D. 0101
正确答案是 B。
解析
本题考查的是有限自动机相关知识。
A选项从s0出发,1001到达s1,没有到达终态s2,不能被自动机识别。
B选项从s0出发,1100成功到达终态s2,可以被自动机识别。本题选择B选项。
C选项从s0出发,1010到达s0,没有到达终态s2,不能被自动机识别。
D选项从s0出发,0101到达s1,没有到达终态s2,不能被自动机识别。
对于后缀表达式abc-+d*(其中,一、+、*表示二元算术运算减、加、乘),与该后缀式等价的语法树为( )。
正确答案是 B。
解析
本题考查程序语言相关知识。对题中ABCD4个二叉树进行后序遍历,得出结果与该后缀表达式一致的则为与其等价的语法树。答案为B。
A为:ab-c+d*
B为:abc-+d*
C为:ab+cd-*
D为:abcd-+*
下图所示为一个不确定有限自动机(NFA)的状态转换图。该NFA识别的字符串集合可用正规式( )描述。
A. ab*a
B. (ab)*a
C. a*ba
D. a(ba)*
正确答案是 A。
解析
本题考查有限自动机相关知识。根据图中展示,其正规式应以a开头,a结尾,b在中间可以出现0次或多次,所以是ab*a,答案为A。
B项是ab必须一起出现,C项b仅出现1次,D项是ba连续出现。都不符合。
语法指导翻译是一种( )方法。
A. 动态语义分析
B. 中间代码优化
C. 静态语义分析
D. 目标代码优化
正确答案是 C。
解析
本题考查程序语言基础知识。翻译的任务:首先是语义分析和正确性检查,若正确,则翻译成中间代码或目标代码。其基本思想是,根据翻译的需要设置文法符号的属性,以描述语法结构的语义。例如,一个变量的属性有类型,层次,存储地址等。表达式的属性有类型,值等。属性值的计算和产生式相联系。随着语法分析的进行,执行属性值的计算,完成语义分析和翻译的任务。
动态语义分析指运行期间的语义问题,如0作为除数进行运算。
所谓代码优化是指对程序代码进行等价(指不改变程序的运行结果)变换。程序代码可以是中间代码(如四元式代码),也可以是目标代码。
下面二叉树表示的简单算术表达式为( )。
A. 10*20+30-40
B. 10* (20+30-40)
C. 10* (20+30) -40
D. 10*20+ (30-40)
正确答案是 C。
解析
本题考查程序语言基础-二叉树的相关知识。本题由二叉树可知,表达式最后计算的为一,其次为*,最先做的为+,只有C选项的表达式是先加法后乘法最后减法。
A是先乘再加最后减,B项先加法后减法最后乘法,D是先乘法和减法最后加法。
也可将A、B、C、D四个选项对应的二叉树全部画出,找出相符的选项。
在程序运行过程中,( )时涉及整型数据转换为浮点型数据的操作。
A. 将浮点型变量赋值给整型变量
B. 将整型常量赋值给整型变量
C. 将整型变量与浮点型变量相加
D. 将浮点型常量与浮点型变量相加
正确答案是 C。
解析
本题考查程序语言基础知识。本题A选项需要将浮点数转换为整型数;B选项和D选项同类型数据,不需要转换数据类型;C选项需要将整型数转换为浮点数再计算。因此本题选择C选项。
乔姆斯基(Chomsky)将文法分为4种类型,程序设计语言的大多数语法现象可用其中的( )描述。
A. 上下文有关文法
B. 上下文无关文法
C. 正规文法
D. 短语结构文法
正确答案是 B。
解析
上下文无关文法:形式语言理论中一种重要的变换文法,用来描述上下文无关语言,在乔姆斯基分层中称为2型文法。由于程序设计语言的语法基本上都是上下文无关文法,因此应用十分广泛。
在以阶段划分的编译过程中,判断程序语句的形式是否正确属于( )阶段的工作。
A. 词法分析
B. 语法分析
C. 语义分析
D. 代码生成
正确答案是 B。
解析
检查单个词是否正确,属于词法阶段的工作。而识别判断程序语句形式是否正确属于语法分析的工作。
"单选题
某确定的有限自动机(DFA)的状态转换图如下图所示(A是初态,D、E是终态),则该DFA能识别( )。
A. 00110
B. 10101
C. 11100
D. 11001
正确答案是 C。
解析
选项中,只有C选项的字符串能被DFA解析。解析路径为:ACEEBDD。
下图为一个表达式的语法树,该表达式的后缀形式为( )。
A. x 5 y + * a / b -
B. x 5 y a b * + /-
C. -/ * + × 5 y a b
D. x 5 + *y + a/b-
正确答案是 A。
解析
要得到题目中的表达式语法树后缀形式,只需要对树进行后序遍历即可,后序遍历的结果为:x5y+*a/b-。
编译过程中进行的语法分析主要是分析( )。
A. 源程序中的标识符是否合法
B. 程序语句的含义是否合法
C. 程序语句的结构是否合法
D. 表达式的类型是否合法
正确答案是 C。
解析
语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等。语法分析程序判断源程序在结构上是否正确。源程序的结构由上下文无关文法描述。
某确定的有限自动机(DFA)的状态转换图如下图所示(0是初态,4是终态),则该DFA能识别( )。
A. aaab
B. abab
C. bbba
D. abba
正确答案是 A。
解析
B项从0到1然后走不了了,C项在3状态结束,不对;D项也只到1状态。
将高级语言源程序翻译为可在计算机上执行的形式有多种不同的方式,其中( )。
A. 编译方式和解释方式都生成逻辑上与源程序等价的目标程序
B. 编译方式和解释方式都不生成逻辑上与源程序等价的目标程序
C. 编译方式生成逻辑上与源程序等价的目标程序,解释方式不生成
D. 解释方式生成逻辑上与源程序等价的目标程序,编译方式不生成
正确答案是 C。
解析
本题考查程序语言基础知识。编译语言是一种以编译器来实现的编程语言。它不像直译语言一样,由解释器将代码一句一句运行,而是以编译器,先将代码编译为机器码,再加以运行。将某一种程序设计语言写的程序翻译成等价的另一种语言的程序,称之为编译程序。
由字符a、b构成的字符串中,若每个a后至少跟一个b,则该字符串集合可用正规式表示为( )。
A. (blab)*
B. (ab*)*
C. (a*b*)*
D. (alb)*
正确答案是 A。
解析
A的方式可以保证a后面必定是b。
对于B、C选项,当b的*取值为0时,a的后面不能保证会有b。
对于D选项,表示的是任意a和b组成的串,因此包括aaa,不满足a的后面必须有b。
本题只有A选项符合题意。
以下关于高级程序设计语言实现的编译和解释方式的叙述中,正确的是( )。
A. 编译程序不参与用户程序的运行控制,而解释程序则参与
B. 编译程序可以用高级语言编写,而解释程序只能用汇编语言编写
C. 编译方式处理源程序时不进行优化,而解释方式则进行优化
D. 编译方式不生成源程序的目标程序,而解释方式则生成
正确答案是 A。
解析
编译程序的功能是把用高级语言书写的源程序翻译成与之等价的目标程序。编译过程划分成词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成6个阶段。目标程序可以独立于源程序运行。
解释程序是一种语言处理程序,在词法、语法和语义分析方面与编译程序的工作原理基本相同,但在运行用户程序时,它是直接执行源程序或源程序的内部形式(中间代码)。因此,解释程序并不产生目标程序,这是它和编译程序的主要区别。
以下关于脚本语言的叙述中,正确的是( )。
A. 脚本语言是通用的程序设计语言
B. 脚本语言更适合应用在系统级程序开发中
C. 脚本语言主要采用解释方式实现
D. 脚本语言中不能定义函数和调用函数
正确答案是 C。
解析
脚本语言(Script languages,scripting programming languages,scripting languages)是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创
建的计算机编程语言。此命名起源于一个脚本“screen play”,每次运行都会使对话框逐字重复。早期的脚本语言经常被称为批处理语言或工作控制语言。一个脚本通常是解释运行而非编译。
将高级语言源程序先转化为一种中间代码是现代编译器的常见处理方式。常用的中间代码有后缀式、( )、树等。
A. 前缀码
B. 三地址码
C. 符号表
D. 补码和移码
正确答案是 B。
解析
中间代码的表达形式有语法树,后缀式,三地址代码。
某确定的有限自动机(DFA)的状态转换图如下图所示(A是初态,C是终态),则该DFA能识别( )。
A. aabb
B. abab
C. baba
D. abba
正确答案是 B。
解析
对于该有限自动机,A为初态,C为终态,因此能识别的串一定是a开始b结束的串,可以排除C、D选项。并且,对于该自动机能识别的串,经过初始a到达B状态后,只能识别b字符,因此A选项也错误。
本题只能选择B选项abab,识别顺序如下图所示:
移进-归约分析法是编译程序(或解释程序)对高级语言源程序进行语法分析的一种方法,属于( )的语法分析方法。
A. 自顶向下(或自上而下)
B. 自底向上(或自下而上)
C. 自左向右
D. 自右向左
正确答案是 B。
解析
归约分析是自底向上方法中的典型。先分析词,即词法分析。而分析词的组合,即语法分析。
某非确定的有限自动机(NFA)的状态转换图如下图所示(q0既是初态也是终态)。以下关于该NFA的叙述中,正确的是( )。
A. 其可识别的0、1序列的长度为偶数
B. 其可识别的0、1序列中0与1的个数相同
C. 其可识别的非空0、1序列中开头和结尾字符都是0
D. 其可识别的非空0、1序列中结尾字符是1
正确答案是 D。
解析
要证明一种说法有误只需要举一反例即可,所以做这类题时,举反例排除错误选择是一个不错的选择。
由于题目所述的NFA可以解析串“1”,所以可排除:A,B,C三个选项。
某程序运行时陷入死循环,则可能的原因是程序中存在( )。
A. 词法错误
B. 语法错误
C. 动态的语义错误
D. 静态的语义错误
正确答案是 C。
解析
死循环错误属于典型的语义错误,但静态的语义错误可被编译器发现,到程序真正陷入死循环说明编译器并未发现,所以属于动态语义错误。
对高级语言源程序进行编译或解释的过程可以分为多个阶段,解释方式不包含( )阶段。
A. 词法分析
B. 语法分析
C. 语义分析
D. 目标代码生成
正确答案是 D。
解析
本题考查程序语言基础知识。
用某种高级语言或汇编语言编写的程序称为源程序,源程序不能直接在计算机上执行。汇编语言源程序需要用一个汇编程序将其翻译成目标程序后才能执行。高级语言源程序则需要对应的解释程序或编译程序对其进行翻译,然后在机器上运行。
解释程序也称为解释器,它或者直接解释执行源程序,或者将源程序翻译成某种中间代码后再加以执行:而编译程序(编译器)则是将源程序翻译成目标语言程序,然后在计算机上运行目标程序。这两种语言处理程序的根本区别是:在编译方式下,机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与目标程序的执行过程:而在解释方式下,
解释程序和源程序(或其某种等价表示)要参与到程序的运行过程中,运行程序的控制权在解释程序。简单来说,在解释方式下,翻译源程序时不生成独立的目标程序,而编译器则将源程序翻译成独立保存的目标程序。
某非确定的有限自动机(NFA)的状态转换图如下图所示(q0既是初态也是终态),与该NFA等价的确定的有限自动机(DFA)是( )。
正确答案是 A。
解析
本题使用代入法进行验证比较容易。
(1)代入aaa,选项B与C无法解析,故排除。
(2)代入ba,选项D无法解析,也要排除,此时可以确定正确答案为A。
递归下降分析方法是一种( )方法。
A. 自底向上的语法分析
B. 自上而下的语法分析
C. 自底向上的词法分析
D. 自上而下的词法分析
正确答案是 B。
解析
所谓递归下降法(recursive descent method),是指对文法的每一非终结符号,都根据相应产生式各候选式的结构,为其编写一个子程序(或函数),用来识别该非终结符号所表示的语法范畴。
编译器和解释器是两种基本的高级语言处理程序。编译器对高级语言源程序的处理过程可以划分为词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等阶段,其中,(1)并不是每个编译器都必需的,与编译器相比,解释器(2)。
题目(1)
A. 词法分析和语法分析
B. 语义分析和中间代码生成
C. 中间代码生成和代码优化
D. 代码优化和目标代码生成
题目(2)
A. 不参与运行控制,程序执行的速度慢
B. 参与运行控制,程序执行的速度慢
C. 参与运行控制,程序执行的速度快
D. 不参与运行控制,程序执行的速度快
正确答案是 C B。
解析
在编译过程中:词法分析;语法分析;语义分析;目标代码生成是必须的,而代码优化和中间代码生成是可以不需要的。
编译与解释的区别在于:
编译直接生成目标代码,在机器上执行而编译器不需要参与执行,因此程序执行速度快;
解释则生成中间代码或其等价形式,程序执行时需要解释器的参与,并且由解释器控制程序的执行,因此执行速度慢。
表达式采用逆波兰式表示时,利用( )进行求值。
A. 栈
B. 队列
C. 符号表
D. 散列表
正确答案是 A。
解析
逆波兰使用栈的基本操作流程为:从左至右将数字入栈,当遇运算符时,出栈运算符所需数据进行操作,再将操作结果入栈,依此类推。
对高级语言源程序进行编译的过程可以分为多个阶段,分配寄存器的工作在( )阶段进行。
A. 词法分析
B. 语法分析
C. 语义分析
D. 目标代码生成
正确答案是 D。
解析
目标代码生成阶段应考虑直接影响到目标代码速度的三个问题:一是如何生成较短的目标代码;二是如何充分利用计算机中的寄存器,减少目标代码访问存储单元的次数;三是如何充分利用计算机指令系统的特点,以提高目标代码的质量。
对于大多数通用程序设计语言,用( )描述其语法即可。
A. 正规文法
B. 上下文无关文法
C. 上下文有关文法
D. 短语结构文法
正确答案是 B。
解析
上下文无关文法:形式语言理论中一种重要的变换文法,用来描述上下文无关语言,在乔姆斯基分层中称为2型文法。由于程序设计语言的语法基本上都是上下文无关文法,因此应用十分广泛。
与算术表达式“(a+(b-c))*d”对应的树是( )。
正确答案是 B。
解析
本题考查的是表达式的树形表示,我们常见的表达式形式是树的中序遍历序列。
对算术表达式“(a+(b-c))*d”求值的运算处理顺序是:先进行b-c,然后与a相加,最后再与d相乘。只有选项B所示的二叉树与其相符。
编译程序对高级语言源程序进行编译的过程中,要不断收集、记录和使用源程序中一些相关符号的类型和特征等信息,并将其存入( )中。
A. 符号表
B. 哈希表
C. 动态查找表
D. 栈和队列
正确答案是 A。
解析
符号表:符号表是一种用于语言翻译器(例如编译器和解释器)中的数据结构。在符号表中,程序源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如其数据类型、作用域以及内存地址。
哈希表:也叫散列表,是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
动态查找表:动态查找表的表结构本身是在查找过程中动态生成的,即对于给定值key,若表中存在其关键字等于key的记录,则查找成功返回,否则插入关键字等于key的记录。
栈和队列:基本的数据结构。栈的基本特点是“后进先出”,而队列的基本特点是“先进先出”。
在C/C++程序中,整型变量a的值为0且应用在表达式“c=b/a”中,则最可能发生的情形是( )。
A. 编译时报告有语法错误
B. 编译时报告有逻辑错误
C. 运行时报告有语法错误
D. 运行时产生异常
正确答案是 D。
解析
检查语法错误是在编译时,表达式“c=b/a”符合语法逻辑,编译时不会报语法错误;由于编译时a的值无法确定,需要到运行时,实际传入值时才能确定,因此在运行时,若分母为0,将产生异常。
算术表达式“(a-b)*(c+d)”的后缀式是( )。
A. ab-cd+*
B. abcd-*+
C. ab-+*cd
D. ab-c+d*
正确答案是 A。
解析
后缀表达式是从左到右算。把表达式加上括号,((a-b)*(c+d)),再把运算符加到括号外面ab-cd+*。答案为A。
将高级语言源程序翻译成机器语言程序的过程中,常引入中间代码。以下关于中间代码的叙述中,不正确的是( )。
A. 中间代码不依赖于具体的机器
B. 使用中间代码可提高编译程序的可移植性
C. 中间代码可以用树或图表示
D. 中间代码可以用栈和队列表示
正确答案是 D。
解析
本题考查程序语言基础知识。
从原理上讲,对源程序进行语义分析之后就可以直接生成目标代码,但由于源程序与目标代码的逻辑结构往往差别很大,特别是考虑到具体机器指令系统的特点,要使翻译一次到位很困难,而且用语法制导方式机械生成的目标代码往往是繁琐和低效的,因此有必要设计一种中间代码,将源程序首先翻译成中间代码表示形式,以利于进行与机器无关的优化处理。由于中间代码实际上也起着编译器前端和后端分水岭的作用,所以使用中间代码也有助于提高编译程序的可移植性。常用的中间代码有后缀式、三元式、四元式和树(图)等形式。
简单算术表达式的结构可以用下面的上下文无关文法进行描述(E为开始符号),( )是符合该文法的句子。
E→T∣E+T
T→F∣T*F
F→-F∣N
N→0∣1∣2∣3∣4∣5∣6∣7∣8∣9
A. 2–3*4
B. 2±3*4
C. (2+3)*4
D. 2*4-3
正确答案是 B。
解析
本题考查程序语言基础知识。一个上下文无关语法定义一个语言,其主要思想是从文法的开始符号出发,反复连续使用产生式,对非终结符进行替换和展开。
推出2±-3*4的过程如下:
E≥E+T≥T+T≥F+T≥2+T≥2+T*F≥2+F*F≥2±-F*F≥2±-3*F≥2±3*4;
文法中的二元运算只有加号和乘号,文法中也没有括号。所以ACD错误。
在仅由字符a、b构成的所有字符串中,其中以b结尾的字符串集合可用正规式表示为( )。
A. (blab)*b
B. (ab*)*b
C. a*b*b
D. (alb)*b
正确答案是 D。
解析
所有选项都是以b为结尾的,只有D可以包含以a、b字符串组成,并以b结尾的所有字符串。
编译器与解释器是程序语言翻译的两种基本形态,以下关于编译器工作方式及特点的叙述中,正确的是( )。
A. 边翻译边执行,用户程序运行效率低且可移植性差
B. 先翻译后执行,用户程序运行效率高且可移植性好
C. 边翻译边执行,用户程序运行效率低但可移植性好
D. 先翻译后执行,用户程序运行效率高但可移植性差
正确答案是 D。
解析
编译器把源程序先翻译,得到目标代码。
最后由机器直接执行。
整个过程运行效率高,但是只适合特定的机器,所以可移植性差。
对高级语言源程序进行编译或解释过程中需进行语法分析,递归子程序分析属于( )的分析法。
A. 自上而下
B. 自下而上
C. 从左至右
D. 从右至左
正确答案是 A。
解析
递归子程序法是一种确定的自顶向下语法分析方法,所有从递归两字可以知道,是从上到下的分析方式。
已知文法G:S→A0IB1,A→S1I1,B→S0I0,其中S是开始符号。从S出发可以推导出( )。
A. 所有由0构成的字符串
B. 所有由1构成的字符串
C. 某些0和1个数相等的字符串
D. 所有0和1个数不同的字符串
正确答案是 C。
解析
对于文法可推导出的字符串分析,考试一般可对文法举例,然后总结规律。
以本题文法为例,可以产生的字符串包括:
(1) 10
推导过程:S→A0;A→1。
(2) 01
推导过程:S→B1;B→0。
(3)1010
推导过程:S→A0;A→S1;S→A0,A→1。
至此,可以了解到,选项A、B、D的描述都是不正确的。
下图所示为一个非确定有限自动机(NFA),S0为初态,S3为终态。该NFA识别的字符串( )。
A. 不能包含连续的字符“0”
B. 不能包含连续的字符“1”
C. 必须以“101”开头
D. 必须以“101”结尾
正确答案是 D。
解析
本题考查NFA有限自动机相关问题。
针对这类问题,可以采取找出对应反例的形式表示。S0是初态,S3是终态,识别出从S0为初态到S3为终态的路径。
可以看到无论如何到达S3终态都需要经过S1-S2,即末尾必须存在”101“结尾的。D选项正确。
对于A和B选项不能包含连续字符的”0“和“1”,我们可
以看到在S0初态中,有1个字符串0和1自循环,是可以包含连续的”0“和”1“的,所以错误。
对于C选项必须以“101”开头,说法错误,可以任意10
的字符开头。综上所述,答案选D。
对高级程序语言进行编译的过程中,使用( )来记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成。
A. 决策表
B. 符号表
C. 广义表
D. 索引表
正确答案是 B。
解析
考查分析语义分析阶段相关问题。
语义分析阶段主要是分析各语法结构的含义,检查源程序是否包含静态语义错误,并收集类型信息提供给代码生成阶段使用。在确认源程序的语法和语义后,可以对其进行翻译并给出源程序的内部表示。对于声明语句,需要记录所遇到的符号的信息,所以应该进行符号表的填查工作,用来记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成。B选项正确。
至于决策表是用于测试的,广义表是针对数据结构的表示,索引表是数据库中指示逻辑和物理记录对应的关系。A、C、D选项错误。
综上所述,答案选B。
以下关于下图所示有限自动机的叙述中,不正确的是( )。
A. 该自动机识别的字符串中a不能连续出现
B. 自动机识别的字符串中b不能连续出现
C. 该自动机识别的非空字符串必须以a结尾
D. 该自动机识别的字符串可以为空串
正确答案是 A。
解析
1既是初态也是终态,从图中可以看出a能连续出现,保持在状态1。
下图所示有限自动机(DFA)是( )。
A. 确定的有限自动机,它能识别以bab结尾的
B. 确定的有限自动机,他不能识别以bab结尾的
C. 非确定的有限自动机,他能识别以bab结尾的
D. 非确定的有限自动机,他不能识别以bab结尾的
正确答案是 D。
解析
根据有限自动机判断,从初始状态开始,接收字符a可能会保持原状态不变,也可能会转入下一个状态,是不确定的,所以是不确定的有限自动机。其次该自动机识别倒数第3个字符只有a,所以无法识别bab结尾的字符串,选择D选项。
用C/C++语言为某个应用编写的程序,经过( )后形成可执行程序。
A. 预处理、编译、汇编、链接
B. 编译、预处理、汇编、链接
C. 汇编、预处理、链接、编译
D. 链接、预处理、编译、汇编
正确答案是 A。
解析
本题考查汇编语言的执行过程。
对于编译型语言,处理过程为:预处理-编译-汇编-链接。
故正确答案选择A选项。
程序设计语言的大多数语法现象可以用CFG(上下文无关文法)表示。下面的CFG产生式集用于描述简单算术表达式,其中+、-、表示加、减、乘运算,id表示单个字母表示的变量,那么符合该文法的表达式为( )。
P:E→E+TIE-TIT
T→TFIF
F→-Flid
A. a±b-c
B. a*(b+c)
C. a*-b+2
D. -a/b+c
正确答案是 A。
解析
本题考查文法推导树相关知识。
根据本题的语法推导式,可以发现,这里没有终结符"(“、”)“、”/“,因此选项B和D错误。
id表示单个字母表示的变量不能表示数字2,所以这里无法识别字符2,C选项错误。
也可以进行推导,在推导的过程中,会发现”*“只能通过T推导,此时必定经过了E+T或E-T,不可能出现数字2。因此C错误。
只有A能够被推导,推导过程如下:
(1)通过E→E-T,从起始符E得到E-T;
(2)通过E→E+T,将上面的E展开为E+T,得到E+T-T;
(3)通过E→T→F→id→单个字母a;
(4)通过T→F→-F→-id→单个字母-b;
(5)通过T→F→id→单个字母c。
综上,可以从起始符E得到a±b-c,即为A选项。
以编译方式翻译C/C++源程序的过程中,( )阶段的主要任务是对各条语句的结构进行合法性分析。
A. 词法分析
B. 语义分析
C. 语法分析
D. 目标代码生成
正确答案是 C。
解析
本题考查程序语言基础知识。
词法分析阶段依据语言的词法规则,对源程序进行逐个字符地扫描,从中识别出一个个“单词”符号,主要是针对词汇的检查。
语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,如“表达式”“语句”和“程序”等。语法规则就是各类语法单位的构成规则,主要是针对结构的检查。
语义分析阶段分析各语法结构的含义,检查源程序是否包含语义错误,主要是针对句子含义的检查。目标代码生成是编译的最后一个阶段。目标代码生成器把语法分析后或优化后的中间代码变换成目标代码。
本题描述的是语法分析。
在以阶段划分的编译器中,( )阶段的主要作用是分析程序中的句子结构是否正确。
A. 词法分析
B. 语法分析
C. 语义分析
D. 代码生成
正确答案是 B。
解析
本题考查程序语言基础知识。
词法分析:从左到右逐个扫描源程序中的字符,识别其中如关键字(或称保留字)、标识符、常数、运算符以及分隔符(标点符号和括号)等。
语法分析:根据语法规则将单词符号分解成各类语法单位,并分析源程序是否存在语法上的错误。包括:语言结构出错、if…end if不匹配,缺少分号、括号不匹配、表达式缺少操作数等。本题属于语法分析阶段的作用。
语义分析:进行类型分析和检查,主要检测源程序是否存在静态语义错误。包括:运算符和运算类型不符合,如取余时用浮点数。
目标代码生成是编译的最后一个阶段。目标代码生成器把语法分析后或优化后的中间代码变换成目标代码。
在以阶段划分的编译器中,( )阶段的主要作用是分析构成程序的字符及由字符按照构造规则构成的符号是否符合程序语言的规定。
A. 词法分析
B. 语法分析
C. 语义分析
D. 代码生成
正确答案是 A。
解析
本题考查程序语言基础知识。
在词法分析阶段,其任务是从左到右逐个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。这里所谓的单词是指逻辑上紧密相连的一组字符,这些字符组合在一起才表示某一含义。词法分析过程依据的是语言的词法规则,即描述“单词”分析构成程序的字符
及由字符按照构造规则构成的符号是否符合程序语言的规定”是对单词的检查。
语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,如“表达式”“语句”和“程序”等。语法规则就是各类语法单位的构成规则。
语义分析阶段分析各语法结构的含义,检查源程序是否包含静态语义错误,并收集类型信息供后面的代码生成阶段使用。
目标代码生成是编译的最后一个阶段。目标代码生成器把语法分析后或优化后的中间代码变换成目标代码。
中间代码生成是产生中间代码的过程。它的复杂性介于源程序语言和机器语言之间,容易将它翻译成目标代码。
下图所示为一个不确定有限自动机(NFA)的状态转换图。该NFA可识别字符串( )。
A. 0110
B. 0101
C. 1100
D. 1010
正确答案是 A。
解析
本题考查程序语言基础知识。
因为是不确定的有限自动机,中间内容有多种可能,但由图可以看到,从初态0开始,首字符只能为0,到终态结束之前,尾字符也只能为0,只有A选项满足首字符和尾字符都为0。
BCD不符合。本题选A。
下图所示为一个不确定有限自动机(NFA)的状态转换图,与该NFA等价的DFA是( )。
正确答案是 C。
解析
本题考查程序语言-自动机相关知识。
本题可以直接以实例方式排除错误选项。本题给出的NFA,能够识别字符串000,010等,以这两个字符串为例进行分析。
与之等价的DFA,也必须能够识别这样的串。A选项不能识别000,B选项不能识别010,D选项不能识别010。只有C选项能够同时识别这2个串,因此本题选择C选项。
将编译器的工作过程划分为词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成时,语法分析阶段的输入是(1)。若程序中的括号不配对,则会在(2)阶段检查出该错误。
题目(1)
A. 记号流
B. 字符流
C. 源程序
D. 分析树
题目(2)
A. 词法分析
B. 语法分析
C. 语义分析
D. 目标代码生成
正确答案是 A B。
解析
本题考查程序语言基础知识。
A选项记号流,词法分析的输出是记号流,也就是语法分析的输入,第一空选择A选项。
B选项字符流,在Java中,根据处理的数据单位不同,分为字节流和字符流。字符流是由字符组成的,例如File Reader、File Writer、Buffered Reader、Buffered Writer、 Input Stream Reader、 Output Stream Writer 等。与本题无关。
C选项源程序,词法分析的任务是把源程序的字符串转换成单词符号序列。
D选项分析树,如果没有语法错误,语法分析后就能正确的构造出其语法树。
括号不匹配是典型的语法错误,会在语法分析阶段检测出来。
词法分析器的任务就是读入源程序,对其进行一定的切分,得到记号流。
语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。
编译器需要将源代码转换为目标机器的指令集,这个过程叫作目标代码生成。
计算机执行程序时,内存分为静态数据区、代码区、栈区和堆区。其中(1)一般在进行函数调用和返回时由系统进行控制和管理,(2)由用户在程序中根据需要申请和释放。
题目(1)
A. 静态数据区
B. 代码区
C. 栈区
D. 堆区
题目(2)
A. 静态数据区
B. 代码区
C. 栈区
D. 堆区
正确答案是 C D。
解析
本题考查程序语言基础知识。
程序在不同的系统中运行时,虽然对其代码和数据所占用的内存空间会有不同的布局和安排,但是一般都包括正文段(包含代码和只读数据)、数据区、堆和栈等。例如,在Linux系统中进程的内存布局示意图如下图所示。
栈是局部变量以及每次函数调用时所需保存的信息的存储区域,其空间的分配和释放由操作系统进行管理。每次函数调用时,其返回地址以及调用者的环境信息(例如某些寄存器)都存放在栈中。然后,在栈中为新被调用的函数的自动和临时变量分配存储空间。栈空间向低地址方向增长。
堆是一块动态存储区域,由程序员在程序中进行分配和释放,若程序语句没有释放,则程序结束时由操作系统回收。堆空间地址的增长方向是从低地址向高地址。在C程序中,通过调用标准库函数malloc/calloc/realloc等向系统动态地申请堆存储空间来存储相应规模的数据,之后用free函数释放所申请到的存储空间。
某有限自动机的状态转换图如下图所示,与该自动机等价的正规式是( )。
A. (0∣1)*
B. (0∣10)*
C. 0*(10)*
D. 0*(1∣0)*
正确答案是 B。
解析
本题考查程序语言基础知识。
从题中的自动机可分析出,初态q0同时是终态,从q0到q0的弧(标记0)表明该自动机识别零个或多个0构成的串,路径q0→q1→ q0的循环表明“10”的多次重复,因此该自动机识别的字符串是“0∣10”的无穷多次,表示为(0∣10)*。