编译原理(第2版)课后习题答案详解

合集下载

编译原理第二版课后习答案教学文稿

编译原理第二版课后习答案教学文稿

编译原理第二版课后习答案《编译原理》课后习题答案第一章第 1 章引论第 1 题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。

(2)源程序:源语言编写的程序称为源程序。

(3)目标程序:目标语言书写的程序称为目标程序。

(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。

通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。

(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。

(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。

第 2 题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。

答案:一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。

其各部分的主要功能简述如下。

词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。

语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。

语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。

中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。

中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。

目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。

表格管理程序:负责建立、填写和查找等一系列表格工作。

编译原理第二版第五章答案

编译原理第二版第五章答案

第五章第5章自顶向下语法分析方法练习(P99)1.文法S->a|^|(T)T->T,S|S(1) 对(a,(a,a)和(((a,a),^,(a)),a)的最左推导。

(3)经改写后的文法是否为LL(1)的?给出它的预测分析表。

(4)给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。

(1) 对(a,(a,a)的最左推导为:S=>(T)=>(T,S) =>(S,S) =>(a,S) =>(a,(T)) =>(a,(T,S)) =>(a,(S,S))=>(a,(a,S)) =>(a,(a,a))对(((a,a),^,(a)),a) 的最左推导为:S=>(T) =>(T,S) =>(S,S) =>((T),S) =>((T,S),S) =>((T,S,S),S)=>((S,S,S),S) =>(((T),S,S),S) =>(((T,S),S,S),S) =>(((S,S),S,S),S)=>(((a,S),S,S),S) =>(((a,a),S,S),S) =>(((a,a),^,S),S) =>(((a,a),^,(T)),S) =>(((a,a),^,(S)),S) =>(((a,a),^,(a)),S) =>(((a,a),^,(a)),a)(3)改写文法为:0) S->a1) S->^2) S->( T )3) T->S N4) N->, S N5) N->ε对左部为N2的产生式可知:FIRST (->, S N2)={,}FIRST (->ε)={ε}FOLLOW (N2)={)}{,}∩ { )}=Ø所以文法是LL(1)的。

也可由预测分析表中无多重入口判定文法是LL(1)的。

编译原理第二版作业答案_第2章

编译原理第二版作业答案_第2章

第二章 文法和语言p48 4、6(6)、11、 12(2)(6)、18(2)4 证明文法G=({E,O},{(,),+,*,v ,d},P ,E )是二义的,其中P 为 E → EOE | (E) | v | d O → + | * 证明:因为E=〉 EOE EOE = =〉EOEOE EOEOE==〉EOEOv EOEOv = =〉EOE+v=〉EOv+v EOv+v==〉E*v+v E*v+v = =〉v*v+v , 句子v*v+v 有两棵不同的语法树所以文法G 是二义的。

问题:1)只有文字说明,比如v*v+v 有两棵语法树,但没有画出语法树或者最左(最右)推导过程2)给出的是不同句子(v*v+d v+v*d )的语法树 6、已知文法G :E E EE E OO v*v+ vE E E E E O O v+v* v〈表达式〉∷=〈项〉|〈表达式〉+〈项〉〈项〉 ∷=〈因子〉|〈项〉*〈因子〉〈因子〉 ∷=(〈表达式〉)| i试给出下述表达式的推导及语法树(6)i+i*i推导过程:〈表达式〉=〉〈表达式〉+〈项〉 E=〉E+T =〉〈表达式〉+〈项〉*〈因子〉 =〉E+ T*F=〉〈表达式〉+〈项〉* i =〉E+ T*i=〉〈表达式〉+ 〈因子〉* i =〉E+F*i=〉〈表达式〉+ i* i =〉E+i*i=〉〈项〉+ i* i =〉T +i*i=〉〈因子〉+ i* i =〉F +i*i=〉i +i*i =〉i +i*i 共8步推导语法树:〈表达式〉〈表达式〉+〈因子〉 〈项〉i 〈因子〉i〈项〉〈项〉 〈因子〉i*11、一个上下文无关文法生成句子abbaa 的推导树如下:(1)给出该句子相应的最左推导和最右推导 (2)该文法的产生式集合P 可能有哪些元素? (3)找出该句子的所有短语、简单短语、句柄。

