编译原理与技术01
清华版编译原理试卷及答案1
复习题一
一、填空题
1、编译过程的各阶段都需要进行()管理和()处理,所以在典型编译程序框图中,各阶段对应的程序都和上述管理或处理操作程序相联系。
2、对给定文法G[E],由推导序列E=>E+T=>T+T=>i+T=>i+i 可知:该推导为()推导,从该推导序列可得到()个句型,其中的()同时也是句子。
3、语法分析方法分为自上而下与自下而上两类,自上而下的分析方法方要有递归子程序分析法和();而自下而上的分析方法主要有()和()。
4、用四元组G =(VN,VT,P,S)表示文法,则其元素VN表示()集;元素VT表示()集;元素P表示规则集;元素S表示开始符号,它必须是一个()符号。
5、YACC是一种()分析程序的自动构造工具;而LEX是一种()分析程序的自动构造工具。
6、用优先函数表示优先关系的优点是(),缺点是()。根据优先关系矩阵计算优先函数可用Floyed迭代法和()法。
7、对一个文法G,在其LR(0)项目集规范族DFA中,当有归约项目和()项目或()项目共存于同一个状态中时,该文法就不是LR(0) 文法。
8、对于A∈VN 定义A的后续符号集:FOLLOW(A)={a|S=*>uAβ, a∈VT,且a∈(),u∈VT*,β∈V+;若(),则#∈FOLLOW(A)。也可以定义为:FOLLOW(A)={a|S=*>…Aa…,a ∈VT}。若有(),则规定#∈FOLLOW(A)。
9、基本块的定义:一个基本块是指程序中一个执行的语句序列,其中只有一个入口和一个出口。入口是程序第一个语句或转移语句的目标语句,或转移语句的后继第一个语句。出口是程序()或转移语句。在基本块范围内的优化称为()。
编译原理01-本讲教学课件(PDF文档)_1
状态/符号栈
a1 … ai … an $
Sm
Sm-1 … …
… S1 S0
Xm
Xm-1 … …
… X1 $
LR主控程序
动作表
ACTION
转移表
GOTO
产生式序列 分析表
LR 分析表的结构
➢例 ➢ 文法 ① S→BB ② B→aB ③ B→b
sn:将符号a、状态n 压入栈 rn:用第n个产生式进行归约
id+(id+id) $ +(id+id) $ +(id+id) $ (id+id) $ id+id) $ +id) $ +id) $ id) $ )$ )$ )$ $ $
移入 归约: E→id 移入 移入 移入 归约: E→id 移入 移入 归约: E→id 归约: E→E+E 移入 归约: E→(E)
$ var iA
, iB : real$
$ var <IDS>
, iB : real$
$ var <IDS> ,
iB : real$
$ var <IDS> , iB
: real$
$ var <IDS>
: real $
$ var <IDS> :
编译原理及实现课后答案
5.1 考虑以下的文法:
S→S;T|T
T→a
(1)为这个文法构造LR(0)的项目集规范族。
(2)这个文法是不是LR(0)文法?如果是,则构造LR(0)分析表。
(3)对输入串“a;a”进行分析。
解:
(1)拓广文法G[S’]:
0:S’→S
1:S→S;T
2:S→T
3:T→a
构造LR(0)项目集规范族
(2)该文法不存在“归约-归约”和“归约-移进”冲突,因此是LR(0)文法。LR(0)分析表如下:
(3)对输入串“a;a”进行分析如下:
5.2 证明下面文法是SLR(1)文法,但不是LR(0)文法。S→A
A→Ab|bBa
B→aAc|a|aAb
解:文法G[S]:
0:S→A
1:A→Ab
2:A→bBa
3:B→aAc
4:B→a
5:B→aAb
状态5存在“归约-移进”冲突,状态9存在“归约-归约”冲突,因此该文法不是LR(0)文法。
状态5:
FOLLOW(B)={a},因此,FOLLOW(B)∩{b}=Φ
状态9:
FOLLOW(B)={a},FOLLOW(A)={#,b,c},因此FOLLOW(B)∩FOLLOW(A)=Φ
该SLR(1)分析表无重定义,因此该文法是SLR(1)文法,不是LR(0)文法。
5.3 证明下面文法是LR(1)文法,但不是SLR(1)文法。
S→AaAb|BbBa
A→ε
B→ε
解:拓广文法G[S’]:
0:S’→S
1:S→AaAb
2:S→BbBa
3:A→ε
4:B→ε
={a,b},即FOLLOW(A)∩FOLLOW(B)={a,b}≠Φ,所以该文法不是SLR(1)文法。
构造LR(1)项目集规范族:
最新编译原理陈意云_课后答案1讲课教案
16.12.2020
luanj@mail.ustc.edu.cn
12
2.11
• 可以通过正规式的最简DFA同构来证明正规 式等价。证明下列正规式等价
➢(a|b)* ➢(a*|b*)* ➢((ε|a)b*)*
16.12.2020
luanj@mail.ustc.edu.cn
13
2.11 (续)
• NFA->DFA 1) ε-closure({s}) = {s,4,f,0,2,3,5,6,8} = A 2) ε-closure(move(A,a)) = ε-closure({1}) = {1,5,6,8,4,f,0,2,3} = B 3) ε-closure(move(A,b)) = ε-closure({7}) = {7,6,8,4,f,0,2,3,5} = C 4) ε-closure(move(B,a)) = ε-closure({1}) = B 5) ε-closure(move(B,b)) = ε-closure({7}) = C 6) ε-closure(move(C,a)) = ε-closure({1}) = B 7) ε-closure(move(C,b)) = ε-closure({7}) = C
➢不含字串011的01串
✓当出现0后,1只能单独出现 ✓1*(0+1)*0*
16.12.2020
编译原理课后答案
第二章 高级语言及其语法描述
4.令+、*和↑代表加,乘和乘幂,按如下的非标准优先级和结合性质的约定,计算1+1*2↑2*1↑2的值:
(1) 优先顺序(从高至低)为+,*和↑,同级优先采用左结合。 (2) 优先顺序为↑,+,*,同级优先采用右结合。 解:(1)1+1*2↑2*1↑2=2*2↑1*1↑2=4↑1↑2=4↑2=16 (2)1+1*2↑2*1↑2=1+1*2*1=2*2*1=2*2=4
6.令文法G6为 N →D|ND
D →0|1|2|3|4|5|6|7|8|9 (1) G6 的语言L (G6)是什么?
(2) 给出句子0127、34和568的最左推导和最右推导。 解:(1)L (G6)={a|a ∈∑+,∑=﹛0,1,2,3,4,5,6,7,8,9}}
(2)N =>ND => NDD => NDDD => DDDD => 0DDD => 01DD => 012D => 0127 N => ND => N7=> ND7=> N27=> ND27=> N127=> D127=> 0127 N => ND => DD => 3D => 34 N => ND => N4=> D4 =>34
N => ND => NDD => DDD => 5DD => 56D => 568 N => ND => N8=> ND8=> N68=> D68=> 568
7.写一个文法,使其语言是奇数集,且每个奇数不以0开头。 解:A →SN, S →+|-|∑, N →D|MD
D →1|3|5|7|9, M →MB|1|2|3|4|5|6|7|8|9 B →0|1|2|3|4|5|6|7|8|9 8. 文法:
编译原理与技术1
编译原理与技术模拟试题一
一、填空题(20分,每空2分)
1.1编译程序的工作过程可划分为词法分析、语法分析、、中间代码生
成、代码优化、等阶段,一般在阶段对表达式中运算对象的类型进行检查。
答案:语义分析、目标代码生成、语义分析
解释:要求掌握编译器的工作原理和特点。编译和解释方式是翻译高级程序设计语言的两种基本方式。解释程序也称为解释器,它或者直接解释执行源程序,或者将源程序翻译成某种中间表示形式后再加以执行;而编译程序(编译器)则首先将源程序翻译成目标语言程序,然后在计算机上运行目标程序。编译过程包含词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成,以及符号表管理和出错处理。表达式的类型信息属于语义信息,所以在语义分析阶段进行类型检查。
1.2 和预测分析法是自上而下的语法分析方法。
答案:递归下降法
解释:语法分析的任务是根据语言的语法规则,分析单词串是否构成短语和句子,即表达式、语句和程序等基本语言结构,同时检查和处理程序中的语法错误。根据语法树(或分析树)的建立方式,语法分析可分为自上而下分析和自下而上分析两类,递归下降分析和预测分析属于自上而下的语法分析方法。
1.3常用的存储分配策略有存储分配和动态存储分配,其中,动态存储分配
策略包括分配和分配。
答案:静态、栈、堆
解释:编译器怎样对存储空间进行组织和采用什么样的存储分配策略,很大程度上取决于程序设计语言中所采用的机制。编译器具体实现时,根据语言机制的特性,采用静态分配策略、栈分配策略和堆分配策略三种方式的其中若干种。静态分配策略是指编译时安排所有数据对象的存储,即绑定是静态确定的;栈分配策略是指按栈的方式管理运行时的存储;堆分配策略是指在运行时根据要求从堆数据区动态地分配和释放存储。
编译原理练习题答案
一、填空题:
1-01.编译程序的工作过程一般可以划分为词法分析,语法分析,语义分析,之间代码生成,代码优化等几个基本阶段,同时还会伴有表格处理和出错处理.
1-02.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序.
1-03.编译方式与解释方式的根本区别在于是否生成目标代码.
1-04.翻译程序是这样一种程序,它能够将用甲语言书写的程序转换成与其等价的用乙语言书写的程序. 1-05.对编译程序而言,输入数据是源程序,输出结果是目标程序.
1-06.如果编译程序生成的目标程序是机器代码程序,则源程序的执行分为两大阶段: 编译阶段和运行阶段.如果编译程序生成的目标程序是汇编语言程序,则源程序的执行分为三个阶段: 编译阶段, 汇编阶段和运行阶段.
1-07.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序。
1-08.一个典型的编译程序中,不仅包括词法分析、语法分析、中间代码生成、代码优化、目标代码生成等五个部分,还应包括表格处理和出错处理。其中,词法分析器用于识别单词。
1-09.编译方式与解释方式的根本区别为是否生成目标代码。
2-01.所谓最右推导是指:任何一步αβ都是对α中最右非终结符进行替换的。
2-02.一个上下文无关文法所含四个组成部分是一组终结符号、一组非终结符号、一个开始符号、一组产生式。
2-03.产生式是用于定义语法成分的一种书写规则。
2-04.设G[S]是给定文法,则由文法G所定义的语言L(G)可描述为:L(G)={x│S x,x∈V T*} 。
编译原理:第一章 引论
合肥工业大学 计算机与信息学院软件所
PROCEDURE INCWAP(M,N:INTEGER); LABEL START; VAR K:INTEGER; BEGIN START: K:=M+1; M:=N+4; N:=K; 表 0.2 常数表 CT END. 值 (VALUE) (1) 1 (2) 4
常见的表格:符号名表,常数表,标号表,入 口名表,过程引用表。 格式:
名字
信息
合肥工业大学 计算机与信息学院软件所
例: PASCAL程序段:
PROCEDURE INCWAP(M,N:INTEGER); LABEL START; VAR K:INTEGER; BEGIN START: K:=M+1; M:=N+4; N:=K; END.
高级语 言程序
翻译
机器语 运行 言程序
结果
编译 程序
合肥工业大学 计算机与信息学院软件所
1.1. 什么是编译程序
解释程序 把源语言写的源程序作为输入,但不产生目标程序, 而是边解释边执行源程序本身。(如BASIC语言是 解释程序)
源程序
解释执行 解释 程序
结果
合肥工业大学 计算机与信息学院软件所
编译程序 vs. 解释程序
编译
解释
编译原理-课程简介
05
CATALOGUE
编ቤተ መጻሕፍቲ ባይዱ器实现技术
词法分析器实现方法
基于正则表达式的词法分析
01
利用正则表达式描述词法单元的模式,通过模式匹配进行词法
分析。
基于状态机的词法分析
02
根据词法单元的规则构建状态机,通过状态转移进行词法分析
。
手工编写的词法分析器
03
根据语言规范,手动编写代码实现词法分析器。
语法分析器实现方法
• 向量化技术的实现方法:向量化技术的实现方法包括自动向量化和手动向量化 两种。自动向量化是指编译器自动将程序中的循环结构转换为向量运算;而手 动向量化则需要程序员手动编写向量运算的代码。在实现向量化技术时,需要 注意处理器的向量长度、数据对齐等问题。
04
CATALOGUE
运行时环境支持
存储管理策略及实现
• 循环优化的概念和作用:循环优化是编译器优化中针对循环结构的一种特殊优 化技术,它可以显著提高循环程序的性能。
• 循环优化的方法:常见的循环优化方法包括循环展开、循环合并、循环交换等 。这些方法可以减少循环次数、消除循环中的冗余计算和提高循环的并行度。
• 向量化技术的概念和作用:向量化技术是一种利用现代处理器中的向量运算单 元来提高程序性能的优化技术。通过向量化技术,编译器可以将多个标量运算 转换为单个向量运算,从而显著提高程序的运算速度。
编译原理习题答案
编译原理习题答案
《编译原理》习题答案:
第⼀次:
P14
2、何谓源程序、⽬标程序、翻译程序、汇编程序、编译程序和解释程序?它们之间可能有何种关系?
答:被翻译的程序称为源程序;
翻译出来的程序称为⽬标程序或⽬标代码;
将汇编语⾔和⾼级语⾔编写的程序翻译成等价的机器语⾔,实现此功能的程序称为翻译程序;
把汇编语⾔写的源程序翻译成机器语⾔的⽬标程序称为汇编程序;
解释程序不是直接将⾼级语⾔的源程序翻译成⽬标程序后再执⾏,⽽是⼀个个语句读⼊源程序,即边解释边执⾏;
编译程序是将⾼级语⾔写的源程序翻译成⽬标语⾔的程序。
关系:汇编程序、解释程序和编译程序都是翻译程序,具体见P4 图 1.3。
P14
3、编译程序是由哪些部分组成?试述各部分的功能?
答:编译程序主要由8个部分组成:(1)词法分析程序;(2)语法分析程序;(3)语义分析程序;(4)中间代码⽣成;(5)代码优化程序;(6)⽬标代码⽣成程序;(7)错误检查和处理程序;(8)信息表管理程序。具体功能见P7-9。
P14
4、语法分析和语义分析有什么不同?试举例说明。
答:语法分析是将单词流分析如何组成句⼦⽽句⼦⼜如何组成程序,看句⼦乃⾄程序是否符合语法规则,例如:对变量 x:= y 符合语法规则就通过。语义分析是对语句意义进⾏检查,如赋值语句中x与y类型要⼀致,否则语法分析正确,语义分析则错误。
P15
5、编译程序分遍由哪些因素决定?
答:计算机存储容量⼤⼩;编译程序功能强弱;源语⾔繁简;⽬标程序优化程度;设计和实现编译程序时使⽤⼯具的先进程度以及参加⼈员多少和素质等等。
编译原理第6章_1
S8
r4
7
S9
r1
1
acc
对输入串abbcde#的LR分析过程
文法G[S]: (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d
si:移进,将状态i和输入符进栈
ri:归约,用第i个产生式归约,同时状 态栈与符号栈退出相应个符号,并把 GOTO表相应状态和第i个产生式的左 部非终结符入栈。
LR分析算法
then begin pop || 项 令当前栈顶状态为S’ push GOTO[S’, A]和A(进栈)
end else if ACTION[s,a]=acc
then return (成功) else error end
例6.1: G[S]: S aAcBe[1] A b[2] A Ab[3] B d[4]
最右推导过程:
S’ S[0] aAcBe[1][0] aAcd[4]e[1][0] aAb[3]cd[4]e[1][0] ab[2]b[3]cd[4]e[1][0]
规约时在栈中的句型的前缀
ab[2] aAb[3] aAcd[4] aAcBe[1] S[0]
规约前可在栈中出现的规范句型(不含
句柄)的前缀
如输入if E then if E then S else S, 分析某一时刻,栈的内容:if E then if E then S 而 else 是下一 token,归约还是移进?
北邮考研复试班-北京邮电大学计算机学院计算机技术专硕考研复试经验分享
北邮考研复试班-北京邮电大学计算机学院计算机技术专硕考研复试经验
分享
北京邮电大学是教育部直属、工业和信息化部共建、首批进行“211工程”建设的全国重点大学,是“985优势学科创新平台”项目重点建设高校,是一所以信息科技为特色、工学门类为主体、工管文理协调发展的多科性、研究型大学,是我国信息科技人才的重要培养基地。2017年,“信息网络科学与技术学科群”和“计算机科学与网络安全学科群”两个学科群进入一流学科建设行列。
学校坚持以习近平新时代中国特色社会主义思想为指导,坚持立德树人根本任务,扎根中国大地办好中国特色社会主义大学。学校始终肩负“传邮万里国脉所系”的家国情怀。自1955年建校以来,经过60多年的建设与发展,学校全日制教育已经形成了信息背景浓郁、专业特色鲜明、学科优势突出的办学格局。学校现设有电子与通信工程学院、电子工程学院、计算机学院、自动化学院、软件学院、数字媒体与设计艺术学院、现代邮政学院、网络空间安全学院、光电信息学院、理学院、经济管理学院、人文学院、马克思主义学院、国际学院、网络教育学院、继续教育学院、民族教育学院、体育部等18个教学单位,以及网络技术、信息光子学与光通信、感知技术与产业3个研究院,可信网络通信2011协同创新中心,并设有研究生院。目前,学科专业已经涵盖理学、工学、文学、法学、经济学、管理学、教育学、哲学、艺术学等9个学科门类,涉及22个一级学科。学校电子与通信工程、智能科学与技术以及电子科学与技术三个一级学科在教育部第四轮学科评估中被评为A类学科,其中电子与通信工程取得了A+的优异成绩。
编译原理
形式语言理论是编译的重要理论基础,重点 介绍如何采用形式化的方法描述程序设计语言。
字母表和符号串
1. 字母表
字母表是元素的非空有穷集合,习惯 上用大写字母表示。
例如,∑={ a, b, c } 根据字母表的定义,Σ是字母表,它由a、b、 c三个元素组成。
形式化语言
例如 对于程序中“赋值语句” 的非形式化的 描述为:
语法:赋值语句由一个变量,后随一个赋值号 “=”,其后面再跟一个表达式构成。
语义:首先计算语句右部表达式的值,然后把 所得结果送给左部变量中。
语用:赋值语句可用来计算和保存表达式的 值。
形式化语言
这种非形式化的描述,不够清晰和准确,为了 精确定义和描述程序设计语言,需采用形式化的 方法。
2.3.1 上下文无关文法
上下文无关文法的定义: 一个上下文无关文法G是一个四元式 G=(VT,VN,S,P),其中 VT:终结符集合(非空); VN:非终结符集合(非空),且VT VN=; S:文法的开始符号,SVN; P:产生式集合(有限),每个产生式形式为: P, PVN, (VT VN)* ; 开始符S至少必须在某个产生式的左部出现一 次。
一个数据类型通常包括以下三种要素:
用于区别这种类型数据对象的属性; 这种类型的数据对象可以具有的值; 可以作用于这种类型的数据对象的操作;
编译原理教程课后习题答案
编译原理教程课后习题答案【篇一:编译原理教程课后习题答案——第一章】
完成下列选择题:
(1) 构造编译程序应掌握
a. 源程序
b. 目标语言
c. 编译方法
d. 以上三项都是
(2) 编译程序绝大多数时间花在上。
a. 出错处理
b. 词法分析
c. 目标代码生成
d. 表格管理
(3) 编译程序是对。
a. 汇编程序的翻译
b. 高级语言程序的解释执行
c. 机器语言的执行
d. 高级语言的翻译
【解答】
(1) d (2) d(3) d
1.2 计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?
【解答】计算机执行用高级语言编写的程序主要有两种途径:解释和编译。
在解释方式下,翻译程序事先并不采用将高级语言程序全部翻译成机器代码程序,然后执行这个机器代码程序的方法,而是每读入一条源程序的语句,就将其解释(翻译)成对应其功能的机器代码语句串并执行,而所翻译的机器代码语句串在该语句执行后并不保留,最后再读入下一条源程序语句,并解释执行。这种方法是按源程序中语句的动态执行顺序逐句解释(翻译)执行的,如果一语句处于一循环体中,则每次循环执行到该语句时,都要将其翻译成机器代码后再执行。
在编译方式下,高级语言程序的执行是分两步进行的:第一步首先将高级语言程序全部翻译成机器代码程序,第二步才是执行这个机器代码程序。因此,编译对源程序的处理是先翻译,后执行。
从执行速度上看,编译型的高级语言比解释型的高级语言要快,但解释方式下的人机界面比编译型好,便于程序调试。
这两种途径的主要区别在于:解释方式下不生成目标代码程序,而编译方式下生成目标代码程序。
编译原理01-本讲教学课件(PDF文档)_4
T
type=array(2, width=24
array(3,int))
B type=int{a}
width=4
C type=array(2, array(3,int)){a}
width=24
int {a}
[ num ] Ctype=array(3,int)
{a} D
enter( i, int, 8 )
⑥B → int { B.type = int; B.width = 4; } ⑦B → real{ B.type = real; B.width = 8; } ⑧C → ε { C.type=t; C.width=w;}
T
type=real width=8
offset = offset + T.width; }D ③D → ε ④T → B { t =B.type; w=B.width;}
C { T.type = C.type; T.width = C.width;} ⑤T → ↑T1{ T.type = pointer( T1.type); T.width = 4; } ⑥B → int { B.type = int; B.width = 4; } ⑦B → real{ B.type = real; B.width = 8; } ⑧C → ε { C.type=t; C.width=w;} ⑨C → [num]C1 { C.type = array( num.val, C1.type);
编译原理及实践教程(黄贤英 王柯柯 编著) 习题答案
第2章参考答案:
1,2,3:解答:略!
4. 解答:
A:① B:③ C:① D:②
5. 解答:
用E表示<表达式>,T表示<项>,F表示<因子>,上述文法可以写为:
E → T | E+T
T → F | T*F
F → (E) | i
最左推导:
E=>E+T=>E+T+T=>T+T+T=>F+T+T=>i+T+T=>i+F+T=>i+i+T
=>i+i+F=>i+i+i
E=>E+T=>T+T=>F+T=>i+T=>i+T*F=>i+F*F=>i+i*F=>i+i*i 最右推导:
E=>E+T=>E+F=>E+i=>E+T+i=>E+F+i=>E+i+i=>T+i+i
=>F+i+i=>i+i+i
E=>E+T=>E+T*F=>E+T*i=>E+F*i=>E+i*i=>T+i*i=>F+i*i =>i+i*i
i+i+i和i+i*i的语法树如下图所示。
i+i+i、i+i*i的语法树
6. 解答:
(1) 终结符号为:{or,and,not,(,),true,false}
非终结符号为:{bexpr,bterm,bfactor}
开始符号为:bexpr
(2) 句子not(true or false)的语法树为:
7. 解答:
(1) 把a n b n c i分成a n b n和c i两部分,分别由两个非终结符号生成,因此,生成此文法的产生式为:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理与技术模拟试题一
一、填空题(20分)
1.1编译程序的工作过程可划分为词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等
阶段,一般在语义分析阶段对表达式中运算对象的类型进行检查。
1.2 递归下降法和预测分析法是自上而下的语法分析方法。
1.3常用日的存储分配策略有静态存储分配和动态存储分配,其中,动态存储分配策略包括栈分配和堆分配。
1.4移进、归约是自下而上或LR 分析中的典型操作。
1.5对于数组M[1..6, 1..8],如果每个元素占k个存储单元,且起始地址为a,则以行为主序存放时元素M[4,4]的地址是__ a+27*k __,以列为主序存放时元素M[4,4]的地址是__ a+21k __。
二、单选题(20分)
2.1词法分析器不能 D 。
A. 识别出数值常量
B. 过滤源程序中的注释
C. 扫描源程序并识别记号
D. 发现括号不匹配
2.2给定文法A→bA|ca, C 是该文法的句子。
A. bba
B. cab
C. bca
D. cba
2.3一个句型中的最左 B 称为该句型的句柄。
A. 短语
B. 直接短语
C. 非终结符号
D. 终结符号
2.4已知文法G[S]:S→A1A→A1|S0|0。与G等价的正规式是 C 。
A. 0(0|1)*
B. 1*|0*1
C. 0(1|10)*1
D. 1(10|01)*0
2.5源程序是句子的集合, B 可以较好地反映句子的结构。
A. 线性表
B. 树
C. 完全图
D. 堆栈
2.6与逆波兰式ab+c*d+对应的中缀表达式是 B 。
A. a+b+c*d
B. (a+b)* c+d
C. (a+b)* (c+d)
D. a+b*c+d
2.7识别上下文无关语言的自动机是 A 。
A. 下推自动机
B. NFA
C. DFA
D. 图灵机
2.8 B 是与规范归约(最左归约)互逆的一个过程。
A. 最左推导
B. 最右推导
C. 词法分析
D. 语义分析
2.9文法G产生的 A 的全体是该文法描述的语言,
A. 句子
B. 短语
C. 终结符
D. 非终结符
2.10在表达式x:=y+1中, A 作为左值出现(其中,“:=”表示赋值)。
A. x
B. y
C. 1
D. y+1
三、简答题(30分)
3.1 (5分)请分别写出传值调用、引用调用方式下,下面代码的输出结果。
program main(input,output)
procedure f(a,b)
begin
a :=
b - a;
b := a * b + 1;
end;
begin
x := 5; y := 10;
f(y,x);
print(x,y);
end.
3.1
传值调用方式:5 10 引用调用方式:-24 -5
3.2 (10分)请计算下面文法G(E)中各非终结符的FIRST 和FOLLOW 集合。请说明该文法为什么不是LL(1)文法。
G(E):E →E
* T | T T →T - F | F F →(E) | id 3.2
FIRST(F) = FIRST(T) = FIRST(E) = { (,id }
FOLLOW(E) = {#,*,)} FOLLOW(T) = {-, *, #,) } FOLLOW(F) = {-, *, #,) }
3.3(10分)下图所示的分析树用到了某个上下文无关文法的所有产生式。 (a) 给出该文法的所有非终结符号集合N 和终结符号集合T 。 (b) 给出该文法的产生式集合。
S
ε
A a
B b S c A c b B d c
3.3
N = {S, A, B} T = {a, b, c, d}
S → aAcB | Bd A → AaB | c B → bScA | b | ε
3.4(5分)某程序执行到某一时刻时控制栈中的内容如下所示(其中M 是主程序,P 、Q 、R 、S 均是过程),给出所有在生存期的活动的调用关系(提示:若A 调用B ,则记为A →B)。
3.4
M → P → R → Q → S → S
四、综合题(40分)
4.1(15分)设有正规式r=1(0|1)*
1,试给出: (a )(5
分)识别该正规集的NFA ;
(b )(10分)识别该正规集的DFA (要有计算过程);
4.1 (a)NFA 如下图所示
(b) s0 = {A}
ε_闭包(s0) = s0 初态
ε_闭包(smove(s0,1)) = {B} 记为s1
ε_闭包(smove(s1,0)) = {B} = s1
ε_闭包(smove(s1,1)) = {B,C} 记为s2,终态
ε_闭包(smove(s2,0)) = {B} = s1
ε_闭包(smove(s2,1)) = {B,C } = s2
DFA如下图所示
4.2(15分)设有上下文无关无法G及其语法制导翻译如下(注:G中终结符id仅由单个英文字母组成,如a, b等):
E→E1*T {E.place=newtemp; emit(*, E1.place, T.place, E.place;}
| T {E.place=T.place;}
T→T1-F {T.place=newtemp; emit(-, T1.place, F.place, T.place;}
| F {T.place=F.place;}
F→(E) {F.place=E.place;}
| id {F.place=;}
(a)(4分)画出句子a-b*c的分析树;
(b)(3分)写出当a=1、b=2、c=3时的计算结果;(*表示算术乘、-表示算术减)
(c)(8分)将文法G简化为:E→E*T|T,T→T-F|F,F→id,给出其识别活前缀的DFA,该DFA的项目集中有冲突吗?若有,是哪种类型的冲突。
4.2(a)
E
E*T
T-F
T
F a b
F
c
(b) -3
(c)拓广文法,增加产生式:S→E,识别活前缀的DFA如下图所示
存在移进-归约冲突