编译原理作业集-第二章

编译原理作业集-第二章
编译原理作业集-第二章

第二章高级语言及其语法描述

本章要点

1. 程序语言的定义;

2. 高级程序语言一般结构和主要共同特征;

3. 正确理解上下文无关文法基本概念,包括:

文法的定义、推导、句型、句子、语言、语法树、二义性等;

4. Chomsky文法分类;

本章目标

掌握和理解程序语言的定义、高级语言的一般特征及程序语言的语法描述。

本章重点

1. 语法,词法规则与语法规则;

2. 语义和语义规则;

3. 数据类型与操作;

4. 推导,最左推导和最右推导;

5. 语法分析树和二义性;

本章难点

1. 二义性文法;

2. Chomsky各个文法类;

作业题

一、单项选择题:

(按照组卷方案,至少15道小题)

1. Chomsky把文法分成四种类型,0型、1型、2型和3型。3型文法也称为,2型文法也称为。

a.上下文无关文法

b.上下文相关文法

c.正则文法

d.短语文法

2. 许多广为使用的语言,如Fortran、C、Pascal等,属于。

a. 强制式语言

b. 应用式语言

c. 基于规则的语言

d. 面向对象的语言

3. 设G是一个文法,S是开始符号。若S?*α,α∈(V T∪V N)*,则称α是一个。

a. 句子

b. 句型

c. 推导

d. 语言

4. 一个数据类型通常包括的三种要素中,没有下面的。

a. 用于区别这种类型的数据对象的属性;

b. 这种类型的数据对象可以具有的值;

c. 对这种类型的数据对象的内存分配;

d. 可以作用于这种类型的数据对象的操作;

5. Chomsky把文法分成四种类型,其中,也称正规文法

a. 0型

b. 1型

c. 2型

d. 3型

6. 语言的词法规则一般用Chomsky的型文法来描述:

a. 0

b. 1

c. 2

d. 3

7. 文法

S→(L)|a

L→L,S|S

中,下面是该文法中的终结符号。

a. S

b. ,

c. L

d. |

8. 文法G所描述的语言是的集合。

a. 文法G的字母表∑中的所有符号组成的符号串;

b. 文法G的字母表∑的闭包∑*中的所有符号串;

c. 文法G的识别符号推出的所有符号串;

d. 文法G的识别符号推出的所有终结符号串;

9. 语言L={αcα | α∈(a|b)*},该语言是_____________语言。

a. 3型语言,

b. 2型语言,

c. 1型语言,

d. 0型语言

10. 设有文法G:

I→I1 | I0 | Ia | Ic | a | b | c |

下面符号串中不是该文法的句子是:

a. ab0,

b. a0c01,

c. aaa,

d. bc10

11. 给定文法A→bA|cc,下面的符号串中,是该文法句子的是________。

a. bcbc,

b. bbbcc,

c. bcbcc,

d. bccbcc;

12. Chomsky定义的四种形式语言文法中,2型文法可由(G )识别。

a. 图灵机;

b. 确定性有限自动机;

c. 下推自动机;

d. 非确定性有限自动机;

13. 若文法G定义的语言是无限集,则文法必然是。

a. 上下文无关的

b. 递归的

c. 二义性的

d. 无二义性的

14. 文法S→aaS|abc 定义的语言是。

a. {a2k bc|k>0}

b. {a k bc|k>0}

c. {a2k-1bc|k>0}

d. {a k a k bc|k>0}

15. 文法:G:S→xSx | y所识别的语言是()。

a. xyx

b. (xyx)*

c. x*yx*

d. x n yx n(n≥0)

一.答案:1. c.;2. a.;3. b;4. c;5. d;6. d;7. b;8. d;9. d;10. a;11. b;12. c;13. b;

14. c;15. d;

二、填空题:

(按照组卷方案,至少15道小题)

1. 假设G是一个文法,α是由终结符和非终结符组成的串,S是文法的开始符号,如果S=>*α,则称α是。

2. 在赋值语句中,赋值号‘:=’左右两边的变量名扮演着两种不同的角色,为了区分一个名字的这两种特征,我们把一个名字所代表的称为该名的左值,把一个名字的称为该名字的右值。

3. 对于文法G,仅含终结符号的句型称为。

4. 设有文法G[S],其部分产生式:

E→E+T | T

T→T*F | F

F→(E) | a

则V N ={ },V T={ }。

5. 由文法产生的集合是文法产生的语言。

6. Chomsky语法定义的3型文法又可以分为。

7. 一个上下文文法G的四个组成部分分别是:。

8. 已知语言:{a n b n a m b m|n,m≥0},其语法定义为:G=({a,b},{S,A,B},S,P),其中P为:。

9. 已知某语言的语法定义为:G=({a},{S}S, P ),且P: S→aS | ε,则该语言为。

10. 已知某语言为{ωcw R|ω∈{a,b}*},其语法定义为G=({a,b,c},{S},S,P),其中P 为:。

11. 所谓最右推导是指。

12. 已知文法G(Z):

E→ET+|T

T→TF*|F

F→FP↑|P

P→E|i

试写出其识别的一个句子:_____________________。

13. 文法G[S]:S→aA|a, A→aS为_______型文法,其确定的语言的为:_______ 。

14. 在一棵语法树生长过程中的任何时刻,就是一个句型。

15. 我们说G=(V T,V N,S,P)是一个0型文法,如果它的每一个产生式α→β是这样一种结构:。

二.答案:1. 句型;2. 单元的地址(或者:单元、存储单元的地址),值(或者:单元的内容)3. 句子;4. V N={E,T,F},V T={+,*,(,),a};5. 句子;6. 右线性文法和左线性文法;7. 开始符号,产生式集合,终结符集合,非终结符集合;8. S→AB;A→aAb|ε;B→aBb|ε;

9. {a n|n≥0};10. S→aSa|bSb|ε;11. 任何一步α?β都是对α中的最右非终结符进行替换。12. iii↑*+;13. {a2n+1|n≥0};14. 所有那些没有后代的末端结点从左到右排列起来;15. α∈(V N∪V T)*且至少含有一个非终结符,而β∈(V N∪V T)*。

三、判断题:

(按照组卷方案,至少15道小题)

1. 一棵语法树表示了一个句型所有的不同推导过程,包括最右推导和最左推导。()

2. 可能有两个不同的文法G和G′,期中一个是二义的而另一个是无二义的,但是却有L(G)=L(G′)。()

3. 变量既持有左值又持有右值,而常数和带有算符的表达式一般认为只持有右值。()

4. 文法G:

S→bA

A→aA|a

定义的语言是所有以b开头的后跟至少一个a的字符串的集合。()

5. 设有文法G:

S→S*S | S+S | (S) | a

该文法是二义的。()

6. 正则文法一定不是二义的。()

7. 上下文无关文法可以产生语言L={ a n b n c i | i>=1,n>=1 }。()

8. 不存在任何正规文法能产生语言L={a n b n | n>=1}。()

9. 对于每一个左线性文法G1,都存在一个右线性文法G2,使得L(G1)=L(G2)。()

10. 正规文法产生的语言都可以用上下文无关文法来描述。()

11. 上下文无关文法比正规文法有更强的描述能力。()