(1)最左推导:S=〉ABS=〉aBS=〉aSBBS=〉aBBS =〉abBS=〉abbS =〉abbAa=〉abbaa最右推导:S =〉ABS=〉ABAa=〉ABaa=〉ASBBaa =〉ASBbaa=〉ASbbaa=〉Abbaa=〉abbaa(2)该文法的产生式集合P 可能有下列元素:S →ABS | Aa|e A →a B →SBB|bSABSS B B a 1 a 3b 2 b 1 eAa 2(3)因为字符串中的各字符有相对的位置关系,为了能相互区别,给相同的字符标上不同的数字。

南京邮电大学 编译原理 课后习题答案和讲解2

南京邮电大学 编译原理 课后习题答案和讲解2

南京邮电大学编译原理课后习题答案和讲解2 《编译原理》习题解答P38-39 8、设有文法G[S]:S∷=aAb A∷=BcA | B B∷=idt |ε试问下列符号串(1)aidtcBcAb (3)ab (5)aidtcidtcidtb 是否为该文法的句型或句子。

(1)S?aAb?aBcAb?aidtcAb?aidtcBcAb 句型但不是句子;(3)S?aAb?aBb?aεb?ab 是句型也是句子;(5)S?aAb?aBcAb?aidtcAb?aidtcBcAb?aidtcidtcBb?aidtcidtcidtb句型也是句子。

P39 10、给定文法:S∷=aB | bA A∷=aS | bAA | aB∷=bS | aBB|b 该文法所描述的语言是什么?L(G)={相同个数的a与b以任意次序连接而成的非空符号串}。

P39 11、试分别描述下列文法所产生的语言(文法开始符号为S):(1)S∷=0S | 01 (2)S∷=aaS | bc (3) S:: =aSd | aAdA:: =aAc | bc (4) S:: =ABA:: =aAb | ab B:: =cBd | ε(1) L(G)={0n1| n≥1};(2) L(G)={a2nbc | n≥0};1(3) L(G)={aibcjdk | i, j, k≥1, i=j+k-1};或者 L(G)={aj+k-1bcjdk | j, k≥1};(4) L(G)={anbn cmdm | m≥0, n≥1}。

P39 15. 设文法G规则为:S::=AB B::=a|Sb A::=Aa|bB对下列句型给出推导语法树,并求出其句型短语,简单短语和句柄。

(2)baabaab(2) S A B A a S bb B A Ba b B aa句型baabaab的短语a, ba, baa, baab, baabaab,简单短语a,句柄 aP40 19. 证明下述文法是二义的 1) S::=iSeS|iS|i 3) S::=A|BA::=aCbA|a B::=BCC|a2C::=ba (最简单的就是a为句型)1) 对于句子iiieii可构造两棵不同的语法树,所以证明该文法是二义的。

《编译原理》课后习题答案第二章

