编译原理-第五章习题答案

合集下载

编译原理-第5章-习题与答案2上课讲义

编译原理-第5章-习题与答案2上课讲义

编译原理-第5章-习题与答案2第五章习题5-1 设有文法G[S]:S→A/ A→aA∣AS∣/(1) 找出部分符号序偶间的简单优先关系。

(2) 验证G[S]不是简单优先文法。

5-2 对于算符文法G[S]:S→E E→E-T∣T T→T*F∣F F→-P∣P P→(E)∣i(1) 找出部分终结符号序偶间的算符优先关系。

(2) 验证G[S]不是算符优先文法。

5-3 设有文法G′[E]:E→E1 E1→E1+T1|T1 T1→T T→T*F|F F→(E)|i其相应的简单优先矩阵如题图5-3所示,试给出对符号串(i+i)进行简单优先分析的过程。

题图5-3 文法G′[E]的简单优先矩阵5-4 设有文法G[E]:E→E+T|TT→T*F|FF→(E)|i其相应的算符优先矩阵如题图5-4所示。

试给出对符号串(i+i)进行算符优先分析的过程。

题图5-4 文法G[E]的算符优先矩阵5-5 对于下列的文法,试分别构造识别其全部可归前缀的DFA和LR(0)分析表,并判断哪些是LR(0)文法。

(1) S→aSb∣aSc∣ab(2) S→aSSb∣aSSS∣c(3) S→A A→Ab∣a5-6 下列文法是否是SLR(1)文法?若是,构造相应的SLR(1)分析表,若不是,则阐明其理由。

(1) S→Sab∣bR R→S∣a(2) S→aSAB∣BA A→aA∣B B→b(3) S→aA∣bB A→cAd∣ε B→cBdd∣ε5-7 对如下的文法分别构造LR(0)及SLR(1)分析表,并比较两者的异同。

S→cAd∣b A→ASc∣a5-8 对于文法G[S]:S→A A→BA∣ε B→aB∣b(1) 构造LR(1)分析表;(2) 给出用LR(1)分析表对输入符号串abab的分析过程。

5-9 对于如下的文法,构造LR(1)项目集族,并判断它们是否为LR(1)文法。

(1) S→A A→AB∣ε B→aB∣b(2) S→aSa∣a第5章习题答案25-1 解:(1) 由文法的产生式和如答案图5-1(a)所示的句型A//a/的语法树,可得G中的部分优先关系如答案图5-1(b)所示。

编译原理_第1-5章习题课答案

编译原理_第1-5章习题课答案

(1)以01结尾的二进制数串。 (0 | 1)*01
(2)能被5整除的十进制数。
0|5
| (1|2|3|4|5|6|7|8|9)
(3)包含奇數個1或奇數個0的二進制串
0*1(0|10*1)*|1*0(0|10*1)*
(4)英文字母组成的所有符号串,要求符号串中的 字母按字典序排列。
(A | a)* (B | b)* (C | c)*… (Z | z)*
I00
0 ΦC
0
B {c,d} 1 0
E
1
{c,d} D
{c,d,f}
1
1
{c,d}
{c,d,f}
chapter1~5习题
I1 {b,c,d} 1 {c,dF,e}
{c,d,e} 0 {c,d,e} {c,d,e,g}
{c,d,e}
S
0
A(始态)
Φ
B
C
C
C
D
E
E
C
F(终态)
E
1 B D D D F(终态) D
1(0|1)*101 1(0|1)*101
chapter1~5习题
g
1
a
(0|1)* b
101
d
g
1 a
0
ε
ε
b
c
1
1
0
1
d
e
f
g
编译原理
②.状态转换矩阵
1 a
0
ε
ε
b
c
1
chapter1~5习题
1
0
1
d
e
f
g
I {a} {b,c,d} {c,d} {c,d,e} {c,d,f} {c,d,e,g}

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

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

第7 题证明下述文法G[〈表达式〉]是二义的。