12. 文法的二义性和语言的二义性在概念上是相同的,也就是说,对于某个语言,不可能存在两个以上的文法来描述它。()

13. 二义性是可以判定的,也就是说,可以编这么一个程序,输入该文法后,该程序能确切地给出该文法是否二义的答案。()

14. 说明语句旨在定义名字的性质。编译程序把这些性质登记在符号表中,并检查程序中名字的引用和说明是否一致。实际上,许多说明语句并不能翻译成相应的目标代码。()

15. C语言是一个允许子程序嵌套定义的语言。()

三.答案:1. √;2. √;3. √;4. √;5. √;6. ×;7. √;8. √;9. √;10. √;11. √;12. ×;13. ×;14. √;15. ×;

四、名词解释:

(按照组卷方案,至少3道小题)

1. 二义性文法;

2. 推导和直接推导;

3. 句型,句子和语言;

4. 上下文无关文法;

5. 语法;

6. 正规文法(左线性文法和右线性文法);

四.答案:

1. 如果一个文法存在某个句子对应两棵以上不同的语法树,则称这个文法是是二义性文法。

2. 设A→γ是一个产生式,且α、β∈(VT?VN)*,若αAβ=>αγβ,则称αAβ直接推出αγβ;或者说,αγβ是αAβ的一个直接推导。

如果α1=>α2=>……=>αn,则称这个序列是从α1到αn的一个推导。

3. 设G是一个文法,S是它的开始符号。如果S=>*α,则称α是一个句型。

仅含终结符的句型叫句子。

文法G所产生的句子的全体叫文法G的语言,记为L(G),L(G)={α| S=>*α,α∈V T*}。

4. 上下文无关文法G是一个四元式(V T,V N,S,P),其中:

V T是一个非空有限集合,其中的每一个元素称为终结符;

V N是一个非空有限集合,其中的每一个元素称为非终结符,V N∩V T=?;

S是一个非终结符,称为开始符号;

P是一个产生式有限集合,每个产生式的形式是P→α,其中P∈V N,α∈(V T?V N)*。开始符号S至少必须在某个产生式的左部出现一次。

5. 若文法G= (V T,V N,S,P)的任何产生式为A→αB或A→α,其中,α∈V T*,A,B∈V N,则称G是右线性文法;

若文法G= (V T,V N,S,P)的任何产生式为A→Bα或A→α,其中,α∈V T*,A,B∈V N,则称G是左线性文法;

左线性文法和右线性文法均为正规文法。

五、简答题:

(按照组卷方案,至少3道小题)

1. 作为描述程序语言的上下文无关文法,对它有哪些限制?

答:

第一点:文法中不含任何下面形式的产生式:P→P;

第二点:每个非终结符P都必须有用处。也就是说,必须存在含P的句型;或者说,对P 不存在永不终结的回路。

2. 什么是二义性文法?从输入串abab来说明下面文法二义吗?

S→aSbS|bSaS|ε

该文法产生的语言是什么?

答:

如果一个文法存在某个句子对应两棵以上不同的语法树,则称这个文法是二义的。

例如输入串abab,它有两棵语法树如下:

所以,该文法是二义的。

此文法产生的语言是:所有a 的个数与b 的个数相等的由a 和b 组成的字符串。 3. 文法 G[S]为:

S →Ac|aB A

→ab

B →bc

该文法是否为二义的?为什么? 答: 对于串 abc

(1)S=>Ac=>abc (2)S=>aB=>abc

即存在两不同的最右推导。所以,该文法是二义的。 或者:

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

4已知文法G=({A,B,C},{a,b,c},P ,A), P 由以下产生式组成:

A →abc A →aBbc

Bb→bB

Bc→Cbcc

bC→Cb

aC→aaB

aC→aa

此文法所表示的语言是什么?

答:

分析文法的规则:

每使用一次Bc→Cbcc,b、c的个数各增加一个;

每使用一次aC→aaB或aC→aa, a的个数就增加一个;

产生式Bb→bB、bC→Cb起连接转换作用。

由于A是开始符号,由产生式A→abc推导得到终结符号串abc;由产生式A→aBbc推导得到B后,每当使用产生式Bb→bB、Bc→Cbcc、bC→Cb、aC→aaB就会递归调用B一次,所产生的a、b、c的个数分别增加一个,因此推导所得的终结符号串为abc、aabbcc、aaabbbccc、…所以文法描述的语言为{ a n b n c n|n>0}.

5已知文法G[Z]:

Z→0U|1V

U→1Z|1

V→0Z|0

(1)请写出此文法描述的只含有4个符号的全部句子。

(2)G[Z]产生的语言是什么?

(3)该文法在Chomsky文法分类中属于几型文法?

答:

(3)该文法属于3型文法。

七、应用题:

1. 试分析下面给出的if-then-else语句的文法,它的提出原本是为了矫正dangling-else(else 悬挂)文法的二义性:

stmt→ if expr then stmt | matched-stmt

matched-stmt→ if expr then matched-stmt else stmt | other

expr→e

考虑句子if e then if e then other else if e then other else other,试说明此文法仍然是二义性的。

答:

1. 考虑句子if e then if e then other else if e then other else other

它具有如下所示的两种分析树

则上面给出的if-then-else文法仍是二义性的。

2. 考虑文法G[bexpr]:

bexpr→bexpr or bterm | bterm

bterm→bterm and bfactor | bfactor

bfactor→not bfactor| ( bexpr ) | true | false

(a) 请指出此文法的终结符号、非终结符号和开始符号。

(b) 试对于句子not(true or false)构造一棵分析树。

(c) 试说明此文法所产生的语言是全体布尔表达式。

答:

(a) 终结符号为:{or, and, not, (, ), true, false}

非终结符号为:{bexpr, bterm, bfactor}

开始符号为:bexpr

(b) 句子not(true or false)的分析树为:

(c) 用归纳法说明如下:

(1) 不含运算的布尔表达式,常数true和false由此文法产生:

bexpr => bterm => bfactor => true

bexpr => bterm => bfactor => false

(2) 设结论对于少于n(n≥1)个运算的布尔表达式成立,即

若be1和be2是含有少于n个运算的布尔表达式,则有:bexpr=>+be1,bexpr=>+be2。

(3) 对于含有n个运算的布尔表达式,可表示成下面三种

形式:

(a) (be1) or (be2)

(b) (be1) and (be2)

(c) not (be1)

对于(a):bexpr => bexpr or bterm

=> bterm or bterm => bfactor or bterm

=> (bexpr) or bterm =>+(be1) or bterm

=> (be1) or bfactor => (be1) or (bexpr)

=>+ (be1) or (be2)

同理,有:

Bexpr=>+ (be 1) and (be 2) Bexpr=>+ not (be 1)

综上所述,此文法所产生的语言是全体布尔表达式。 3. 已知文法G[S],其产生式为:S →(S)| ε

(a )L(G)是什么?

(b )对于(a)的结果,请给出证明。 答:

(a) 解:0}n |){(L(G )n

n

≥= (b)证明:

首先证明0}n |){(L(G )n n

≥? 对推导次数进行归纳

1):当推导次数为1时,使用产生式S →ε,此时左括号与右括号个数为0 2):假设推导次数为n 时(a)成立,即: 1

