西电编译原理_期末样题B
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.填空题(20分)
1.1 (2分)在以阶段划分的编译器中,符号管理表和出错处理两个阶段的工作贯穿于编译器工作始终。
1.2(2分)在语言翻译中,记号需根据词法规则识别,而句子需根据语法规则识别。
1.3(2分)在C源程序中,输入序列 35+; 存在语法错误, 3=a; 存在语义错误。
1.4(1分)若正规式R表示集合L(R)={a, b},且和正规式T等价,则L(T)={a,b} 。
1.5(2分)在语法分析中,语法规则通常是由上下文无关文法(CFG)描述的,所采用的自动机是下推自动机(PAD)。
1.6(2分)在上下文无关文法S→A * S | A A→A + id | id中,运算*比运算+的优先级低,运算*是左结合的。
1.7(1分)在正规文法、上下文无关文法以及上下文有关文法中,只有上下文有关文法(CSG)可以描述语言{a n b n c n|n≥1}。
1.8(2分)在递归下降的语法分析中,文法中的每个非终结符对应一个子程序,每个子程序的过程体按产生式的候选项分情况展开,遇到终结符时匹配,遇到非终结符时调用相应子程序(展开非终结符)。
1.9(2分)对程序语句的翻译主要考虑两类语句:声明语句和可执行语句,其中,对声明语句,主要是将所需要的信息正确地填入合理组织的符号表中;对可执行语句,则是翻译成中间代码。
1.10(1分)布尔表达式的计算可以采用数值表示的直接计算和逻辑表示的短路计算两种方式。
1.11(1分)在算术表达式的翻译过程中,若存在运算对象类型不同的情况,则需要进行类型转换。
1.12(2分)设数组arr[1..5, 1..4]以行为主存放,每个元素占d个存储单元。已知数组首地址为arr,则数组元素arr[2, 3]的地址是arr+6d。
2.简答题(7小题,30分)
2.1(3分)简述编译器与解释器的主要共同点以及工作方式的差异。
共同点:均是完成对源程序的翻译。
差异:解释器边翻译边执行,编译器先翻译后执行。
2.2(4分)说明DFA 与NFA的主要差异。
DFA没有ɛ状态转移
DFA,在任一状态下,对于任一输入,其下状态最多只有一个。
它们所描述的语言。
R1 = a(a|b)*a
R2 = (a|b)*abb(a|b)*
R1:以a 开头以a 结尾,中间任意长度的a ,b 串。
R2:至少含有一个abb 子串的a ,b 串。
2.4(4分)举例说明下述文法G 是二义的,并说明消除文法二义性的方法有哪些。
G :S →S or S | S and S | id
存在左递归,左因子
如id or id or id
存在两棵不同的分析树,因此G 是二义性的。
消除二义性的方法
1. 改写文法
2. 为文法中的符号规定优先级和结合性
注:附本题改写
G :S →idS ’
S ’→or S S ’ | and S S ’ | ɛ
2.5(5分)下述文法G 为什么不是LL(1)的?请将其改写为LL(1)的。
G : E →E * T | T
T →T / num | num
文法中存在直接左递归,所以G 不是LL (1)文法
改写
G : E →TE ’
E ’→*TE ’|ɛ
T →numT ’
T ’→/ numT ’ | ɛ
2.6(3分)简要说明在编译过程中引入中间代码的好处,以及中间代码应具有的特点。
好处:
1. 便于编译程序的开发和移植
2. 便于代码进行优化处理
特点: 便于语法制导翻译,即与机器指令的结构相近,又与具体机器
无关。 2.7(5分)设&和%为二元运算,~为一元运算,其优先级从高到
低依次为~、&、%,结合性为:&和%是左结合,~是右结合。请画出表达式“~a % b & ~c ”的语法树,并给出其后缀式。
S S id S or or S id S id
S S id S or or S id S id %b ~a &
3.计算题(4小题,50分)
3.1 (15分)给定正规式R = (0|1)*1(0|1)
(1)(5分)构造识别L(R)的NFA N;
(2)(7分)用“子集法”把N确定化,得到识别L(R)的DFA D;(3)(3分)如果D不是最简DFA,请找出最简DFA。
3.2(10分)已知某文法G如下所示,其中,S、A、B为非终结符且S为开始符号。
G:S→AB
A→aA|bA|ε
B→cB |ε
(1)(6分)计算各非终结符的FIRST与FOLLOW集合;
FIRST(S)={ a|b|c|ɛ}
FIRST(A)={a|b|ɛ }
FIRST(B)={c|ɛ }
FOLLOW(S)={ # }
FOLLOW(A)={ c,# } (tips:FOLLOW(B)∪FIRST(B))
FOLLOW(B)={ # }
(2)(4分)根据前面的计算结果说明在基于预测分析器的语法分析过程中,当要展开的非终结符为A时,如何根据输入的下一个终结符选择具体的候选项。
若输入a则按aA展开,输入b按bB展开,输入为c和#按ɛ展开
3.3(12分)已知某文法G如下所示,其中,S、A、B为非终结符且S为开始符号。
G : S→AB
A→aAb|ab
B→c |Bc
(1)(8分)拓广该文法并构造其基于LR(0)项目的、识别活前缀的DFA;
(2)(4分)G是SLR(1)文法吗?为什么?