〈表达式〉∷=a|(〈表达式〉)|〈表达式〉〈运算符〉〈表达式〉〈运算符〉∷=+|-|*|/答案:可为句子a+a*a 构造两个不同的最右推导:最右推导1 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉a=>〈表达式〉* a=>〈表达式〉〈运算符〉〈表达式〉* a=>〈表达式〉〈运算符〉a * a=>〈表达式〉+ a * a=>a + a * a最右推导2 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉a=>〈表达式〉〈运算符〉〈表达式〉* a=>〈表达式〉〈运算符〉a * a=>〈表达式〉+ a * a=>a + a * a第8 题文法G[S]为:S→Ac|aB A→ab B→bc该文法是否为二义的?为什么?答案:对于串abc(1)S=>Ac=>abc (2)S=>aB=>abc即存在两不同的最右推导。

所以,该文法是二义的。

或者:对输入字符串abc,能构造两棵不同的语法树,所以它是二义的。

第9 题考虑下面上下文无关文法:S→SS*|SS+|a(1)表明通过此文法如何生成串aa+a*,并为该串构造语法树。

(2)G[S]的语言是什么?答案:(1)此文法生成串aa+a*的最右推导如下S=>SS*=>SS*=>Sa*=>SS+a*=>Sa+a*=>aa+a*(2)该文法生成的语言是:*和+的后缀表达式,即逆波兰式。

第10 题文法S→S(S)S|ε(1) 生成的语言是什么?(2) 该文法是二义的吗?说明理由。

答案:(1)嵌套的括号(2)是二义的,因为对于()()可以构造两棵不同的语法树。

第11 题令文法G[E]为:E→T|E+T|E-T T→F|T*F|T/F F→(E)|i证明E+T*F 是它的一个句型,指出这个句型的所有短语、直接短语和句柄。

编译原理第三版课后习题答案

编译原理第三版课后习题答案

编译原理第三版课后习题答案编译原理是计算机科学中的一门重要课程,它研究的是如何将高级程序语言转换为机器语言的过程。

而《编译原理》第三版是目前被广泛采用的教材之一。

在学习过程中,课后习题是巩固知识、提高能力的重要环节。

本文将为读者提供《编译原理》第三版课后习题的答案,希望能够帮助读者更好地理解和掌握这门课程。

第一章:引论习题1.1:编译器和解释器有什么区别?答案:编译器将整个源程序转换为目标代码,然后一次性执行目标代码;而解释器则逐行解释源程序,并即时执行。

习题1.2:编译器的主要任务是什么?答案:编译器的主要任务是将高级程序语言转换为目标代码,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等过程。

第二章:词法分析习题2.1:什么是词法分析?答案:词法分析是将源程序中的字符序列划分为有意义的词素(token)序列的过程。

习题2.2:请给出识别下列词素的正则表达式:(1)整数:[0-9]+(2)浮点数:[0-9]+\.[0-9]+(3)标识符:[a-zA-Z_][a-zA-Z_0-9]*第三章:语法分析习题3.1:什么是语法分析?答案:语法分析是将词法分析得到的词素序列转换为语法树的过程。

习题3.2:请给出下列文法的FIRST集和FOLLOW集:S -> aAbA -> cA | ε答案:FIRST(S) = {a}FIRST(A) = {c, ε}FOLLOW(S) = {$}FOLLOW(A) = {b}第四章:语义分析习题4.1:什么是语义分析?答案:语义分析是对源程序进行静态和动态语义检查的过程。

习题4.2:请给出下列文法的语义动作:S -> if E then S1 else S2答案:1. 计算E的值2. 如果E的值为真,则执行S1;否则执行S2。

第五章:中间代码生成习题5.1:什么是中间代码?答案:中间代码是一种介于源代码和目标代码之间的表示形式,它将源代码转换为一种更容易进行优化和转换的形式。

5编译原理,陈意云 ,课后答案5

5编译原理,陈意云 ,课后答案5