n 1

n 1

n 1

n ...)))(((......)))S (((...S ----+

??

则推导次数为n+1次时,多使用一次产生式S →(S)即:

n

n

n

n

1

n 1

n ...)))(((......)))S (((......)))S (((...S ???--+

推导次数为n+1次时(a)成立。

根据(1)(2)可得:0}n |){(L(G )n

n

≥? 其次证明L(G )0}n |){(n

n

?≥ 对n 进行归纳

1):当n=0时,使用产生式S →ε 即可;

2):假设当n=k 时,结论成立,即L(G ))(k

k

∈,下面证n=k+1时结论成立。 由L(G ))(k

k

∈,其推导过程如下:

k

k

k

k

...)))(((......)))S (((...S ??+

当n=k+1时,推导过程如下:

1

k 1k 1k 1k k k ...)))(((......)))(((...S ...)))S (((...S +++++

???

故L(G ))(1

k 1k ∈++

根据(1)(2)可得:L(G )0}n |){(n

n

?≥ 根据1,2可知:0}|){(L(G )n

n

≥= 4. 试构造生成下列语言的上下文无关文法: (1) { a n b n c i | n≥1, i≥0 }

(2) { w | w ∈{a,b}+,且w 中a 的个数恰好比b 多1 } (3) { w | w ∈{a,b}+,且|a|≤|b|≤2|a| } 答:

(1)把a n b n c i 分成a n b n 和c i 两部分,分别由两个非终结符号生成,因此,生成此文法的产生式为: S → AB A → aAb|ab B → cB|ε

(2)令S 为开始符号,产生的w 中a 的个数恰好比b 多一个,令E 为一个非终结符号,产生含相同个数的a 和b 的所有串,则产生式如下: S → aE|Ea|bSS|SbS|SSb E → aEbE|bEaE|ε

(3) 设文法开始符号为S ,产生的w 中满足|a|≤|b|≤2|a|。因此,可想到S 有如下的产生式 (其中B 产生1到2个b ): S → aSB S|BSaS|ε B → b|bb

5. 已知文法G[S]:

S→AB

A→aA|a

B→bB|b

求该文法所定义的语言。

答:

从规则2可推出: a,aa,aaa,……

从规则3可推出: b,bb,bbb,……

再从规则1可推出句子:

ab, aab, aabb, aaab, abbb,……

即,从S出发可推出多个a后跟多个b的字符串,且a的个数与b的个数不尽相同。故:L(G)={a m b n| m,n≥1}

6. 考虑下面上下文无关文法G[S]:

S→SS*|SS+|a

(1) 对于符号串aa+a*分别给出最左推导和最右推导过程,并为该串构造语法树。

(2)G[S]的语言是什么?

答:

(1)此文法生成串aa+a*的最右推导:

S=>SS*=>SS*=>Sa*=>SS+a*=>Sa+a*=>aa+a*

此文法生成串aa+a*的最左推导:

S=>SS*=>SS+S*=>*=>aS+S*=>aa+S*=>aa+a*

(2)该文法生成的语言是:*和+的后缀表达式,即逆波兰式。

7 令文法G为

N→D | ND

D→0 | 1 | 2 | 3 | 4 | 5 | 6| 7 | 8 | 9

(1) G的语言L(G)是什么?

(2) 给出句子0127、34和568的最左推导和最右推导。

答:

(1)

∵N N?ND?NDD?NDDD?NDDDD……?DD……D

∴L(G)={d(n+1)|n≥0, d∈{0, 1, …, 9}}

允许以0开头的自然数(十进制无符号整数);

(2)

0127最左推导:N?ND?NDD?NDDD?DDDD?0DDD?01DD?012D?0127

0127最右推导:N?ND?N7?ND7?N27?ND27?N127?D127?0127

8 写一个文法,使其语言是奇数集,且每个奇数不以0开头。

答:(首先分析题意,本题是希望构造一个文法,由它产生的句子是奇数,并且不以0开头,也就是说它的每个句子都是以1、3、5、7、9中的某个数结尾。如果数字只有一位,则1、3、5、7、9就满足要求,如果有多位,则要求第1位不能是0,而中间有多少位,每位是什么数字(必须是数字)则没什么要求,因此,我们可以把这个文法分3部分来完成。分别用3个非终结符来产生句子的第1位、中间部分和最后一位。

引入几个非终结符,其中,一个用作产生句子的开头,可以是1-9之间的数,不包括0;一个用来产生句子的结尾,为奇数;另一个则用来产生以非0整数开头后面跟任意多个数字的数字串,进行分解之后,这个文法就很好写了。)

令S表示不以0开始的奇数集合。

S → 〈奇数头〉〈整数〉〈奇数尾〉|〈奇数头〉〈奇数尾〉|〈奇数尾〉

〈奇数尾〉→ 1|3|5|7|9

〈奇数头〉→ 2|4|6|8|〈奇数尾〉

〈整数〉→ 〈整数〉〈数字〉|〈数字〉

〈数字〉→ 0|〈奇数头〉

9写一个上下文无关文法CFG,使其语言是能被5整除且不以0开头的无符号整数的集合。(如{5,10,15,….})

答:

能被5整除的数从形式上看,是以0和5结尾的数字串。题目要求的不以0开头,并要注意0不是该语言的句子。所求文法为:

G(S):S→MF|5

F→5|0

M→MD|N

D→N|0

N→1|2|3|4|5|6|7|8|9

10证明下面的文法是二义的:

S→iSeS|iS|i

答:(根据文法的二义性的定义,如果要证明该文法是二义的,必须找到一个句子,使得该句子具有两个不同的最右推导或两个不同的语法树。我们首先分析这个文法,根据我们对程序语言的了解,不难发现,这个文法应该是用来表示if….else….结构的(用“i”代表“if”或语句集,“e”代表“else”)。因此我们就要到if….else…结构中去找二义性。我们知道,程序语言一般都规定else部分是和它前面离它最近的没有被匹配的的if语句进行匹配。而上面的这个文法体现不出这种限制,因此我们可以找这样一个句子,在else前面有两个if (如句子iiiei),else和不同的if进行匹配时就会产生不同的语义。)

解答:

考虑句子iiiei,存在如下两个最右推导:

S => iSeS => iSei => iiSei => iiiei

S => iS => iiSeS => iiSei => iiiei

11 某程序设计语言的表达式由运算符θ1、θ2、θ3、标识符、(、)组成,其中θ1和θ2的优先级相同,θ3的优先级低于θ1、θ2的优先级,优先级相同的运算符从右往左计算,可以用括号改变运算的顺序,则下述四种文法中哪一个可以描述上述的表达式文法?

设E为识别符号,终结符号集={θ1、θ2、θ3、(、)、I},非终结符号集={E、T、F}。

a. E→T|Eθ1T|Eθ2T

T→F|Tθ3F

F→(E)|I

b. E→T|Tθ1E|Tθ2E

T→F|Fθ3T

F→(E)|I

c. E→T|Eθ3T

T→F|Tθ1F|Tθ2F

F→(E)|I

d. E→T|Tθ3 E T→F|Fθ1T|Fθ2T F→(E)|I

答:

(对于一个包含运算符的语言,运算符的结合顺序、运算符的优先级在文法中反映为递归的方向和推导(或规约)的先后,左递归表明左边的运算先处理,对应的运算符左结合;右递归表明右边的运算先处理,对应的运算符右结合。两个运算符连续出现,后推导出(或先被规约)的,表明其运算先被处理,因此优先级高;反之,先推导出(或后被规约)的,表明其运算后被处理,因此优先级低。) 题意要求:θ1和θ2的优先级相同,θ3的优先级低于θ1、θ2的优先级,因此θ3比θ1、θ2先推导出来,即应为图3所示的四种情形。

U

U

θ3 U V

V

(1)

θ1

U

U

θ3 U V

V (2)

θ1

U

U θ3 U V

V

(3)

θ2

U

U

θ3 U V

V

(4)

θ2

图3可能的文法推导顺序 因此a 和b 不成立。

又因为优先级相同的运算符从右往左计算,应采用右递归,即应为图4所示的情形。

U

U

1 V W

V

(1)

θ1

U

U

2 V W

V

(2

θ2

U

U

θ3 V W

V

(3)

θ3

图4可能的文法递归结构 故c 不成立,应为d 。

编译原理第一章习题解答(可编辑修改word版)

第一章习题解答 2.编译程序有哪些主要构成成分?各自的主要功能是什么? 编译程序的主要构成成分有:词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、表格管理程序及出错处理程序。 (1)词法分析程序:从左到右扫描源程序,识别单词及其有关属性; (2)语法分析程序:分析源程序的结构, 判别它是否为相应程序设计语言中的一个合法程序; (3)语义分析程序:审查源程序有无语义错误,为代码生成阶段收集类型信息; (4)中间代码生成程序:将源程序变成一种内部表示形式; (5)代码优化程序:对前阶段产生的中间代码进行变换或进行改造,使生成的目标代码更为高效; (6)目标代码生成程序:把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码; (7)表格管理程序:保存编译过程中的各种信息; (8)出错处理程序:若编译过程中发现源程序存在错误,则报告错误的性质和错误发生的地点,有些还可以自动校正错误。 3.什么是解释程序?它与编译程序的主要不同是什么? 解释程序接受某个语言的程序并立即运行这个源程序。它的工作模式是一个个的获取、分析并执行源程序语句,一旦第一个语句分析结束,源程序便开始运行并且生成结果,它特别适合程序员交互方式的工作情况。 而编译程序是一个语言处理程序,它把一个高级语言程序翻译成某个机器的汇编或二进制代码程序,这个二进制代码程序再机器上运行以生成结果。 它们的主要不同在于:解释程序是边解释边执行,解释程序运行结束即可得到该程序的运行结果,而编译程序只是把源程序翻译成汇编或者二进制程序,这个程序再执行才能得到程序的运行结果。(当然还有其他不同,比如存储组织方式不同)

蒋立源 编译原理第三版第二章 习题与答案(修改后)

第2章习题 2-1 设有字母表A1 ={a,b,c,…,z},A2 ={0,1,…,9},试回答下列问题: (1) 字母表A1上长度为2的符号串有多少个? (2) 集合A1A2含有多少个元素? (3) 列出集合A1(A1∪A2)*中的全部长度不大于3的符号串。 2-2 试分别构造产生下列语言的文法: (1){a n b n|n≥0}; (2){a n b m c p|n,m,p≥0}; (3){a n#b n|n≥0}∪{c n#d n|n≥0}; (4){w#w r# | w∈{0,1}*,w r是w的逆序排列 }; (5)任何不是以0打头的所有奇整数所组成的集合; (6)所有由偶数个0和偶数个1所组成的符号串的集合。 2-3 试描述由下列文法所产生的语言的特点: (1)S→10S0S→aA A→bA A→a (2)S→SS S→1A0A→1A0A→ε (3)S→1A S→B0A→1A A→C B→B0B→C C→1C0C→ε (4)S→aSS S→a 2-4 试证明文法 S→AB|DC A→aA|a B→bBc|bc C→cC|c D→aDb|ab 为二义性文法。 2-5 对于下列的文法 S→AB|c A→bA|a B→aSb|c 试给出句子bbaacb的最右推导,并指出各步直接推导所得句型的句柄;指出句子的全部短语。

2-6 化简下列各个文法 (1) S→aABS|bCACd A→bAB|cSA|cCC B→bAB|cSB C→cS|c (2) S→aAB|E A→dDA|e B→bE|f C→c AB|dSD|a D→eA E→fA|g (3) S→ac|bA A→c BC B→SA C→bC|d 2-7 消除下列文法中的ε-产生式 (1) S→aAS|b A→cS|ε (2) S→aAA A→bAc|dAe|ε 2-8 消除下列文法中的无用产生式和单产生式 (1) S→aB|BC A→aA|c|aDb B→DB|C C→b D→B (2) S→SA|SB|A A→B|(S)|( ) B→[S]|[ ] (3) E→E+T|T T→T*F|F F→P↑F|P P→(E)|i 第2章习题答案 2-1 答: (1) 26*26=676 (2) 26*10=260 (3) {a,b,c,...,z, a0,a1,...,a9, aa,...,az,...,zz, a00,a01,...,zzz},共有26+26*36+26*36*36=34658个 2-2 解: (1) 对应文法为G(S)=({S},{a,b},{ S→ε| aSb },S) (2) 对应文法为G(S)=({S,X,Y},{a,b,c},{S→aS|X,X→bX|Y,Y→cY|ε },S) (3)对应文法为G(S)=({S,X,Y},{a,b,c,d,#}, {S→X,S→Y,X→aXb|#, Y→cYd|# },S)

编译原理第二章-课后题答案

第二章 3.何谓“标志符”,何谓“名字”,两者的区别是什么? 答:标志符是一个没有意义的字符序列,而名字却有明确的意义和属性。 4.令+、*和↑代表加、乘和乘幂,按如下的非标准优先级和结合性质的约定,计算1+1*2↑2*1↑2的值。 (1)优先顺序(从高到低)为+、*和↑,同级优先采用左结合。 (2)优先顺序为↑、+、*,同级优先采用右结合。 答:(1)1+1*2↑2*1↑2=2*2↑2*1↑2=4↑2*1↑2=4↑2↑2=16↑2=256 (2)1+1*2↑2*1↑2=1+1*2↑2*1=1+1*4*1=2*4*1=2*4=8 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)由0到9的数字所组成的长度至少为1的字符串。即:L(G6)={d n|n≧1,d∈{0,1,…,9}} 答: (2)0127的最左推导:N=>ND=>NDD=>NDDD=>DDDD=>0DDD=>01DD=>012D=>0127 0127的最右推导:N=>ND=>N7=>ND7=>N27=>ND27=>N127=>D127=>0127 (其他略) 7.写一个文法,使其语言是奇数集,且每个奇数不以0开头。 答:G(S):S->+N|-N N->ABC|C C->1|3|5|7|9 A->C|2|4|6|8 B->BB|0|A|ε [注]:可以有其他答案。 [常见的错误]:N->2N+1 原因在于没有理解形式语言的表示法,而使用了数学表达式。 8.令文法为 E->T|E+T|E-T T->F|T*F|T/F F->(E)|i (1)给出i+i*i、i*(i+i)的最左推导和最右推导。 (2)给出i+i+i、i+i*i和i-i-i的语法树,并给出短语,简单短语和句柄。 答:(1) i*(i+i)的最左推导: E=>T=>T*F=>F*F=>i*F=>i*(E)=>i*(E+T)=>i*(T+T)=>i*(F+T)=>i*(i+T)=>i*(i+F)=> i*(i+i) i*(i+i)的最右推导: E=>T=>T*F=>T*(E) =>T*(E+T)=>T*(E+F)=>T*(E+i)=>T*(T+i)=>T*(F+i)=> T*(i+i)=> F*(i+i) => i*(i+i) (其他略) [注]:要牢记每一步都是对最左(右)的一个非终结符号进行一步推导。 (2) i+i+i的语法树:

编译原理第1章

第一章编译概述 2.典型的编译程序可划分为几部分?各部分的主要功能是什么?每部分都是必不可少的吗? 答:编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。 各部分的主要功能如下: 词法分析程序又称扫描器。进行词法分析时,依次读入源程序中的每个字符,依据语言的构词规则,识别出一个个具有独立意义的最小语法单元,即“单词”,并用某个单词符号来表示每个单词的词性是标识符、分界符还是数; 语法分析程序的功能是:对词法分析的结果,根据语言规则,将一个个单词符号组成语言的各种语法类; 语义分析的功能是确定源程序的语义是否正确; 中间代码生成程序的功能是将源程序生成一种更易于产生、易于翻译成目标程序的中间代码; 代码优化程序的功能是将中间代码中重复和冗余部分进行优化,提高目标程序的执行效率; 目标代码生成程序的功能是将中间代码生成特定机器上的机器语言代码; 符号表管理程序的功能是记录源程序中出现的标识符,并收集每个标识符的各种属性信息; 错误处理程序的功能是应对在编译各个阶段中出现的错误做适当的处理,从而使编译能够继续进行。 编译程序的每部分都是必不可少的。 3.解释方式和编译方式的区别是什么? 答:解释方式最终并不生成目标程序,这是编译方式与解释方式的根本区别。解释方式很适合于程序调试,易于查错,在程序执行中可以修改程序,但与编译方式相比,执行效率太低。 4.论述多遍扫描编译程序的优缺点? 答:优点:(1)可以减少内存容量的需求,分遍后,以遍为单位分别调用编译的各个子程序,各遍程序可以相互覆盖;(2)可使各遍的编译程序相互独立,结构清晰;(3)能够进行充分的优化,产生高质量的目标程序;(4)可将编译程序分为“前端”和“后端”,有利于编译程序的移植。 缺点是每遍都要读符号、送符号,增加了许多重复性工作,降低了编译效率。

编译原理 第一章 习题解答

第一章习题解答 2.编译程序有哪些主要构成成分?各自的主要功能是什么? 编译程序的主要构成成分有:词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、表格管理程序及出错处理程序。 (1)词法分析程序:从左到右扫描源程序,识别单词及其有关属性; (2)语法分析程序:分析源程序的结构, 判别它是否为相应程序设计语言中的一个合法程序; (3)语义分析程序:审查源程序有无语义错误,为代码生成阶段收集类型信息; (4)中间代码生成程序:将源程序变成一种内部表示形式; (5)代码优化程序:对前阶段产生的中间代码进行变换或进行改造,使生成的目标代码更为高效; (6)目标代码生成程序:把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码; (7)表格管理程序:保存编译过程中的各种信息; (8)出错处理程序:若编译过程中发现源程序存在错误,则报告错误的性质和错误发生的地点,有些还可以自动校正错误。 3.什么是解释程序?它与编译程序的主要不同是什么? 解释程序接受某个语言的程序并立即运行这个源程序。它的工作模式是一个个的获取、分析并执行源程序语句,一旦第一个语句分析结束,源程序便开始运行并且生成结果,它特别适合程序员交互方式的工作情况。 而编译程序是一个语言处理程序,它把一个高级语言程序翻译成某个机器的汇编或二进制代码程序,这个二进制代码程序再机器上运行以生成结果。 它们的主要不同在于:解释程序是边解释边执行,解释程序运行结束即可得到该程序的运行结果,而编译程序只是把源程序翻译成汇编或者二进制程序,这个程序再执行才能得到程序的运行结果。(当然还有其他不同,比如存储组织方式不同)

编译原理 第二章习题答案

第2章习题解答 1.文法G[S]为: S->Ac|aB A->ab B->bc 写出L(G[S])的全部元素。 [答案] S=>Ac=>abc 或S=>aB=>abc 所以L(G[S])={abc} ============================================== 2. 文法G[N]为: N->D|ND D->0|1|2|3|4|5|6|7|8|9 G[N]的语言是什么? [答案] G[N]的语言是V+。V={0,1,2,3,4,5,6,7,8,9} N=>ND=>NDD.... =>NDDDD...D=>D......D =============================================== 3.已知文法G[S]: S→dAB A→aA|a B→ε|bB 问:相应的正规式是什么?G[S]能否改写成为等价的正规文法?[答案] 正规式是daa*b*;

相应的正规文法为(由自动机化简来): G[S]:S→dA A→a|aB B→aB|a|b|bC C→bC|b 也可为(观察得来):G[S]:S→dA A→a|aA|aB B→bB|ε ===================================================================== ========== 4.已知文法G[Z]: Z->aZb|ab 写出L(G[Z])的全部元素。 [答案] Z=>aZb=>aaZbb=>aaa..Z...bbb=> aaa..ab...bbb L(G[Z])={a n b n|n>=1} ===================================================================== ========= 5.给出语言{a n b n c m|n>=1,m>=0}的上下文无关文法。 [分析] 本题难度不大,主要是考上下文无关文法的基本概念。上下文无关文法的基本定义是:A->β,A∈Vn,β∈(Vn∪Vt)*,注意关键问题是保证a n b n的成立,即“a与b的个数要相等”,为此,可以用一条形如A->aAb|ab的产生式即可解决。 [答案] 构造上下文无关文法如下: S->AB|A A->aAb|ab B->Bc|c [扩展]

编译原理第三版课后答案

编译原理课后题答案 第二章 P36-6 (1) L G () 1是0~9组成的数字串 (2) 最左推导: 最右推导: P36-7 G(S) P36-8 文法: 最左推导: 最右推导: 语法树:/******************************** *****************/ P36-9 句子iiiei有两个语法树: P36-10 /************** ***************/ P36-11 /*************** L1: L2: L3: L4: ***************/ 第三章习题参考答案P64–7 (1)

最小化: P64–8 (1) (2) (3) P64–12 (a) a a,b a 0

给状态编号: a a a b b b 最小化: a a b b a b (b) 已经确定化了, 进行最小化 最小化: P64 –14 (1) 0 1 0 (2): (|)*010 1 εε 0 0 0 Y Y

最小化: 0 1 1 1 0 0 第四章 P81–1 (1) 按照T,S 的顺序消除左递归 递归子程序: procedure S; begin if sym='a' or sym='^' then abvance else if sym='(' then begin advance;T; if sym=')' then advance; else error; end else error end; procedure T; begin S; T end;

procedure 'T; begin if sym=',' then begin advance; S;'T end end; 其中: sym:是输入串指针IP所指的符号advance:是把IP调至下一个输入符号error:是出错诊察程序 (2) FIRST(S)={a,^,(} FIRST(T)={a,^,(} FIRST('T)={,,ε} FOLLOW(S)={),,,#} FOLLOW(T)={)} FOLLOW('T)={)} 预测分析表 是LL(1)文法 P81–2 文法: (1) FIRST(E)={(,a,b,^} FIRST(E')={+,ε} FIRST(T)={(,a,b,^} FIRST(T')={(,a,b,^,ε} FIRST(F)={(,a,b,^} FIRST(F')={*,ε} FIRST(P)={(,a,b,^} FOLLOW(E)={#,)} FOLLOW(E')={#,)} FOLLOW(T)={+,),#} FOLLOW(T')={+,),#} FOLLOW(F)={(,a,b,^,+,),#} FOLLOW(F')={(,a,b,^,+,),#} FOLLOW(P)={*,(,a,b,^,+,),#} (2)

编译原理课后习题答案+清华大学出版社第二版

第 1 章引论 第1 题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2)源程序:源语言编写的程序称为源程序。 (3)目标程序:目标语言书写的程序称为目标程序。 (4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第2 题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。 答案: 一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。 中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。 中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。

编译原理第二版课后习问题详解

《编译原理》课后习题答案第一章 第 1 章引论 第 1 题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2)源程序:源语言编写的程序称为源程序。 (3)目标程序:目标语言书写的程序称为目标程序。 (4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。

第 2 题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程 序的总体结构图。 答案: 一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。 中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式 的中间语言代码,如三元式或四元式。 中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。 目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。 表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的 各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序具有的表格管理功能。 错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源 程序中的错误时,错误处理程序负责报告出错的位置和错误性质等信息,同时对发现的错误

编译原理习题及答案(整理后)

第一章 1、将编译程序分成若干个“遍”是为了。 b.使程序的结构更加清晰 2、构造编译程序应掌握。 a.源程序b.目标语言 c.编译方法 3、变量应当。 c.既持有左值又持有右值 4、编译程序绝大多数时间花在上。 d.管理表格 5、不可能是目标代码。 d.中间代码 6、使用可以定义一个程序的意义。 a.语义规则 7、词法分析器的输入是。 b.源程序 8、中间代码生成时所遵循的是- 。 c.语义规则 9、编译程序是对。 d.高级语言的翻译 10、语法分析应遵循。 c.构词规则 二、多项选择题 1、编译程序各阶段的工作都涉及到。 b.表格管理c.出错处理 2、编译程序工作时,通常有阶段。 a.词法分析b.语法分析c.中间代码生成e.目标代码生成 三、填空题 1、解释程序和编译程序的区别在于是否生成目标程序。 2、编译过程通常可分为5个阶段,分别是词法分析、语法分析中间代码生成、代码优化和目标代码生成。 3、编译程序工作过程中,第一段输入是源程序,最后阶段的输出为标代码生成程序。 4、编译程序是指将源程序程序翻译成目标语言程序的程序。

一、单项选择题 1、文法G:S→xSx|y所识别的语言是。 a. xyx b. (xyx)* c. x n yx n(n≥0) d. x*yx* 2、文法G描述的语言L(G)是指。 a. L(G)={α|S+?α , α∈V T*} b. L(G)={α|S*?α, α∈V T*} c. L(G)={α|S*?α,α∈(V T∪V N*)} d. L(G)={α|S+?α, α∈(V T∪V N*)} 3、有限状态自动机能识别。 a. 上下文无关文法 b. 上下文有关文法 c.正规文法 d. 短语文法 4、设G为算符优先文法,G的任意终结符对a、b有以下关系成立。 a. 若f(a)>g(b),则a>b b.若f(a)

编译原理作业参考问题详解

第1章引言 1、解释下列各词 源语言:编写源程序的语言(基本符号,关键字),各种程序设计语言都可以作为源语言。 源程序: 用接近自然语言(数学语言)的源语言(基本符号,关键字)编写的程序,它是翻译程序处理的对象。 目标程序: 目标程序是源程序经过翻译程序加工最后得到的程序。目标程序 (结果程序)一般可由计算机直接执行。 低级语言:机器语言和汇编语言。 高级语言:是人们根据描述实际问题的需要而设计的一个记号系统。如同自然语言(接近数学语言和工程语言)一样,语言的基本单位是语句,由符号组和一组用来组织它们成为有确定意义的组合规则。 翻译程序: 能够把某一种语言程序(源语言程序)改变成另一种语言程序(目标语言程序),后者与前者在逻辑上是等价的。其中包括:编译程序,解释程序,汇编程序。 编译程序: 把输入的源程序翻译成等价的目标程序(汇编语言或机器语言), 然后再执行目标程序(先编译后执行),执行翻译工作的程序称为编译程序。 解释程序: 以该语言写的源程序作为输入,但不产生目标程序。按源程序中语句动态顺序逐句的边解释边执行的过程,完成翻译工作的程序称为解释程序。 2、什么叫“遍”? 指对源程序或源程序的中间形式(如单词,中间代码)从头到尾扫描一次,并作相应的加工处理,称为一遍。 3、简述编译程序的基本过程的任务。 编译程序的工作是指从输入源程序开始到输出目标程序为止的整个过程,整个过程可以划分5个阶段。 词法分析:输入源程序,进行词法分析,输出单词符号。 语法分析:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位,并判断输入串是否构成语确的“程序”。 中间代码生成:按照语义规则把语法分析器归约(或推导)出的语法单位翻译成一定形式的中间代码。 优化:对中间代码进行优化处理。 目标代码生成:把中间代码翻译成目标语言程序。 4、编译程序与解释程序的区别? 编译程序生成目标程序后,再执行目标程序;然而解释程序不生成目标程序,边解释边执行。 5、有人认为编译程序的五个组成部分缺一不可,这种看确吗? 编译程序的5个阶段中,词法分析,语法分析,语义分析和代码生成生成是必须完成的。而中间代码生成和代码优化并不是必不可少的。优化的目的是为了提高目标程序的质量,没有这一部分工作,仍然能够得到目标代码。 6、编译程序的分类 目前基本分为:诊断编译程序,优化编译程序,交叉编译程序,可变目标编译程序。

编译原理第二版作业答案_第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 =〉EOEOE =〉EOEOv =〉EOE+v =〉EOv+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 E E O O v * v + v 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|εA→a B→SBB|b

编译原理教程课后习题答案——第二章

第二章 词法分析 2.1 完成下列选择题: (1) 词法分析器的输出结果是 。 a. 单词的种别编码 b. 单词在符号表中的位置 c. 单词的种别编码和自身值 d. 单词自身值 (2) 正规式M1和M2等价是指 。 a. M1和M2的状态数相等 b. M1和M2的有向边条数相等 c. M1和M2所识别的语言集相等 d. M1和M2状态数和有向边条数相等 (3) DFA M(见图2-1)接受的字集为 。 a. 以0开头的二进制数组成的集合 b. 以0结尾的二进制数组成的集合 c. 含奇数个0的二进制数组成的集合 d. 含偶数个0的二进制数组成的集合 【解答】 (1) c (2) c (3) d 图2-1 习题2.1的DFA M 2.2 什么是扫描器?扫描器的功能是什么? 【解答】 扫描器就是词法分析器,它接受输入的源程序,对源程序进行词法分析并识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。通常是把词法分析器作为一个子程序,每当词法分析器需要一个单词符号时就调用这个子程序。每次调用时,词法分析器就从输入串中识别出一个单词符号交给语法分析器。 2.3 设M=({x,y}, {a,b}, f, x, {y})为一非确定的有限自动机,其中f 定义如下: f(x,a)={x,y} f {x,b}={y} f(y,a)=Φ f{y,b}={x,y} 试构造相应的确定有限自动机M ′。 【解答】 对照自动机的定义M=(S,Σ,f,So,Z),由f 的定义可知f(x,a)、f(y,b)均为多值函数,因此M 是一非确定有限自动机。 先画出NFA M 相应的状态图,如图2-2所示。 图2-2 习题2.3的NFA M 用子集法构造状态转换矩阵,如表 表2-1 状态转换矩阵 1b a

编译原理第一章练习和答案

例1设有文法G[S]: S →a|(T )| T →T,S|S (1) 试给出句子(a,a,a)的最左推导。 (2) 试给出句子(a,a,a)的分析树 (3) 试给出句子(a,a,a)的最右推导和最右推导的逆过程(即最左规约)的每一步的句柄。 【解】(1) (a,a,a)的最左推导 S=>(T) =>(T,S) =>( T,S,S) =>( S,S,S) =>(a,S,S) =>(a,a,S) =>(a,a,a) (2)(a,a,a)的分析树 S ( T ) T , S S a T , S a (3) (a,a,a)最右推导 最左规约每一步的句柄 S=>(T) 句柄为:(T) =>(T,S) 句柄为:T,S =>(T,a) 句柄为:a =>(T,S,a) 句柄为:T,S =>(T,a,a) 句柄为:第一个a =>(S,a,a) 句柄为:S =>(a,a,a) 句柄为:第一个a 例2已知文法G[Z]: Z →0U|1V U →1Z|1 V →0Z|0 (1) 请写出此文法描述的只含有4个符号的全部句子。 (2) G [Z]产生的语言是什么? (3) 该文法在Chomsky 文法分类中属于几型文法? 【解】(1)0101,0110,1010, 1001 (2)分析G[Z]所推导出的句子的特点:由Z 开始的推导不外乎图1所示的四种情形。 图 1文法G[Z]可能的几种推导 Z 1 U Z U Z 1 Z 1 V Z 1 V 由Z 推导出10或01后就终止或进入递归,而Z 的每次递归将推导出相同的符号串:10或

01。所以

G[Z]产生的语言L(G[Z])={x|x∈(10|01)+ } (3)该文法属于3型文法。 例3 已知文法G=({A,B,C},{a,b,c},P,A), P由以下产生式组成: A→abc A→aBbc Bb→bB Bc→Cbcc bC→Cb aC→aaB aC→aa 此文法所表示的语言是什么? 【解】 分析文法的规则: 每使用一次Bc→Cbcc,b、c的个数各增加一个; 每使用一次aC→aaB或aC→aa, a的个数就增加一个; 产生式Bb→bB、 bC→Cb起连接转换作用。 由于A是开始符号,由产生式A→abc推导得到终结符号串abc;由产生式A→aBbc推导得到B后,每当使用产生式Bb→bB、Bc→Cbcc、bC→Cb、aC→aaB就会递归调用B一次,所产生的a、b、c的个数分别增加一个,因此推导所得的终结符号串为abc、aabbcc、aaabbbccc、…所以文法描述的语言为{ a n b n c n|n>0}. 例4 构造描述语言L(G[S])={(n)n|n≥0} 的文法。 【解】(1)找出语言的一些典型句子: n=0 ε n=1 ( ) n=2 (()) … 所以, L(G[S])={ ε、( ) (())、((()))、…} (2)分析句子的特点: 只含有(和),(和)的个数相同且对称, 句子中所含的符号数可无限, 句子的个数可无限。 (3)凑规则:由 S→ε|() 得到ε|(),由 A→ (S) 得到 (()),(()) 是在()的两边再加上一对()得到,((()))是在(())的两边再加上一对()得到,…所以将上述产生式合并为S→(S) |ε。 (4)得到文法 G[S]: S→(S) |ε (5)检验:语言所有的句子均可由文法G[S]推导出来, 文法G[S]推导出来的所有终结符号串均为语言的句子. 例5 构造描述语言L(G[S])={a m b n |n>m>0} 的文法。 【解】找出语言的一些典型句子:abb、abbb、…、aabbb、aabbbb、…,语言的句子的特点是仅含有a、b, a在b的左边,b的个数大于a的个数,a的个数至少是1。 单独生成c k, k>1 可用产生式 C→c |Cc 句子中要求b的个数大于a的个数,所以得到文法:

编译原理作业集第一章修订版

第一章引论 本章要点: 1. 正确理解什么是编译程序; 2. 了解编译程序工作的基本过程及各阶段的基本任务; 3. 熟悉编译程序的总体结构框图; 4. 了解编译程序的构造过程和构造工具。 本章目标: 1. 掌握本章的“编译程序”、“交叉编译程序”、“编译前端与编译后端”等基本概念,并能在以后的学习熟练运用; 2. 掌握T形图表示。 本章重点: 1. 概念比较: ①编译程序、解释程序; ②诊断编译程序、优化编译程序; ③交叉编译程序、可变目标编译程序; ④编译前端与编译后端; 2. 编译工作过程的五个阶段; 3. 编译程序总框; 4. 编译程序“移植”。 本章难点 1. 编译程序“移植”; 作业题及参考答案 一、单项选择题:

(按照组卷方案,至少8道小题) 1. 如果一个编译程序能产生不同于其宿主机的机器代码,则称它为:。 a. 诊断编译程序 b. 优化编译程序 c. 交叉编译程序 d. 可变目标编译程序 2. 编译程序将高级语言程序翻译成。 a. 机器语言程序或高级语言程序 b. 汇编语言或机器语言程序 c. 汇编语言程序或高级语言程序 d. 中间语言程序或高级语言程序 3. 下面的四个选项中,__________不是编译程序的组成部分。 a. 词法分析程序 b. 代码生成程序 c. 设备管理程序 d. 语法分析程序 4. 现代多数实用编译程序所产生的目标代码都是一种可重定位的指令代码,在运行前必须借助于一个把各个目标模块,包括系统提供的库模块连接在一起,确定程序变量或常数在主存中的位置,装入内存中制定的起始地址,使之成为一个可运行的绝对指令代码的程序。 a. 重定位程序; b. 解释程序; c. 连接装配程序; d. 诊断程序; 5. 从编译程序的角度说,源程序中的错误通常分为两大类。 a. 词法错误和语法错误; b. 语法错误和语义错误; c. 编辑错误和诊断错误; d. 词法错误和语义错误; 6. 下面对编译原理的有关概念正确描述的是:。 a. 目标语言只能是机器语言 b. 编译程序处理的对象是源语言。 c. Lex是语法分析自动生成器 d. 解释程序属于编译程序 7. 目标代码生成阶段所生成的目标代码的形式不可能是。 a. 绝对指令代码 b. 可充定位的指令代码。 c. 汇编指令代码 d. 三地址代码 8. 语义错误是指源程序中不符合语义规则的错误,不包括: a. 非法字符错误 b. 类型不一致错误。 c. 作用域错误 d. 说明错误 一.答案:1. c; 2. b;3. c; 4. c;5. b;6. d;7. d;8.a; 二、填空题: (按照组卷方案,至少8道小题) 1.我们有时把编译程序划分为编译前端和编译后端。前端主要由与有关但与

编译原理第一章作业完整答案版

01-普通作业一(第一章) 一、选择题(从备选项中选出一个或多个正确答案)。 1. 编译程序的源程序是高级语言编写的程序,目标程序是编写的程序。 A. 高级语言 B. 汇编语言 C. 机器语言 D. 汇编语言或机器语言 2. 编译程序是对进行翻译。 A. 高级语言 B. 汇编语言 C. 机器语言 D. 自然语言 3. 如果编译程序生成的目标程序是机器代码程序,则源程序的执行分为两个阶段。 A. 编译 B. 汇编 C. 运行 D. 预处理 4. 编译的工作过程一般划分为词法分析、、语义分析、中间代码生成、代码优化和目标代码生成若干阶段。 A. 表格管理 B. 出错处理 C. 语法分析 D. 预处理 5. 词法分析阶段的主要任务是识别。 A. 表达式 B. 单词 C. 语句 D. 词组 二、判断题(对于下列陈述中正确的说法选择回答“对”,否则选择回答“错”)。 1. 编译程序是一种常见的应用软件。 2. C语言的编译程序可以用C语言编写。 3. 编译方式与解释方式的区别之一在于是否生成目标程序。 4. 中间代码生成是编译程序不可或缺的部分。 5. 含有优化的编译程序执行效率高。 三、解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 四、一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。 五、何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系? 参考答案: 一、选择题 1. D 2. A 3. AC 4. C 5. B 二、判断题 1.错 2.对 3.对 4.错 5.错 三、 (1)把用高级程序设计语言书写的源程序,翻译成等价的计算机汇编语言或机器语言书写的目标程序的翻译程序。

编译原理教程课后习题答案——第一章

第一章绪论 1.1 完成下列选择题: (1) 构造编译程序应掌握。 a. 源程序 b. 目标语言 c. 编译方法 d. 以上三项都是 (2) 编译程序绝大多数时间花在上。 a. 出错处理 b. 词法分析 c. 目标代码生成 d. 表格管理 (3) 编译程序是对。 a. 汇编程序的翻译 b. 高级语言程序的解释执行 c. 机器语言的执行 d. 高级语言的翻译 【解答】 (1) d (2) d (3) d 1.2 计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么? 【解答】计算机执行用高级语言编写的程序主要有两种途径:解释和编译。 在解释方式下,翻译程序事先并不采用将高级语言程序全部翻译成机器代码程序,然后执行这个机器代码程序的方法,而是每读入一条源程序的语句,就将其解释(翻译)成对应其功能的机器代码语句串并执行,而所翻译的机器代码语句串在该语句执行后并不保留,最后再读入下一条源程序语句,并解释执行。这种方法是按源程序中语句的动态执行顺序逐句解释(翻译)执行的,如果一语句处于一循环体中,则每次循环执行到该语句时,都要将其翻译成机器代码后再执行。 在编译方式下,高级语言程序的执行是分两步进行的:第一步首先将高级语言程序全部翻译成机器代码程序,第二步才是执行这个机器代码程序。因此,编译对源程序的处理是先翻译,后执行。 从执行速度上看,编译型的高级语言比解释型的高级语言要快,但解释方式下的人机界面比编译型好,便于程序调试。 这两种途径的主要区别在于:解释方式下不生成目标代码程序,而编译方式下生成目标代码程序。 1.3 请画出编译程序的总框图。如果你是一个编译程序的总设计师,设计编译程序时应当考虑哪些问题? 【解答】编译程序总框图如图1-1所示。 作为一个编译程序的总设计师,首先要深刻理解被编译的源语言其语法及语义;其次,要充分掌握目标指令的功能及特点,如果目标语言是机器指令,还要搞清楚机器的硬件结构以及操作系统的功能;第三,对编译的方法及使用的软件工具也必须准确化。总之,总设计师在设计编译程序时必须估量系统功能要求、硬件设备及软件工具等诸因素对编译程序构造的影响等。

编译原理第二章-课后题答案

3.何谓“标志符”,何谓“名字”,两者的区别是什么? 答:标志符是一个没有意义的字符序列,而名字却有明确的意义和属性。 4.令+、*和↑代表加、乘和乘幂,按如下的非标准优先级和结合性质的约定,计算1+1*2↑2*1↑2的值。 (1)优先顺序(从高到低)为+、*和↑,同级优先采用左结合。 (2)优先顺序为↑、+、*,同级优先采用右结合。 答:(1)1+1*2↑2*1↑2=2*2↑2*1↑2=4↑2*1↑2=4↑2↑2=16↑2=256 (2)1+1*2↑2*1↑2=1+1*2↑2*1=1+1*4*1=2*4*1=2*4=8 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)由0到9的数字所组成的长度至少为1的字符串。即:L(G6)={d n|n≧1,d∈{0,1,…,9}}答: (2)0127的最左推导:N=>ND=>NDD=>NDDD=>DDDD=>0DDD=>01DD=>012D=>0127 0127的最右推导:N=>ND=>N7=>ND7=>N27=>ND27=>N127=>D127=>0127 (其他略) 7.写一个文法,使其语言是奇数集,且每个奇数不以0开头。 答:G(S):S->+N|-N N->ABC|C C->1|3|5|7|9 A->C|2|4|6|8 B->BB|0|A|ε [注]:可以有其他答案。 [常见的错误]:N->2N+1 原因在于没有理解形式语言的表示法,而使用了数学表达式。 8.令文法为 E->T|E+T|E-T T->F|T*F|T/F F->(E)|i (1)给出i+i*i、i*(i+i)的最左推导和最右推导。 (2)给出i+i+i、i+i*i和i-i-i的语法树,并给出短语,简单短语和句柄。 答:(1) i*(i+i)的最左推导: E=>T=>T*F=>F*F=>i*F=>i*(E)=>i*(E+T)=>i*(T+T)=>i*(F+T)=>i*(i+T)=>i*(i+F)=> i*(i+i) i*(i+i)的最右推导: E=>T=>T*F=>T*(E) =>T*(E+T)=>T*(E+F)=>T*(E+i)=>T*(T+i)=>T*(F+i)=> T*(i+i)=> F*(i+i) => i*(i+i) (其他略) [注]:要牢记每一步都是对最左(右)的一个非终结符号进行一步推导。 (2) i+i+i的语法树:

相关文档
最新文档