《编译原理》课后习题答案第二章
此文法没有多余规则,所以消去左递归后的文法就是G′[S]
4、试为文法G[P]:
P∷=begin S end S∷=A|C
A∷=V:=E C∷=if E then S
E∷=V E∷=E+V V∷=i
采用某种程序设计语言构造递归下降识别程序。
解:由于文法存在左递归,进行文法等价变换,得到等价文法G′[P]:
步骤三检查可得f的值与原有的优先矩阵一致所以上表函数即为所求优先函数bell有向图法形式化步骤一构造布尔矩阵b步骤二使用warshall算法构造布尔矩阵b1521步骤三则优先函数为
第二章
习题1
6.答:省略表示法:{1.3,1.33,1.333…};描述表示法:{1.3i|i=1,2,3…}
7.答:x+={0,12,123,1234…};
最小化:
(2)由e构造转换系统:
去ε弧及无用状态和死状态:
因为现在只有一个状态,所以无需再最小化,此时就是最小化.
13.解:建立方程组如下:
W=Ua+Vb ①
U=Va+c ②
V=Ub+c ③
把③代入②得,U=(Ub+c)a+c
=Uba+ca+c
把它改写成U=(ca+c){ba},因此U=(ca|c){ba} ④
follow(E)={#,)}
follow(E′)={#,)}
follow(T)={#,),+,-}
follow(T′)={#,),+,-}
follow(F)={*,/,#,),+,-}
识别输入符号串i*i-(i+i)/i,则识别过程
步骤 栈 输入 输出
0 #E i*i-(i+i)/i# E∷=TE′

编译原理蒋宗礼课后答案

编译原理蒋宗礼课后答案

编译原理练习
一、对下列语言集合设计CFG, ={a,b}
(1)L={a n b m a2n|n,m>=0}。

(2)所有非空符号串,其首尾字符相同。

(3)所有a的个数大于b的个数的符号串。

(4)由a,b组成的回文串。

二、(1)构造一个能识别所有除以5余2的二进制数的DFA
(2)假设有一自动售货机,接收1元、2元、3元的硬币,出售2元和4元的商品,多投不找零,请构造能实现此功能有限自动机。

三、对于文法G[S],(1)给出至少两个理由说明它不是LL(1)文法。

(2)将文法改写为LL(1)文法,并计算改造后文法的各非终结符的First和Follow集合,构造其预测分析表。

S→bAb|bBa
A→aS|CB
B→b|BC
C→c|cC
三、对于正则表达式0*11,构造一个SLR(1)文法G[S],给出为SLR(1)文法理由:
构造识别文法活前缀的有限自动机,并构造相应的SLR(1)分析表。

编译原理蒋宗礼第二版答案

编译原理蒋宗礼第二版答案

编译原理蒋宗礼第二版答案你是不是正在学习编译原理,手上拿着蒋宗礼老师的第二版教材,为找不到答案而发愁呀?别担心,咱这就一起来看看一些常见问题的答案和解析,帮你把这门课学明白!一、为什么要学习编译原理。

在开始具体的答案讲解之前,咱先得搞清楚为啥要学编译原理。

想象一下啊,你每天用的各种软件,像游戏、办公软件啥的,它们都是用编程语言写出来的。

但是计算机它可看不懂这些编程语言呀,这时候就需要编译原理来帮忙啦。

它就像是一个翻译官,把咱们写的代码翻译成计算机能懂的机器语言,这样计算机才能按照咱们的想法去工作。

比如说,你用C语言写了一个简单的程序,计算两个数的和,编译原理相关的工具就会把这个C语言程序变成计算机能执行的指令,最后算出结果给你。

二、教材常见问题答案及解析。

(一)词法分析部分。

问题:怎么识别一个单词是不是合法的标识符呀?答案:一般来说呢,标识符得符合一定的规则。

比如说,它得由字母、数字和下划线组成,而且不能以数字开头。

就像“abc”“_xyz”这些就是合法的标识符,但是“12a”这种以数字开头的就不行啦。

原因:这是为了让编译器能清楚地区分不同的元素。

如果标识符可以随便乱写,那编译器就搞不清楚哪个是变量名,哪个是函数名啦,就没办法正确翻译程序了。

举例:在一个简单的Python程序里,你定义一个变量 `my_variable = 10` ,这里的 `my_variable` 就是一个合法的标识符,它符合规则,编译器就能正确识别它是一个变量。

(二)语法分析部分。

问题:啥是上下文无关文法呀?答案:简单说就是一种用来描述编程语言语法结构的方法。

它有一组规则,根据这些规则可以生成符合语法的句子。

比如说,一个简单的算术表达式的上下文无关文法可以是这样:- `E -> E + T` (一个表达式可以是一个表达式加上一个项)。

- `E -> T` (一个表达式也可以就是一个项)。

- `T -> T * F` (一个项可以是一个项乘以一个因子)。

编译原理课后习题解答(2)

编译原理课后习题解答(2)

2/7
西北大学 Gong Xq
龙书本科教学版习题解答
仅供教学参考
解答:文法 3) 、4) 、5)有二义性。 证明:3)对文法的句子()(),存在两棵不同的语法分析树如下:
S S
S
(
S ε
)
S ε
S ε
( ε
S
)
S
S ε
(
S ε
)
S ε
S ε
(
S ε
)
S ε
所以文法是二义的。 4)对文法的句子 abab,存在两棵不同的语法分析树如下:
5/7
西北大学 Gong Xq
龙书本科教学版习题解答
仅供教学参考
2.3 节 语法制导翻译
产生式
翻译方案 { E.pre = '+' || E1.pre || T.pre } { E.pre = '-' || E1.pre || T.pre } { E.pre = T.pre } { T.pre = '*' || T1.pre || F.pre } { T.pre = '/' || T1.pre || F.pre } { T.pre = F.pre } {F.pre = id.lexeme} {F.pre = num.value} {F.pre = E.pre} E pre =-9* 52
1)证明:对语法分析树的结点数目使用数学归纳法。 ①归纳基础:当语法分析树有两个结点时,形如
num 11
num 1001
生成的串分别为 11 和 1001,表示的值为 3 和 9,能被 3 整除。 ②归纳步骤: 假设语法分析树的结点数目少于 n 时生成的二进制串的值能被 3 整除, 那么当 结点数目等于 n 时,语法分析树的根有下面两种可能的形式:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
L(G[S])={anbmcm|n>=0,m>=1}
问题14:
已知文法E∷=T∣E+T∣E-T、T∷=F∣T*F∣T/F、F∷=(E)∣i,写出该文法的开
始符号、终结符号集合VT、非终结符号集合VN。
答案:
开始符号:E
VT={+, - , * , / ,(,), i}
VN={E , F , T}
问题15:
variable
2 dx r
procedure 2
过程r的入口5 e
variable 3 dx f
variable 3
dx+1
注意:q和s是并列的过程,所以q定义的变量b被覆盖。
第4题
指出栈顶指针T,最新活动记录基地址指针B,动态链指针DL,静态链指针SL与返回地址RA的用途。
答案:
栈顶指针T,最新活动记录基地址指针B,动态链指针DL,静态链指针SL与返回地址RA的用途说明如下:
Z=>U0=>Z10=>V110=>0110
Z=>V1=>Z00=>U000=>1000
Z=>V1=>Z00=>V100=>0100
问题13:
已知文法G[S]:S∷=AB A∷=aA︱ε B∷=bBc︱bc ,写出该文法描述的语言。
答案:
A∷=aA︱ε描述的语言: {an|n>=0}
B∷=bBc︱bc描述的语言:{,bncn|n>=1}
(2)不允许0开头的偶正整数集合的文法E→NT|D T→FT|G
N→D|1|3|5|7|9 D→2|4|6|8 F→N|0 G→D|0
第6题
要求:
已知文法G:
::=|+
::=|*
::=()|i
试给出下述表达式的推导及语法树。
(5)i+(i+i)
(6)i+i*i
x0=(aaa)0=ε | x0|=0
xx=aaaaaa |xx|=6
调用前的程序从断点开始继续执行。CAL L A
调用过程,完成填写静态链、动态链、返回地址,给出被调用过程的基地址值,送入基址寄存器B中,目标程序的入口地址A的值送指令地址寄存器P中,使指令从A开始执行。
第6题
给出对PL/0语言作如下功能扩充时的语法图和EBNF的语法描述。
(1)扩充条件语句的功能使其为:
第3题
何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系?
答案:
翻译程序是指将用某种语言编写的程序转换成另一种语言形式的程序的程序,如编译程序和汇编程序等。
编译程序是把用高级语言编写的源程序转换(加工)成与之等价的另一种用低级语言编写的目标程序的翻译程序。
解释程序是解释、执行高级语言源程序的程序。解释方式一般分为两种:一种方式是,源程序功能的实现完全由解释程序承担和完成,即每读出源程序的一条语句的第一个单词,则依据这个单词把控制转移到实现这条语句功能的程序部分,该部分负责完成这条语句的功能的实现,完成后返回到解释程序的总控部分再读人下一条语句继续进行解释、执行,如此反复;另一种方式是,一边翻译一边执行,即每读出源程序的一条语句,解释程序就将其翻译成一段机器指令并执行之,然后再读人下一条语句继续进行解释、执行,如此反复。无论
(4)编译程序的前端
(5)后端
(6)遍
答案:
(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)源程序:源语言编写的程序称为源程序。
(3)目标程序:目标语言书写的程序称为目标程序。
(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
程序功能的实现完全由解释程序承担和完成即每读出源程序的一条语句的第一个单词则依据这个单词把控制转移到实现这条语句功能的程序部分该部分负责完成这条语句的能的实现完成后返回到解释程序的总控部分再读人下一条语句继续进行解释执行如此反复
编译原理(第
第1章引论
第1题
解释下列术语:
(1)编译程序
(2)源程序
(3)目标程序
(2)G[S]的语言是什么?
答案:
(1)此文法生成串aa+a*的最右推导如下
S=>SS*=>SS*=>Sa*=>SS+a*=>Sa+a*=>aa+a*
(2)该文法生成的语言是:*和+的后缀表达式,即逆波兰式。
S A c a b S a B b c S S S * S S + a a a
第10题
文法S→S(S)S|ε
错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源程序中的错误时,错误处理程序负责报告出错的位置和错误性质等信息,同时对发现的错误进行适当的校正(修复),目的是使编译程序能够继续向下进行分析和处理。
注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚,就回答八部分。
(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第2题
一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:
N::=0|1|2|3|4|5|6|7|8|9 S S * S S + S a a a S S + S a S * S a a
答案:
(5)
=>+
=>+
=>+()
=>+(+)
=>+(+)
=>+(+i)
=>+(+i)
=>+(+i)
=>+(i+i)
=>+(i+i)
=>+(i+i)
=>i+(i+i)
(6)
=>+
RA:返回地址,记录调用该过程时目标程序的断点,即调用过程指令的下一条指令的地址,用以过程执行结束后返回调用过程时的下一条指令继续执行。
在每个过程被调用时在栈顶分配3个联系单元,用以存放SL,DL,RA。
第5题
PL/0编译程序所产生的目标代码是一种假想栈式计算机的汇编语言,请说明该汇编语言中下列指令各自的功能和所完成的操作。
表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序具有的表格管理功能。
=>+*
=>+*i
=>+*i
=>+i*i
=>+i*i
=>+i*i
=>i+i*i
+
+ i i i()
+ * i i i
第7题
证明下述文法G[〈表达式〉]是二义的。
〈表达式〉∷=a|(〈表达式〉)|〈表达式〉〈运算符〉ห้องสมุดไป่ตู้表达式〉
〈运算符〉∷=+|-|*|/
答案:
可为句子a+a*a构造两个不同的最右推导:最右推导1〈表达式〉〈表达式〉〈运算符〉〈表达式〉〈表达式〉〈运算符〉a〈表达式〉* a〈表达式〉〈运算符〉〈表达式〉* a〈表达式〉〈运算符〉a * a〈表达式〉+ a * a a + a * a
第4题
对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、代码生成)报告的。
(1)else没有匹配的if(2)数组下标越界
(3)使用的函数没有定义(4)在数中出现非数字字符
答案:
(1)语法分析(2)语义分析(3)语法分析(4)词法分析
第5题
编译程序大致有哪几种开发技术?
答案:
题2中当程序编译到r的过程体时的名字表table的内容为:
该文法是否为二义的?为什么?
答案:
对于串abc
(1)S=>Ac=>abc (2)S=>aB=>abc
即存在两不同的最右推导。所以,该文法是二义的。
或者:
对输入字符串abc,能构造两棵不同的语法树,所以它是二义的。
第9题
考虑下面上下文无关文法:
S→SS*|SS+|a
(1)表明通过此文法如何生成串aa+a*,并为该串构造语法树。
设有文法G[S]:S∷=S*S|S+S|(S)|a,该文法是二义性文法吗?
答案:
根据所给文法推导出句子a+a*a,画出了两棵不同的语法树,所以该文法是二义性文法。
问题16:
写一文法,使其语言是奇正整数集合。
答案:
A::=1|3|5|7|9|NA
N::=N0|N1|N2|N3|N4|N5|N6|N7|N8|N9|
x5=aaaaaaaaaaaaaaa | x5|=15
A+ =A1∪A2∪?.∪A n∪?={a,aa,aaa,aaaa,aaaaa?}
A* = A0∪A1∪A2∪?.∪A n∪?={ε,a,aa,aaa,aaaa,aaaaa?}
问题11:
令Σ={a,b,c},又令x=abc,y=b,z=aab,写出如下符号串及它们的长度:xy,xyz,(xy)3
一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。
相关文档
最新文档