10
7.5 (续) (续
• (a) *a-+bc • (c) 表达式翻成前缀形式的语法制导定义
E -> E+T | T T -> T*F | F F -> -F | (E) | id L -> En { printf(E.string); } E -> E1 + T { E.string = “+” + E1.string + T.string; } E -> T { E.string = T.string; } T -> T1*F { T.string = “*” + T1.string + F.string; } T -> F { T.string = F.string; } F -> -F1 { F.string = “-” + F1.string; } F -> (E) { F.string = E.string; } F -> id { F.string = id.value; }
2011-3-28
luanj@
8
7.4 (续) (续
• D -> ID_LIST:T ID_LIST -> ID_LIST,ID_LIST|id • D -> { Init(idtable) } ID_LIST:T { for each name in idtable do enter(name, T.type, offset); offset := offset + T.width; end; } ID_LIST -> { Init(idtable1); Init(idtable2) } ID_LIST1,ID_LIST2 { merge(idtable1, idtable2, idtable) } ID_LIST -> id { add(idtable, ); }

编译原理 第5章习题解答

编译原理 第5章习题解答

第五章习题解答5.1 设一NDPDA识别由下述CFG定义的语言,试给出这个NDPDA的完整形式描述。

S→SASCS→εA→AaA→bC→DcDD→d5.2 消除下列文法的左递归:① G[A]:A→BX∣CZ∣WB→Ab∣BcC→Ax∣By∣Cp② G[E]:E→ET+∣ET–∣TT→TF*∣TF/FF→(E)∣i③ G[X]:X→Ya∣Zb∣cY→ Zd∣Xe∣fZ→X e∣Yf∣a④ G[A]:A→Ba|Aa|cB→Bb|Ab|d5.3 设文法G[<语句>]:<语句>→<变量>: = <表达式>|if<表达式>then<语句>|if<表达式>then<语句>else<语句> <变量>→i<表达式>→<项>|<表达式>+<项><项>→<因子>|<项>*<因子><因子>→<变量>|′(′<表达式>′)′试构造该文法的递归下降子程序。

5.4 设文法G[E]:E→ TE'E'→ + E∣εT→ FT'T'→ T∣εF→ PF'F'→ *F∣εP→ (E)∣ a∣^①构造该文法的递归下降分析程序;②求该文法的每一个非终结符的FIRST集合和FOLLOW集合;③构造该文法的LL(1)分析表,并判断此文法是否为LL(1)文法。

5.5 设文法G[S]:S→ SbA∣aAB→ SbA→ Bc①将此文法改写为LL(1)文法;②求文法的每一个非终结符的FIRST集合和FOLLOW集合;③构造相应的LL(1)分析表。

5.6 设文法G[S]:S→ aABbcd∣εA→ ASd∣εB→ SAh∣eC∣εC→ Sf∣Cg∣εD→ aBD∣ε①求每一个非终结符的FOLLOW集合;②对每一个非终结符的产生式选择,构造FIRST集合;③该文法是LL(1)文法。

【编译原理】1-5章课后习题答案精心整理版,可直接缩印

【编译原理】1-5章课后习题答案精心整理版,可直接缩印

第一章1.2 计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么? 【解答】计算机执行用高级语言编写的程序主要有两种途径:解释和编译。

这两种途径的主要区别在于:解释方式下不生成目标代码程序,而编译方式下生成目标代码程序。

从执行速度上看,编译型的高级语言比解释型的高级语言要快,但解释方式下的人机界面比编译型好,便于程序调试。

(在解释方式下,翻译程序事先并不采用将高级语言程序全部翻译成机器代码程序,然后执行这个机器代码程序的方法,而是每读入一条源程序的语句,就将其解释(翻译)成对应其功能的机器代码语句串并执行,而所翻译的机器代码语句串在该语句执行后并不保留,最后再读入下一条源程序语句,并解释执行。

这种方法是按源程序中语句的动态执行顺序逐句解释(翻译)执行的,如果一语句处于一循环体中,则每次循环执行到该语句时,都要将其翻译成机器代码后再执行。

在编译方式下,高级语言程序的执行是分两步进行的:第一步首先将高级语言程序全部翻译成机器代码程序,第二步才是执行这个机器代码程序。

因此,编译对源程序的处理是先翻译,后执行。

)1.3 请画出编译程序的总框图。

如果你是一个编译程序的总设计师,设计编译程序时应当考虑哪些问题? 【解答】编译程序总框图如图1-1所示。

作为一个编译程序的总设计师,首先要深刻理解被编译的源语言其语法及语义;其次,要充分掌握目标指令的功能及特点,如果目标语言是机器指令,还要搞清楚机器的硬件结构以及操作系统的功能;第三,对编译的方法及使用的软件工具也必须准确化。

总之,总设计师在设计编译程序时必须估量系统功能要求、硬件设备及软件工具等诸因素对编译程序构造的影响等。

第二章2.1 正规式M1和M2等价是指:M1和M2所识别的语言集相等。

2.2 什么是扫描器?扫描器的功能是什么?【解答】扫描器就是词法分析器,它接受输入的源程序,对源程序进行词法分析并识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。

5编译原理,陈意云 ,课后答案5

5编译原理,陈意云 ,课后答案5

2019/2/12
luanj@
8
7.4 (续)
• D -> ID_LIST:T ID_LIST -> ID_LIST,ID_LIST|id • D -> { Init(idtable) } ID_LIST:T { for each name in idtable do enter(name, T.type, offset); offset := offset + T.width; end; } ID_LIST -> { Init(idtable1); Init(idtable2) } ID_LIST1,ID_LIST2 { merge(idtable1, idtable2, idtable) } ID_LIST -> id { add(idtable, ); }
编译原理习题课(5)
栾 俊 luanj@ 2019/2/12
7.1
• 把算术表达式 –(a+b)*(c+d)+(a+b-c) 翻译成: (a) 语法树 (b) 有向无环图 (c) 后缀表示 (d) 三地址代码
2019/2/12
luanj@
{ enter(, T.type, offset); offset += T.width; } { T.type = integer; T.width = 4; } { T.type = real; T.width = 8; } { T.type = array(num.val, T1.type); T.width = num.val * T1.width; } { T.type = pointer(T1.type); T.width = 4; }
2019/2/12 luanj@ 11
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

下一页
7
利用语法分析树找短语、直接短语和句柄
▪ 对于短语、直接短语、句柄的寻找,可以检查语 法树中从根结点开始出发向下,找每一非终结符 的所有叶子结点,将这些结点从左到右组成串, 这些串就是该句型的所有短语,其中相对于叶子 结点的直接父结点的短语为直接短语,在树中最 左的直接短语为该句型的句柄。
▪ 直接短语肯定是某个产生式的右部候选式之一。 ▪ 句柄的“最左”特征使得在移进-归约方法中,它
(3)利用项目集闭包和转移函数构造项目集规范族, 以及根据项目集规范族和转移函数构造LR(0)分析表;
(4)根据项目集规范族、转移函数以及非终结符的 FOLLOW集构造SLR(1)分析表。
上一页
下一页
3
本章教学线索
• 1 自下而上分析基本问题
• 1.1 归约的概念 • 1.2 规范归约 • 1.3“移进—归约”分析法的栈实现
▪ 知识点:算符优先分析、LR(0)和SLR(1)分析表 的构造
▪ 深刻理解:规范归约与最右推导、短语、直接短语、 句柄、素短语
▪ 熟练掌握: (1)给出一句型求短语、直接短语、句柄和素短语; (2)FIRSTVT和LASTVT的计算、算符优先分析表
的 构造及根据算符优先分析表进行句子分析的方法;
上一页
下一页
6
1.2 规范归约
短语、直接短语、句柄
令G是一个文法,S是文法的开始符号,假定αβδ是
文法G的一个句型,如果有:
S
αAδ且A
+
β
则称β是句型αβδ相对于非终结符A的短语。
特别是,如果有:
Aβ,则称β是句型αβδ相对于规则
A→β的直接短语,一个句型的最左直接短语称为该 句型的句柄。
上一页
bbcde#
移进
(3) #ab
bcde# 归约,A→b
(4) #aA
bcde#
移进
(5) #aAb
cde# 归约,A→Ab
(6) #aA
cde#
移进
(7) #aAc
de#
移进
(8) #aAcd
e# 归约,B→d
(9) #aAcB
e#
移进
(10) #aAcBe
# 归约, SaAcBe
(11) #S

接受
旦栈顶形成句柄时,就进行归约。这种归约可能持续多 次,直至栈顶不再呈现句柄为止。然后,继续向栈里移 进符号,重复这个过程,直至最终形成如下格局:
栈 输入 #S #
上一页
下一页
11
例:5.3 文法:SaAcBe A bAb B d 句子:abbcde
步骤

输入
动作
(1) #
abbcde#
移进
(2) #a
2 算符优先分析 • 3 LR分析法 • 4 语法分析器的自动产生工具YACC
上一页
下一页
4
Байду номын сангаас
1.1 归约的概念
G =(VT,VN,S,P),α,β ∈(VT∪VN)*, A→β∈P,αAw αβw。
归约的过程是,已知αβw和产生式A→β,用产生式 A→β左部A替换αβw中的β,得到符号串αAw。
2)i(0≤i < n), i rm i+1(i是i+1经过把句柄替换成相应
产生式左部符号而得到的。)
规范归约是关于的一个最右推导的逆过程。(注意:并不是 所有的归约都是规范,比如算符优先分析就不是规范归约,当然 就不是一个最右推导的逆过程)
如果文法G是无二义的,那么,规范推导(最右推导)的逆过 程必是规范归约(最左归约)。
直接短语:T*F和i 句柄:T*F
E
+
T
F
E+T i
T* F
5.2
上一页
E
E +T
T
F
i3 T*F
F
i2
i1
5.1
下一页
9
•规范归约
最右推导过程 中得到的句型
0是假定的一是个文规法范G的归一约个,句如子果。序称列右满句足型:序列n,n-1,…, 1, 1) n= ,0=S ;(从句子规约到文法的开始符号)
从输入符号串出发,每次从被归约的句型中找到一 个产生式的右部,用其左部替换之,得到新的句型,直 至归约到文法的开始符号。
上一页
下一页
5
例子:文法G的产生式定义为:S→aAcBe A→b A→Ab B→d 输入句子为:abbcde 首先看看最右推导:SaAcBeaAcdeaAbcdeabbcde(使用产生式的顺 序为:S→aAcBe B→d A→Ab A→b)
上一页
下一页
12
本章教学线索
• 1 自下而上分析基本问题 2 算符优先分析
2.1算符优先文法及优先表的构造 2.2 算符优先分析算法 2.3 优先函数 2.4 算符优先分析中的出错处理(自学)
• 3 LR分析法 • 4 语法分析器的自动产生工具YACC
上一页
下一页
13
2.1 算符优先文法及优先表的构造
2.1.1 算符文法的定义 设G是一个文法,如果G中不存在形如A及AαBCβ
的中产不生含式有相(其邻中非A终,结B,符C号∈)V,N,即αG,中 右 部(V不N∪含V具T)有*,相且邻其非 终结符号的产生式,则称G为算符文法。
编译原理电子教案 第五章 语法分析—自下而上的分析
本章的主要内容
▪规范归约与最右推导、短语、直接短语、句柄、素短语 ▪算符优先分析 ▪ LR(0)和SLR(1)分析表的构造
与前面章节的主要联系: •最右推导 •NFA通过子集构造法,构造DFA •文法非终结符的Follow集
上一页
下一页
2
本章要求
始终处于符号栈的栈顶。
上一页
下一页
8
例:5.1 P85 文法:
E→T|E+T T→F|T*F
F→i|(E)
句型:i1*i2+i3其中:短语有i1、i2、i3、i1*i2、 i1*i2+i3 直接短语:i1、i2、i3;句柄:i1 例:5.2 P85 文法如上
句型:E+T*F+i
E
短语:E+T*F+i,E+T*F,T*F,i
βw表示一个规范句型,必定是在β归约之前进行的规范归约 得到的结果, (VT∪VN)*,w VT*。
上一页
下一页
10
1.3 “移进—归约”分析法的栈实现
“移进一归约”分析器使用一个栈和一个存放输入符号串 w的缓冲器。分析器的初始状态为: 栈 输入 # w# 工作过程:自左至右把串w 的符号一一移进栈里,一
步骤:1 2 3 4 5 6 7 8 9 10 动作:进 进 规 进 规 进 进 规 进 规
a b A→b b A→Ab c d B→d e S→aAcBe
e
dB B
b
cc c
c
b A A A AA A A
aaaaa
aa a
aS
自底向上分析面临的基本问题: • 如何在句型中找出可规约串? • 找到的可规约串应该规约到哪一个非终结符?
相关文档
最新文档