搜档网
当前位置:搜档网 › 编译原理 龙书答案

编译原理 龙书答案

编译原理 龙书答案
编译原理 龙书答案

第四章部分习题解答

Aho:《编译原理技术与工具》书中习题

(Aho)4.1 考虑文法

S →( L ) | a

L →L, S | S

a)列出终结符、非终结符和开始符号

解:

终结符:(、)、a、,

非终结符:S、L

开始符号:S

b)给出下列句子的语法树

i)(a, a)

ii)(a, (a, a))

iii)(a, ((a, a), (a, a)))

c)构造b)中句子的最左推导

i)S?(L)?(L, S) ?(S, S) ?(a, S) ?(a, a)

ii)S?(L)?(L, S) ?(S, S) ?(a, S) ?(a, (L)) ?(a, (L, S)) ?(a, (S, S)) ?(a, (a, S) ?(a, (a, a))

iii)S?(L)?(L, S) ?(S, S) ?(a, S) ?(a, (L)) ?(a, (L, S)) ?(a, (S, S)) ?(a, ((L), S)) ?(a, ((L, S), S)) ?(a, ((S, S), S)) ?(a, ((a, S), S)) ?(a, ((a, a), S)) ?(a, ((a, a), (L)))

?(a, ((a, a), (L, S))) ?(a, ((a, a), (S, S))) ?(a, ((a, a), (a, S))) ?(a, ((a, a), (a, a))) d)构造b)中句子的最右推导

i)S?(L)?(L, S) ?(L, a) ?(S, a) ?(a, a)

ii)S?(L)?(L, S) ? (L, (L)) ?(L, (L, S)) ?(L, (L, a)) ?(L, (S, a)) ?(L, (a, a)) ?(S, (a, a)) ?(a, (a, a))

iii)S?(L)?(L, S) ?(L, (L)) ?(L, (L, S)) ?(L, (L, (L))) ?(L, (L, (L, S))) ?(L, (L, (L,

a))) ?(L, (L, (S, a))) ?(L, (L, (a, a))) ?(L, (S, (a, a))) ?(L, ((L), (a, a))) ?(L, ((L,

S), (a, a))) ?(L, ((L, a), (a, a))) ?(L, ((S, a), (a, a))) ?(L, ((a, a), (S, S))) ?(S, ((a,

a), (a, a))) ?(a, ((a, a), (a, a)))

e)该文法产生的语言是什么

解:设该文法产生语言(符号串集合)L,则

L = { (A1, A2, …, A n) | n是任意正整数,A i=a,或A i∈L,i是1~n之间的整数}

(Aho)4.2考虑文法

S→aSbS | bSaS | ε

a)为句子构造两个不同的最左推导,以证明它是二义性的

S?aSbS?abS?abaSbS?ababS?abab

S?aSbS?abSaSbS?abaSbS?ababS?abab

b)构造abab对应的最右推导

S?aSbS?aSbaSbS?aSbaSb?aSbab?abab

S?aSbS?aSb?abSaSb?abSab?abab

c)构造abab对应语法树

d)该文法产生什么样的语言?

解:生成的语言:a、b个数相等的a、b串的集合

(Aho)4.3 考虑文法

bexpr→bexpr or bterm | bterm

bterm→bterm and bfactor | bfactor

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

a)试为句子not ( true or false)构造分析树

解:

b)试证明该文法产生所有布尔表达式

证明:

一、首先证明文法产生的所有符号串都是布尔表达式

变换命题形式——以bexpr、bterm、bfactor开始的推导得到的所有符号串都是布尔表达式最短的推导过程得到true、false,显然成立

假定对步数小于n的推导命题都成立

考虑步数等于n 的推导,其开始推导步骤必为以下情况之一

bexpr?bexpr or bterm

bexpr?bterm

bterm?bterm and bfactor

bexpr?bfactor

bfactor?not bfactor

bfactor? ( bexpr )

而后继推导的步数显然

因此命题一得证。

二、证明所有布尔表达式均可由文法生成

变换命题——所有析取式均可由bexpr推导出来,所有合取式均可由bterm(bexpr)推导出来,所有对子布尔表达式施加not运算或加括号或简单true、false都可由bfactor(bexpr、bterm)推导出来

最简单的布尔表达式true和false显然成立

假定对长度小于n的布尔表达式,均可由文法推导出来

考虑长度等于n的布尔表达式B,显然,B只能是以下形式之一

B = B1 or B2

B = B1 and B2

B = not B1

B = ( B1 )

以上几种情况,B1、B2的长度均小于n

对于情况1:B为析取式,B1可为析取式也可为合取式,B2为合取式,根据假设可由bexpr 合bterm推导出来,显然可构造推导过程,由bexpr推导出B

其他情况类似,命题二得证

综合一、二,可知文法产生的语言就是布尔表达式

c)

(Aho)4.4考虑文法

R→R ‘|’ R | RR | R* | (R) | a | b

c)构造等价的非二义性文法

R→R ‘|’ A | A

A→A B | B

B→B* | C

C→( R ) | a | b

(Aho)4.5下面if-then-else文法试图消除空悬else的二义性,证明它仍是二义性的stmt→if expr then stmt

| matched_stmt

matched_stmt→if expr then matched_stmt else stmt

| other

解:

用S、M、E表示stmt、matched_stmt和expr,用i、t、e、o表示if、then、else和other 则句子i E t i E t o e i E t o e o对应两个最左推导:

S?i E t S?i E t M?i E t i E t M e S?i E t i E t o e S?i E t i E t o e M

?i E t i E t o e i E t M e S?i E t i E t o e i E t o e S ?i E t i E t o e i E t o e M

?i E t i E t o e i E t o e o

S?M?i E t M e S?i E t i E t M e S e S? i E t i E t o e S e S? i E t i E t o e i E t S e S

? i E t i E t o e i E t M e S? i E t i E t o e i E t o e S? i E t i E t o e i E t o e M

? i E t i E t o e i E t o e o

因此文法是二义性文法

直接构造比较困难,可从SLR分析表的构造角度考虑,LR(0)项目集规范族中,项目

I8={M→i E t M ? e S, S→?M},有移进/归约冲突,这就是是二义性所在。

显然,存在句型...i E t M e S...和...i E t S e S...,当M位于栈顶时,产生移进/归约冲突。按此思路,构造形如... i E t S e S...的句型即可

(Aho)4.6 为下列语言设计上下文无关文法。哪些语言是正规式?

a)满足这样条件的二进制串:每个0之后都紧跟着至少一个1

S→0 A | 1 S | ε

A→1 S

正规式:(1 | 01)*

b)0和1个数相等的二进制串

S→0 S 1 S | 1 S 0 S | ε

d)不含011子串的二进制串

S→0 A | 1 S | ε

A→0 A | 1 B | ε

B→0 A | ε

正规式:1*(0 | 01)*

e)具有形式xy的二进制串,x≠y

S→A | B | A B | B A

A→D A D | 0

B→D B D | 1

D→0 | 1

A、B分别表示中心符号为0、1的长度为奇数的二进制串

将AB串接,长度为偶数,将它从中间分为长度相等的两部分,x、y

虽然A、B长度可能不一样,但容易得到,A的中心0在x中的位置,与B的中心1在y 中的位置是相同的,因此x≠y

BA的情况类似

f)形如xx的0、1串

解:此语言无法用上下文无关文法描述

(Aho)4.11 对习题4.1中文法

a)消除左递归

S→( L ) | a

L→S L’

L’→, S L’ | ε

b)构造预测分析表,对4.1(b)中句子,给出预测分析器的运行过程

FIRST(S) = { (, a )

FIRST(L) = { (, a }

FIRST(L’) = { ‘,’, ε }

FOLLOW(S) = {‘,’, ), $}

FOLLOW(L) = { ) }

FOLLOW(L’) = { ) }

预测分析表:

其他两个句子的分析过程类似

(Aho)4.13 下面文法产生除ε外所有长度为偶数的a的串

S →a S a | a a

a)试为该文法构造一个带回溯的递归下降语法分析器,对S的两个候选式首先考虑aSa。证明:S所对应的过程可以成功分析2、4、8个a的串,但6个a的串不行。

解:aa的分析过程,其中√表示匹配成功,×表示匹配失败,匹配失败则尝试下个候选式

aaaa分析过程:

aaaaaa分析过程:

aaaaaaaa分析过程:

b)此语法分析器能识别什么样的语言?

解:由a)的解可以看出,2N个a的串分析过程中,步骤如下

1)产生2N+1个S的语法树,对第2N+1个S进行扩展时输入缓冲已空,失败

2)对第2N个S尝试候选式aa,第二个a匹配失败

3)对第2N-1个S尝试候选式aa,左边N-1个a匹配,右边最后一个a匹配,倒数第二个a失败

4)对第2N-2个S尝试候选式aa,左边N-2个a匹配,右边最后一个a和倒数第二个a匹配,倒数第三个a失败

5)对第2N-4个S尝试候选式aa,左边N-4个a匹配,右边最后一个a~倒数第四个a匹配,倒数第五个a失败

6)对第2N-8个S尝试候选式aa,…

最后正确识别的情况必然是:对第N个S尝试aa,左边N个a和右边N个a恰与输入匹配显然,可以正确识别的符号串的N满足

2N – 1 – 1 – 2 – 4 - … = N N=2i

(Aho)4.25 试给出图4-60中的优先关系表对应的优先级函数

解:有向图如下

优先级函数为

(Aho)4.26 对习题4.1中文法,利用讲义中给出的算法计算终结符之间的优先关系

解:S →( L ) | a

L →L, S | S

由于S →( L ),因此( ?)

S →( L ),而L?L , S,L?S?( L ),L?S?a

因此( ?, ,( ? (,( ? a;, ? ),) ? ),a ? )

由于L →L, S,而L?L , S,L?S?( L ),L?S?a,因此, ? ,,) ? ,,a ? ,

而S?( L ),S?a,因此, ?( ,, ? a

非终结符与$优先关系的计算方法:

如果存在S?a…,或S?Qa…,则$ ? a,

若存在S?…a,或S?…aQ,则a ? $

因此,$ ? (,$ ? a,) ? $,a ? $

算符优先关系表为:

(Aho)4.27 试给下列文法构造算符优先关系

a)练习4.2中文法

解:

S→aSbS | bSaS | ε

由S→aSbS可得a?b

由S→bSaS可得b?a

由S→aSbS,和S?bSaS可得a?b、b?b、a?b,和S?aSbS可得a?a、b?a、b?b 由S→bSaS,和S?bSaS可得b?b、a?b、a?a,和S?aSbS可得b?a、a?a、a?a

文法不是算符优先文法,二义性文法,很自然

b)练习4.3中文法

bexpr→bexpr or bterm | bterm

bterm→bterm and bfactor | bfactor

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

(Aho)4.30 一个文法称为Greibach范式(GNF)文法,如果它无ε产生式,且每个产生式(S→ε除外)均形如A→aα,其中,a是终结符,α是非终结符串,也可能为空。

a)试编写一个算法,将给定文法转换为Greibach范式

解:算法步骤如下

1.先将文法消除左递归、消除ε产生式、删除无用符号,然后对每个非终结符A的每个产生式,执行2

2.若产生式右部以终结符开始,则略过,考虑其他产生式,否则产生式必为A→A1α的形式,A1为≠A的NT,a为语法符号串,对它执行以下操作

i.将A1的所有产生式的右部替换A1,产生新的关于A的产生式

ii.对于这些产生式,若右部以T开始,略过,不予处理,考虑那些以NT开始的产生式,反复执行i、ii

iii.由于文法的NT个数是有限的(设为k),且已消除左递归,则最多k个步骤后,处理完毕,此时,A的产生式右部应该均以T开始。否则,若某个产生

式右部以NT开始,表明A无论经过怎样的推导过程,均不可能得到一个以

终结符开始的串,当然也就不可能得到一个终结符串,这显然是一个错误的文

法,矛盾。这样,A的某个产生式处理完毕,其右部均以T开始。转向2,继

续考虑其他产生式,所有产生式处理完毕,则转向3

3.此时,每个产生式均为A→aα的形成,a为NT,α为语法符号串,若α中包含T,则进行如下处理

i.假定α中包含k个T,则产生式形为A→aα0a1α1…a kαk,其中a i为T,αi为NT

串或ε

ii.引入k个新的NT A1、A2、…A k,和k个新的产生式

A1→a1α1A2

A2→a2α2A3

A k-1→a k-1αk-1A k

A k→a kαk

而将原产生式改为A→aα0A1

4.经过2、3处理,所有产生式必然满足Greibach范式的格式

b)将你的算法应用到表达式文法4-10上

解:文法4-10消除左递归、消除ε产生式后得到

E→T E' | T

E'→+ T E' | + T

T→F T' | F

T'→* F T' | * F

F→( E ) | id

将每个产生式转换为以T开始的形式,得到

E→( E ) T' E' | id T' E' | ( E ) E' | id E' | ( E ) T' | id T' | ( E ) | id

E'→+ T E' | + T

T→( E ) T' | id T' | ( E ) | id

T'→* F T' | * F

F→( E ) | id

将每个产生式右部转换为T NT*的形式,最后结果为:

E→( E E''| id T' E' | ( E E''' | id E' | ( E | id T' | ( E E''''' | id

E''→) T' E'

E'''→) E'

E''''→) T'

E'''''→)

E'→+ T E' | + T

T→( E E'''' | id T' | ( E E''''' | id

T'→* F T' | * F

F→( E E''''' | id

(Aho)4.33 考虑文法

S→AS | b

A→SA | a

a)构造此文法的LR(0)项目集规范族

解:

I0 = { S’→?S, S→?AS, S→?b, A→?SA, A→?a }

goto(I0, S) = { S’→S?, A→S?A, A→?SA, A→?a, S→?AS, S→?b } = I1 goto(I0, A) = { S→A?S, S→?AS, S→?b, A→?SA, A→?a } = I2

goto(I0, a) = { A→a? } = I3

goto(I0, b) = { S→b? } = I4

goto(I1, S) = { A→S?A, A→?SA, A→?a, S→?AS, S→?b } = I5

goto(I1, A) = { A→SA?, S→A?S, S→?AS, S→?b, A→?SA, A→?a } = I6 goto(I1, a) = I3, goto(I1, b) = I4

goto(I2, S) = { S→AS?, A→S?A, A→?SA, A→?a, S→?AS, S→?b } = I7 goto(I2, A) = I2, goto(I2, a) = I3, goto(I2, b) = I4

goto(I5, S) = I5, goto(I5, A) = I6, goto(I5, a) = I3, goto(I5, b) = I4

goto(I6, S) = I7, goto(I6, A) = I2, goto(I6, a) = I3, goto(I6, b) = I4

goto(I7, S) = I5, goto(I7, A) = I6, goto(I7, a) = I3, goto(I7, b) = I4

c)构造SLR分析表

解:

FIRST(S) = FIRST(A) = {a, b}

FOLLOW(S) = {$, a, b} FOLLOW(A) = {a, b}

SLR分析表冲突,分析过程有多种可能路径,选择其中一种导致正确结果的即可。

e)构造规范LR分析表

解:

I0 = { [S’→?S, $], [S→?AS, $/a/b], [S→?b, $/a/b], [A→?SA, a/b], [A→?a, a/b] }

goto(I0, S) = {[S’→S?, $], [A→S?A, a/b], [A→?SA, a/b], [A→?a, a/b], [S→?AS, a/b], [S→?b, a/b]} = I1

goto(I0, A) = {[S→A?S, $/a/b] , [S→?AS, $/a/b], [S→?b, $/a/b], [A→?SA, a/b], [A→?a, a/b] } = I2 goto(I0, a) = { [A→a?, a/b] } = I3, goto(I0, b) = {[S→b?, $/a/b]} = I4

goto(I1, S) = { [A→S?A, a/b], [A→?SA, a/b], [A→?a, a/b], [S→?AS, a/b], [S→?b, a/b]} = I5

goto(I1, A) = { [A→SA?, a/b], [S→A?S, a/b], [S→?AS, a/b], [S→?b, a/b], [A→?SA, a/b], [A→?a,

a/b] } = I6

goto(I1, a) = I3, goto(I1, b) = {[S→b?, a/b]} = I7

goto(I2, S) = {[S→AS?, $/a/b], [A→S?A, a/b], [A→?SA, a/b], [A→?a, a/b], [S→?AS, a/b], [S→?b, a/b] } = I8

goto(I2, A) = I2, goto(I2, a) = I3, goto(I2, b) = I4

goto(I5, S) = I5, goto(I5, A) = I6, goto(I5, a) = I3, goto(I5, b) = I7

goto(I6, S) = {[S→AS?, a/b], [A→S?A, a/b], [A→?SA, a/b], [A→?a, a/b], [S→?AS, a/b], [S→?b, a/b] } = I9

goto(I6, A) = {[S→A?S, a/b] , [S→?AS, a/b], [S→?b, a/b], [A→?SA, a/b], [A→?a, a/b] } = I10

goto(I6, a) = I3, goto(I6, b) = I7

goto(I8, S) = I5, goto(I8, A) = I6, goto(I8, a) = I3, goto(I8, b) = I7

goto(I9, S) = I5, goto(I9, A) = I6, goto(I9, a) = I3, goto(I9, b) = I7

goto(I10, S) = I9, goto(I10, A) = I10, goto(I10, a) = I3, goto(I10, b) = I7

规范LR分析表为:

f)利用LR(1)项目集合并的方法构造LALR分析表

解:

同心集合并:

I2 10 = {[S→A?S, $/a/b] , [S→?AS, $/a/b], [S→?b, $/a/b], [A→?SA, a/b], [A→?a, a/b] }

I47 = {[S→b?, $/a/b]}

I89 = {[S→AS?, $/a/b], [A→S?A, a/b], [A→?SA, a/b], [A→?a, a/b], [S→?AS, a/b], [S→?b, a/b] }

g)利用高效构造方法构造LALR分析表

解:LR(0)项目集的核:

I0 = { S’→?S }

I1 = { S’→S?, A→S?A }

I2 = { S→A?S }

I3 = { A→a? }

I4 = { S→b? }

I5 = { A→S?A }

I6 = { A→SA?, S→A?S }

I7 = { S→AS?, A→S?A }

closure([S’→?S, #]) = { [S’→?S, #], [S→?AS, #/a/b], [S→?b, #/a/b], [A→?SA, a/b], [A→?a, a/b] } I0:S’→?S传播到I1: S’→S?,I2: S→A?S,I4: S→b?

自生搜索符a/b:I1: A→S?A,I2: S→A?S,I3: A→a?,I4: S→b?

closure([A→S?A, #])={[A→S?A, #], [A→?SA, #/a/b], [A→?a, #/a/b], [S→?AS, a/b], [S→?b, a/b]} I1:A→S?A传播到I6: A→SA?,I5: A→S?A,I3: A→a?

自生搜索符a/b:I5: A→S?A,I6: S→A?S,I3: A→a?,I4: S→b?

closure([S→A?S, #])={[S→A?S, #] , [S→?AS, #/a/b], [S→?b, #/a/b], [A→?SA, a/b], [A→?a, a/b] } I2: S→A?S传播到I7: S→AS?,I4: S→b?

自生搜索符a/b:I2: S→A?S,I7: A→S?A,I3: A→a?,I4: S→b?

I5:A→S?A传播到I6: A→SA?,I3: A→a?

自生搜索符a/b:I5: A→S?A,I6: S→A?S,I3: A→a?,I4: S→b?

I6: S→A?S传播到I7: S→AS?,I2: S→A?S,I4: S→b?

自生搜索符a/b:I2: S→A?S,I7: A→S?A,I3: A→a?,I4: S→b?

closure([A→S?A, #])={[A→S?A, #], [A→?SA, #/a/b], [A→?a, #/a/b], [S→?AS, a/b], [S→?b, a/b]} I7:A→S?A传播到I6: A→SA?,I5: A→S?A,I3: A→a?

自生搜索符a/b:I5: A→S?A,I6: S→A?S,I3: A→a?,I4: S→b?

(Aho)4.35 考虑下面文法

E →E + T | T

T →T F | F

F →F *| a | b

a)构造SLR分析表

解:拓广文法

E' →E

I0={ E' →?E, E →?E + T, E →? T, T →?T F, T →?F, F →?F *, F →?a, F →?b } goto(I0, E) = { E' →E?, E →E ?+ T } = I1

goto(I0, T) = { E →T?, T →T ?F, F →?F *, F →?a, F →?b } = I2

goto(I0, F) = { T →F?, F →F ?* } = I3

goto(I0, a) = { F →a? } = I4

goto(I0, b) = { F →b? } = I5

goto(I1, +) = { E →E + ?T, T →?T F, T →?F, F →?F *, F →?a, F →?b } = I6

goto(I2, F) = { T →T F?, F →F ?* } = I7

goto(I2, a) = I4

goto(I2, b) = I5

goto(I3, *) = { F →F *? } = I8

goto(I6, T) = { E →E + T?, T →T ?F, F →?F *, F →?a, F →?b } = I9

goto(I6, F) = I3

goto(I6, a) = I4

goto(I6, b) = I5

goto(I7, *) = I8

goto(I9, F) = I7

goto(I9, a) = I4

goto(I9, b) = I5

follow(E) = { +, $ }

follow(T) = { a, b, +, $ }

follow(F) = { a, b, *, +, $ }

b)构造LALR分析表

解:LR(0)项目集规范族的核

I0 = { E' →?E }

I1 = { E' →E?, E →E ?+ T }

I2 = { E →T?, T →T ?F }

I3 = { T →F?, F →F ?* }

I4 = { F →a? }

I5 = { F →b? }

I6 = { E →E + ?T }

I7 = { T →T F?, F →F ?* }

I8 = { F →F *? }

I9 = { E →E + T?, T →T ?F }

closure({[E' →?E , #]}) = { [E' →?E , #], [E →?E + T, #], [E →? T, +], [T →?T F, +/a/b], [T →?F, +/a/b], [F →?F *, +/a/b/*], [F →?a, +/a/b/*], [F →?b, +/a/b/*] }

传播:I0:E' →?E→I1:E' →E?, I1:E →E ?+ T

自生:I2:E →T?,I2:T →T ?F,I3:T →F?,I3:F → F ?*,I4:F →a?,I5:F →b?传播:I1:E →E ?+ T→I6:E →E + ?T

closure({[T →T ?F, #] }) = {[T →T ?F, #], [F →?F *, #/*], [F →?a, #/*], [F →?b, #/*] }

传播:I2:T →T ?F→I7:T →T F?,I7:F → F ?*,I4:F →a?,I5:F →b?

自生:I7:F → F ?*,I4:F →a?,I5:F →b?

传播:I3:F → F ?*→I8:F → F *?

closure({[E →E + ?T, #]}) = {[E →E + ?T, #], [T →?T F, #/a/b], [T →?F, #/a/b], [F →?F *, #/a/b/*], [F →?a, #/a/b/*], [F →?b, #/a/b/*] }

传播:I6:E →E + ?T→I9:E →E + T?,I9:T →T ?F,I3:T →F?,I3:F → F ?*,I4:F →a?,I5:F →b?

自生:I9:T →T ?F,I3:T →F?,I3:F → F ?*,I4:F →a?,I5:F →b?

传播:I7:F → F ?*→ I8:F → F *?

closure({[T →T ?F, #]}) = {[T →T ?F, #], [F →?F *, #/*], [F →?a, #/*], [F →?b, #/*] }

传播:I9:T →T ?F→I7:T →T F?,I7:F → F ?*,I4:F →a?,I5:F →b?

自生:I3:F → F ?*,I4:F →a?,I5:F →b?

计算搜索符:

(Aho)4.37 对文法

S→AaAb | BbBa

A→ε

B→ε

a)证明它是LL(1)文法但不是SLR(1)文法

解:

构造预测分析表:

FIRST(S) = {a, b}, FIRST(A)=FIRST(B)={ε}

所以,文法是LL(1)文法

构造SLR分析表:

LR(0)项目集I0={S’→?S, S→?AaAb, S→?BbBa, A→?, B→?}

而FOLLOW(A)=FOLLOW(B)={a, b},因此action[0, a] = action[0, b] = r3/r4,冲突!

所有,文法不是SLR(1)文法

(Aho)4.39 证明文法

S→Aa | bAc | dc | bda

A→d

是LALR(1)文法但不是SLR(1)文法

解:

构造SLR分析表:

项目集I4={ S→d?c, A→d? },而FOLLOW(A)={a, c},因此action[4, c]=s8/r5,冲突!

I7={ S→bd? a, A→d? },因此action[7, a]=s10/r5,冲突!

这是SLR分析表仅有的两个冲突的地方

因此文法不是SLR(1)文法

高效构造LALR分析表:

通过计算搜索符,所有项目都具有搜索符$,I4:A→d?具有搜索符a,I7:A→d?具有搜索符c,因此action[4, c]=s8,action[7, a]=s10,LALR分析表不冲突

因此文法是LALR(1)文法

(Aho)4.40 证明文法

S→Aa | bAc | Bc | bBa

A→d

B→d

是LR(1)文法但不是LALR(1)文法

解:

构造规范LR分析表:

I0 = { [S’→?S, $], [S→?Aa, $], [S→?bAc, $], [S→?Bc, $], [S→?bBa, $], [A→?d, a], [B→?d, c]} goto(I0, S)={ [S’→S?, $] } = I1

goto(I0, A)={ [S→A?a, $]} = I2

goto(I0, B)={ [S→B?c, $]} = I3

goto(I0, b)={ [S→b?Ac, $], [S→b?Ba, $], [A→?d, c], [B→?d, a]} = I4

goto(I0, d)={ [A→d?, a], [B→d?, c]} = I5

goto(I2, a)={ [S→Aa?, $]} = I6

goto(I3, c)={ [S→Bc?, $]} = I7

goto(I4, A)={ [S→bA?c, $]} = I8

goto(I4, B)={ [S→bB?a, $]} = I9

goto(I4, d)={ [A→d?, c], [B→d?, a]} = I10

goto(I8, c)={ [S→bAc?, $]} = I11

goto(I9, a)={ [S→bBa?, $]} = I12

规范LR分析表为:

构造LALR分析表,同心集I5和I10合并,显然会造成归约/归约冲突。

因此,文法是LR(1)文法,但不是LALR(1)文法

*

(Aho)4.42 试编写一个算法,为文法中每个NT A计算集合{B | A?Bα, 其中B是NT,α文法符号串}

解:算法描述如下

1.设置一个栈,保存NT,初始栈中只有A,将结果集合设置为空

2.若栈空,算法结束,否则执行以下步骤

3.将栈顶NT B弹出,将B加入结果集合

4.对所有形如B→C 的产生式,将C压栈

5.返回2

(Aho)4.44 为练习4.4文法构造SLR分析表,解决冲突

解:拓广文法

R'→R

R→R ‘|’ R | RR | R* | (R) | a | b

I0={ R'→?R, R→?R ‘|’ R, R→? RR, R→? R*, R→? (R), R→? a, R→? b }

goto(I0, R) = { R'→R?, R→R?‘|’ R, R→R? R, R→R?*, R→?R ‘|’ R, R→? RR, R→? R*, R→? (R), R→? a, R→? b } = I1

goto(I0, () = { R→(?R), R→?R ‘|’ R, R→? RR, R→? R*, R→? (R), R→? a, R→? b } = I2

goto(I0, a) = { R→a? } = I3

goto(I0, b) = { R→b? } = I4

goto(I1, R) = { R→RR?, R→R?‘|’ R, R→R? R, R→R?*, R→?R ‘|’ R, R→? RR, R→? R*, R→? (R), R→? a, R→? b } = I5

goto(I1, |) = { R→R ‘|’?R, R→?R ‘|’ R, R→? RR, R→? R*, R→? (R), R→? a, R→? b } = I6

goto(I1, *) = { R→R *? } = I7

goto(I1, () = I2

goto(I1, a) = I3

goto(I1, b) = I4

goto(I2, R) = { R→(R?), R→R?‘|’ R, R→R? R, R→R?*, R→?R ‘|’ R, R→? RR, R→? R*, R→? (R), R→? a, R→? b } = I8

goto(I2, () = I2

goto(I2, a) = I3

goto(I2, b) = I4

goto(I5, R) = I5

goto(I5, |) = I6

goto(I5, *) = I7

goto(I5, () = I2

goto(I5, a) = I3

goto(I5, b) = I4

goto(I6, R) = { R→R ‘|’ R?, R→R?‘|’ R, R→R? R, R→R?*, R→?R ‘|’ R, R→? RR, R→? R*, R→?(R), R→? a, R→? b } = I9

goto(I6, () = I2

goto(I6, a) = I3

goto(I6, b) = I4

goto(I8, R) = I5

goto(I8, |) = I6

goto(I8, *) = I7

goto(I8, () = I2

goto(I8, )) = { R→(R) ? } = I10

goto(I8, a) = I3

goto(I8, b) = I4

goto(I9, R) = I5

goto(I9, *) = I7

goto(I9, () = I2

goto(I9, a) = I3

goto(I9, b) = I4

FOLLOW(R)={ |, *, (, ), a, b, $}

对于状态5,几种冲突分别表示以下含义(用?表示连接操作):

…R?R|…,…R?R*…,…R?R? (…,…R?R? a…,…R?R? a…

显然,除了第二种情况,均应选择归约操作

对于状态9,冲突含义为:

…R|R|…,…R|R*…,…R|R? (…,…R|R? a…,…R|R? a…

除了第一种情况,均应选择移进操作

(Aho)4.46 a) 为下面文法构造SLR分析表,解决冲突,使得与图4-52同样方式分析

E→E sub R | E sup E | { E } | c

R→E sup E | E

解:拓广

E'→E

构造LR(0)项目集规范族

I0={ E'→?E, E→?E sub R, E→? E sup E, E→? { E }, E→? c }

goto(I0, E)= { E'→E?, E→E ?sub R, E→E ?sup E }=I1

goto(I0, {)= { E→{ ?E }, E→?E sub R, E→? E sup E, E→? { E }, E→? c }=I2

goto(I0, c)= { E→c? }=I3

goto(I1, sub)= { E→E sub ?R, R→?E sup E, R→?E, E→?E sub R, E→? E sup E, E→? { E }, E→?c }=I4

goto(I1, sup)= { E→E sup ?E, E→?E sub R, E→? E sup E, E→? { E }, E→? c }=I5

goto(I2, E)= { E→{ E ?}, E→E ?sub R, E→E ?sup E }=I6

goto(I2, {)= I2

编译原理龙书答案

P532.8 构建一个语法制导翻译模式,将算术表达式从后缀表示翻译成中缀表示。给出输入95-2*和952*-的注释分析树。(仅供参考一定要保证转换后的中缀表达式与原后缀表达式的优先级相同) 1 后缀算术表达式的文法如下: expr →expr expr + | expr expr – | expr expr * | expr expr / |digit digit →0 | 1 | 2 | 3 | … | 9 2 将后缀表达式翻译成中缀表达式的语法制导定义(文法+语义规则)

4 95-2*和952*-的翻译成后缀形式的语义动作与注释分析树。 expr expr expr * print(‘(‘) print(‘)‘) expr expr - 5 9 digit 2 print(‘-’) ‘9’) print(‘5’) print(‘2’) print(‘*’) 95-2*的深度优先遍历语义动作 expr expr expr - print(‘(‘) print(‘)‘) expr expr digit 2 digit 5 digit 9 print(‘*’) ‘5’) print(‘2’) print(‘9’) print(‘-’) 952*-的深度优先遍历语义动作

expr.t=(9-5)*2 expr=(9-5) expr.t=2 * expr.t=9 expr.t=5 - digit.t=5 5 digit.t=9 9 digit.t=2 2 输入为95-2*的注释分析树 expr.t=(9-5*2) expr.t=5*2 expr.t=9 - expr.t=5 expr.t=2 * digit.t=2 2 digit.t=5 5 digit.t=9 9 输入为952*-的注释分析树

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

精品文档 第二章 P36-6 (1) L G ()1是0~9组成的数字串 (2) 最左推导: N ND NDD NDDD DDDD DDD DD D N ND DD D N ND NDD DDD DD D ??????????????????0010120127334 556568 最右推导: N ND N ND N ND N D N ND N D N ND N ND N D ??????????????????77272712712701274434 886868568 P36-7 G(S) O N O D N S O AO A AD N →→→→→1357924680||||||||||| P36-8 文法: E T E T E T T F T F T F F E i →+-→→|||*|/()| 最左推导: E E T T T F T i T i T F i F F i i F 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 ?+?+?+?+?+?+?+?+??????+?+?+?+?+?+********()*()*()*()*()*()*() 最右推导: E E T E T F E T i E F i E i i T i i F i i i i i E T F T F F F E F E T F E F F E i F T i F F i F i i i i i ?+?+?+?+?+?+?+?+?????+?+?+?+?+?+?+**********()*()*()*()*()*()*()*() 语法树:/********************************

编译原理期末考试习题及答案

一、填空题|(每题4分,共20分) 1. 乔母斯基定义的3型文法(线性文法)产生式形式 A→Ba|a,或A→aB|a,A,B∈Vn, a,b∈Vt 。 2.语法分析程序的输入是单词符号,其输出是语法单位。 3 型为 B → .aB 的LR(0)项目被称为移进项目,型为 B → a.B 的LR(0) 项目被称为待约项目, 4.在属性文法中文法符号的两种属性分别为继承属性和综合属性。 5、运行时存贮管理方案有静态存储分配、动态存储分配和堆式存储分配和方案。 二.已知文法 G(S) (1) E → T | E+T (2) T → F | F*F (3) F →(E)| i (1)写出句型(T*F+i)的最右推到并画出语法树。(4分) (2)写出上述句型的短语,直接短语和句柄。(4分) 答:(1)最右推到(2分) E ==> T ==> F ==> (E) ==> (E+T) ==> (E+F) ==> (E+i) ==> (T+i) ==> (T*F+i) (2) 语法树(2分) (3)(4分) 短语:(T*F+i),T*F+i ,T*F , i 直接短语:T*F , i 句柄:T*F 三. 证明文法G(S) :S → SaS |ε是二义的。(6分) 答:句子aaa对应的两颗语法树为:

因此,文法是二义文法 四.给定正规文法G(S): (1) S → Sa | Ab |b (2) A → Sa 请构造与之等价的DFA。(6分) 答:对应的NFA为:(6分) 状态转换表: a b {F} Φ{S} {S} {S,A} Φ {S,A} {S,A} {S} 五. 构造识别正规语言b*a(bb*a)*b* 最小的DFA(要求写出求解过程)。(15分)答:(1)对应的NFA(5分) a b {0} {1,3} {0} {1,3} Φ{2,3} {2,3} {1,3} {2,3} (5分) 六. 已知文法G(S) : (1) S → ^ | a | (T) (2) T → T,S | S 试:(1)消除文法的左递归;(4分) (2)构造相应的first 和 follow 集合。(6分) 答:(1)消除文法的左递归后文法 G’(S)为: (1) S → ^ | a | (T)

(完整版)编译原理课后习题答案

第一章 1.典型的编译程序在逻辑功能上由哪几部分组成? 答:编译程序主要由以下几个部分组成:词法分析、语法分析、语义分析、中间代码生成、中间代码优化、目标代码生成、错误处理、表格管理。 2. 实现编译程序的主要方法有哪些? 答:主要有:转换法、移植法、自展法、自动生成法。 3. 将用户使用高级语言编写的程序翻译为可直接执行的机器语言程序有哪几种主要的方式? 答:编译法、解释法。 4. 编译方式和解释方式的根本区别是什么? 答:编译方式:是将源程序经编译得到可执行文件后,就可脱离源程序和编译程序单独执行,所以编译方式的效率高,执行速度快; 解释方式:在执行时,必须源程序和解释程序同时参与才能运行,其不产生可执行程序文件,效率低,执行速度慢。

第二章 1.乔姆斯基文法体系中将文法分为哪几类?文法的分类同程序设计语言的设计与实现关 系如何? 答:1)0型文法、1型文法、2型文法、3型文法。 2) 2. 写一个文法,使其语言是偶整数的集合,每个偶整数不以0为前导。 答: Z→SME | B S→1|2|3|4|5|6|7|8|9 M→ε | D | MD D→0|S B→2|4|6|8 E→0|B 3. 设文法G为: N→ D|ND D→ 0|1|2|3|4|5|6|7|8|9 请给出句子123、301和75431的最右推导和最左推导。 答:N?ND?N3?ND3?N23?D23?123 N?ND?NDD?DDD?1DD?12D?123 N?ND?N1?ND1?N01?D01?301 N?ND?NDD?DDD?3DD?30D?301 N?ND?N1?ND1?N31?ND31?N431?ND431?N5431?D5431?75431 N?ND?NDD?NDDD?NDDDD?DDDDD?7DDDD?75DDD?754DD?7543D?75431 4. 证明文法S→iSeS|iS| i是二义性文法。 答:对于句型iiSeS存在两个不同的最左推导: S?iSeS?iiSes S?iS?iiSeS 所以该文法是二义性文法。 5. 给出描述下面语言的上下文无关文法。 (1)L1={a n b n c i |n>=1,i>=0 } (2)L2={a i b j|j>=i>=1} (3)L3={a n b m c m d n |m,n>=0} 答: (1)S→AB A→aAb | ab B→cB | ε (2)S→ASb |ab

编译原理第第7和第8章作业

第七章作业 练习7.2.5:在一个通过引用传递参数的语言中,有一个函数f(x,y)完成下面的计算:x=x+1;y=y+2;return x+y; 如果将a赋值为3,然后调用f(a,a),那么返回值是什么? 解:执行语句x=x+1,则a=a+1=4, 再执行语句y=y+2,则a=a+2=5, 最后返回x+y,则返回a+a=9。 练习7.2.6:C语言函数f的定义如下: int f(int x,*py,**ppz) { **ppz+=1;*py+=2;x+=3;return x+*py+**ppz; } 变量a是一个指向b的指针;变量b是一个指向c的指针,而c是一个当前值为4的整数变量。如果我们调用f(c,b,a),返回值是什么? 解:先执行语句**ppz+=1,则c=*b=**a=5, 再执行语句*py+=2,则*b=*b+2=7,c=*b=**a=7, 接着执行语句x+=3,则x=4,x=x+3=7,而c=*b=**a=7, 最后执行语句return x+*py+**ppz,则返回7+7+7=21。 练习7.3.2:假使我们使用显示表来实现下图中的函数。请给出对fib0(1)的第一次调用即将返回时的显示表。同时指明那时在栈中的各个活动记录中保存的显示表条目。 计算Fibonacci数的嵌套函数 解:

第八章练习 练习8.2.1:假设所有的变量都存放在内存中,为下面的三地址语句生成代码: 5)两个语句的序列 x=b*c y=a+x 解:生成的代码如下: LD R1, b LD R2, c MUL R1, R1, R2 ST x, R1 LD R2, a ADD R1, R2, R1 ST y, R1 练习8.2.6:确定下列指令序列的代价。 1)LD R0,y LD R1,z ADD R0,R0,R1 ST x,R0 解:2+2+1+2=7 2)LD R0,i MUL R0,R0,8 LD R1,a(R0) ST b,R1 main() fib0(4) 保存的d[2] fib1(4) 保存的d[3] fib2(4) 保存的d[4] fib1(3) 保存的d[3] fib0(2) 保存的d[2] fib1(2) 保存的d[3] fib0(1) 保存的d[2] d[1] d[2] d[3] d[4]

编译原理龙书课后部分答案(英文版)

1) What is the difference between a compiler and an interpreter? A compiler is a program that can read a program in one language - the source language - and translate it into an equivalent program in another language – the target language and report any errors in the source program that it detects during the translation process. Interpreter directly executes the operations specified in the source program on inputs supplied by the user. 2) What are the advantages of: (a) a compiler over an interpreter a. The machine-language target program produced by a compiler is usually much faster than an interpreter at mapping inputs to outputs. (b) an interpreter over a compiler? b. An interpreter can usually give better error diagnostics than a compiler, because it executes the source program statement by statement. 3) What advantages are there to a language-processing system in which the compiler produces assembly language rather than machine language? The compiler may produce an assembly-language program as its output, because assembly language is easier to produce as output and is easier to debug. 4.2.3 Design grammars for the following languages: a) The set of all strings of 0s and 1s such that every 0 is immediately followed by at least 1. S -> SS | 1 | 01 | 4.3.1 The following is a grammar for the regular expressions over symbols a and b only, using + in place of | for unions, to avoid conflict with the use of vertical bar as meta-symbol in grammars: rexpr -> rexpr + rterm | rterm rterm -> rterm rfactor | rfactor rfactor -> rfactor * | rprimary rprimary -> a | b a) Left factor this grammar. rexpr -> rexpr + rterm | rterm rterm -> rterm rfactor | rfactor rfactor -> rfactor * | rprimary rprimary -> a | b

编译原理期末考试题目及答案

一、填空题(每空2分,共20分) 1.编译程序首先要识别出源程序中每个单词,然后再分析每个句子并翻译其意义。 2.编译器常用的语法分析方法有自底向上和自顶向下两种。 3.通常把编译过程分为分析前端与综合后端两大阶段。词法、语法和语义分析是对源程序的分析,中间代码生成、代码优化与目标代码的生成则是对源程序的综合。 4.程序设计语言的发展带来了日渐多变的运行时存储管理方案,主要分为两大类,即静态存储分配方案和动态存储分配方案。 5.对编译程序而言,输入数据是源程序,输出结果是目标程序。 1.计算机执行用高级语言编写的程序主要有两种途径:解释和编译。 2.扫描器是词法分析器,它接受输入的源程序,对源程序进行词法分析并识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。 3.自下而上分析法采用移进、归约、错误处理、接受等四种操作。 4.一个LL(1)分析程序需要用到一张分析表和符号栈。 5.后缀式abc-/所代表的表达式是a/(b-c)。 二、单项选择题(每小题2分,共20分) 1.词法分析器的输出结果是__C。 A.单词的种别编码B.单词在符号表中的位置 C.单词的种别编码和自身值D.单词自身值 2.正规式M 1 和M 2 等价是指__C_。 A.M1和M2的状态数相等 B.M1和M2的有向边条数相等 C.M1和M2所识别的语言集相等D.M1和M2状态数和有向边条数相等 3.文法G:S→xSx|y所识别的语言是_C____。 A.xyx B.(xyx)* C.xnyxn(n≥0) D.x*yx* 4.如果文法G是无二义的,则它的任何句子α_A____。 A.最左推导和最右推导对应的语法树必定相同B.最左推导和最右推导对应的语法树可能不同 C.最左推导和最右推导必定相同D.可能存在两个不同的最左推导,但它们对应的语法树相同5.构造编译程序应掌握____D__。 A.源程序B.目标语言C.编译方法D.以上三项都是 6.四元式之间的联系是通过__B___实现的。 A.指示器B.临时变量C.符号表D.程序变量 7.表达式(┐A∨B)∧(C∨D)的逆波兰表示为__B___。 A.┐AB∨∧CD∨B.A┐B∨CD∨∧ C.AB∨┐CD∨∧D.A┐B∨∧CD∨ 8. 优化可生成__D___的目标代码。 A.运行时间较短 B.占用存储空间较小 C.运行时间短但占用内存空间大D.运行时间短且占用存储空间小 9.下列___C___优化方法不是针对循环优化进行的。 A. 强度削弱B.删除归纳变量C.删除多余运算D.代码外提 10.编译程序使用_B_区别标识符的作用域。 A. 说明标识符的过程或函数名B.说明标识符的过程或函数的静态层次 C.说明标识符的过程或函数的动态层次 D. 标识符的行号 三、判断题(对的打√,错的打×,每小题1分,共10分) 2.一个有限状态自动机中,有且仅有一个唯一的终态。x

编译原理第4章作业答案

第四章 习题4.2.1:考虑上下文无关文法: S->S S +|S S *|a 以及串aa + a* (1)给出这个串的一个最左推导 S -> S S * -> S S + S * -> a S + S * -> a a + S * -> aa + a* (3)给出这个串的一棵语法分析树 习题4.3.1:下面是一个只包含符号a和b的正则表达式的文法。它使用+替代表示并运算的符号|,以避免和文法中作为元符号使用的竖线相混淆: rexpr→ rexpr + rterm | rterm rterm→rterm rfactor | rfactor rfactor→ rfactor * | rprimary rprimary→a | b 1)对这个文法提取公因子 2)提取公因子的变换使这个文法适用于自顶向下的语法分析技术吗? 3)提取公因子之后,原文法中消除左递归 4)得到的文法适用于自顶向下的语法分析吗? 解 1)提取左公因子之后的文法变为 rexpr→ rexpr + rterm | rterm rterm→rterm rfactor | rfactor rfactor→ rfactor * | rprimary rprimary→a | b 2)不可以,文法中存在左递归,而自顶向下技术不适合左递归文法 3)消除左递归后的文法

rexpr -> rterm rexpr’ rexpr’-> + rterm rexpr’|ε rterm-> rfactor rterm’ rterm’-> rfactor rterm’|ε rfactor-> rprimay rfactor’ rfactor’-> *rfactor’|ε rprimary-> a | b 4)该文法无左递归,适合于自顶向下的语法分析 习题4.4.1:为下面的每一个文法设计一个预测分析器,并给出预测分析表。可能要先对文法进行提取左公因子或消除左递归 (3)S->S(S)S|ε (5)S->(L)|a L->L,S|S 解 (3) ①消除该文法的左递归后得到文法 S->S’ S’->(S)SS’|ε ②计算FIRST和FOLLOW集合 FIRST(S)={(,ε} FOLLOW(S)={),$} FIRST(S’)={(,ε} FOLLOW(S’)={),$} ③ (5) ①消除该文法的左递归得到文法 S->(L)|a

编译原理课后答案

第二章 2.3叙述由下列正规式描述的语言 (a) 0(0|1)*0 在字母表{0, 1}上,以0开头和结尾的长度至少是2的01 串 (b) ((ε|0)1*)* 在字母表{0, 1}上,所有的01串,包括空串 (c) (0|1)*0(0|1)(0|1) 在字母表{0, 1}上,倒数第三位是0的01串 (d) 0*10*10*10* 在字母表{0, 1}上,含有3个1的01串 (e) (00|11)*((01|10)(00|11)*(01|10)(00|11)*)* 在字母表{0, 1}上,含有偶数个0和偶数个1的01串 2.4为下列语言写正规定义 C语言的注释,即以 /* 开始和以 */ 结束的任意字符串,但它的任何前缀(本身除外)不以 */ 结尾。 [解答] other → a | b | … other指除了*以外C语言中的其它字符 other1 → a | b | … other1指除了*和/以外C语言中的其它字符 comment → /* other* (* ** other1 other*)* ** */ (f) 由偶数个0和偶数个1构成的所有0和1的串。 [解答]由题目分析可知,一个符号串由0和1组成,则0和1的个数只能有四种情况: x 偶数个0和偶数个1(用状态0表示); x 偶数个0和奇数个1(用状态1表示); x 奇数个0和偶数个1(用状态2表示); x 奇数个0和奇数个1(用状态3表示);所以, x 状态0(偶数个0和偶数个1)读入1,则0和1的数目变为:偶数个0和奇数个1(状态1) x 状态0(偶数个0和偶数个1)读入0,则0和1的数目变为:奇数个0和偶数个1(状态2) x 状态1(偶数个0和奇数个1)读入1,则0和1的数目变为:偶数个0和偶数个1(状态0) x 状态1(偶数个0和奇数个1)读入0,则0和1的数目变为:奇数个0和奇数个1(状态3) x 状态2(奇数个0和偶数个1)读入1,则0和1的数目变为:奇数个0和奇数个1(状态3) x 状态2(奇数个0和偶数个1)读入0,则0和1的数目变为:偶数个0和偶数个1(状态0) x 状态3(奇数个0和奇数个1)读入1,则0和1的数目变为:奇数个0和偶数个1(状态2) x 状态3(奇数个0和奇数个1)读入0,则0和1的数目变为:偶数个0和奇数个1(状态1) 因为,所求为由偶数个0和偶数个1构成的所有0和1的串,故状态0既为初始状态又为终结状态,其状态转换图: 由此可以写出其正规文法为: S0 → 1S1 | 0S2 | ε S1 → 1S0 | 0S3 | 1 S2 → 1S3 | 0S0 | 0 S3 → 1S2 | 0S1 在不考虑S0 →ε产生式的情况下,可以将文法变形为: S0 = 1S1 + 0S2 S1 = 1S0 + 0S3 + 1 S2 = 1S3 + 0S0 + 0 S3 = 1S2 + 0S1 所以: S0 = (00|11) S0 + (01|10) S3 + 11 + 00 (1) S3 = (00|11) S3 + (01|10) S0 + 01 + 10 (2) 解(2)式得: S3 = (00|11)* ((01|10) S0 + (01|10)) 代入(1)式得: S0 = (00|11) S0 + (01|10) (00|11)*((01|10) S0 + (01|10)) + (00|11) => S0 = ((00|11) + (01|10) (00| 11)*(01|10))S0 + (01|10) (00|11)*(01|10) + (00|11) => S0 = ((00|11)|(01|10) (00|11)*(01|10))*((00|1

编译原理试题及答案3

编译原理复习题 一、填空题: 1、编译方式与解释方式的根本区别在于(是否生成目标代码)。 2、对编译程序而言,输入数据是(源程序),输出结果是(目标程序)。 3、如果编译程序生成的目标程序是机器代码程序,则源程序的执行分为两大阶段:(编译阶段)和(运行阶段)。 4、如果编译程序生成的目标程序是汇编语言程序,则源程序的执行分成三个阶段:(编译阶段)、(汇编阶段)和(运行阶段)。 5、自顶向下语法分析方法会遇到的主要问题有(回溯)和((左递归带来的)无限循环)。 6、LL(k)分析法中,第一个L的含义是(从左到右进行分析),第二个L的含义是(每次进行最左推导),“k”的含义是(向输入串中查看K个输入符号)。 7、LL(1)分析法中,第一个L的含义是(从左到右进行分析),第二个L的含义是(每次进行最左推导),“1”的含义是(向输入串中查看1个输入符号)。 8、自顶向下语法分析方法的基本思想是:从(识别符号)出发,不断建立(直接推导),试图构造一个推导序列,最终由它推导出与输入符号相同的(符号串)。 9、自底向上语法分析方法的基本思想是:从待输入的符号串开始,利用文法的规则步步向上进行(直接归约),试图(归约)到文法的(识别符号|开始符号)。 10、LR(0)分析法的名字中,“L”的含义是(从左到右进行分析),“R”的含义是(采用最右推导的逆过程---最左归约),“0”的含义是(向貌似句柄的符号串后查看0个输入符号)。 11、LR(1)分析法的名字中,“L”的含义是(从左到右进行分析),“R”的含义是(采用最右推导的逆过程---最左归约),“1”的含义是(向貌似句柄的符号串后查看1个输入符号)。 12、SLR(1)分析法的名字中,“S”的含义是(简单的),“L”的含义是(从左到右进行分析),“R”的含义是(采用最右推导的逆过程---最左归约),“1”的含义是(向貌似句柄的符号串后查看1个输入符号)。 13、在编译过程中,常见的中间语言形式有(逆波兰表示)、(三元式)、(四元式)和(树形表示)。 14、在编译程序中安排中间代码生成的目的是(便于代码优化)和(便于目标程序的移植)。 15、表达式-a+b*(-c+d)的逆波兰表示为(a-bc-d+*+ )。 16、表达式a+b*(c+d/e)的逆波兰表示为(abcde/+*+ )。 17、表达式a:=a+b*c↑(d/e)/f的逆波兰表示为(aabcde/↑*f/+:= )。 18、文法符号的属性有(继承属性)和(综合属性)两种。 19、一个文法符号的继承属性是通过语法树中它的(兄弟结点与父)结点的相应文法符号的属性来计算的。 20、一个文法符号的综合属性是通过语法树中它的(子)结点的属性来计算的。

编译原理 龙书答案

第四章部分习题解答 Aho:《编译原理技术与工具》书中习题 (Aho)4.1 考虑文法 S →( L ) | a L →L, S | S a)列出终结符、非终结符和开始符号 解: 终结符:(、)、a、, 非终结符:S、L 开始符号:S b)给出下列句子的语法树 i)(a, a) ii)(a, (a, a)) iii)(a, ((a, a), (a, a))) c)构造b)中句子的最左推导 i)S?(L)?(L, S) ?(S, S) ?(a, S) ?(a, a) ii)S?(L)?(L, S) ?(S, S) ?(a, S) ?(a, (L)) ?(a, (L, S)) ?(a, (S, S)) ?(a, (a, S) ?(a, (a, a)) iii)S?(L)?(L, S) ?(S, S) ?(a, S) ?(a, (L)) ?(a, (L, S)) ?(a, (S, S)) ?(a, ((L), S)) ?(a, ((L, S), S)) ?(a, ((S, S), S)) ?(a, ((a, S), S)) ?(a, ((a, a), S)) ?(a, ((a, a), (L))) ?(a, ((a, a), (L, S))) ?(a, ((a, a), (S, S))) ?(a, ((a, a), (a, S))) ?(a, ((a, a), (a, a))) d)构造b)中句子的最右推导

i)S?(L)?(L, S) ?(L, a) ?(S, a) ?(a, a) ii)S?(L)?(L, S) ? (L, (L)) ?(L, (L, S)) ?(L, (L, a)) ?(L, (S, a)) ?(L, (a, a)) ?(S, (a, a)) ?(a, (a, a)) iii)S?(L)?(L, S) ?(L, (L)) ?(L, (L, S)) ?(L, (L, (L))) ?(L, (L, (L, S))) ?(L, (L, (L, a))) ?(L, (L, (S, a))) ?(L, (L, (a, a))) ?(L, (S, (a, a))) ?(L, ((L), (a, a))) ?(L, ((L, S), (a, a))) ?(L, ((L, a), (a, a))) ?(L, ((S, a), (a, a))) ?(L, ((a, a), (S, S))) ?(S, ((a, a), (a, a))) ?(a, ((a, a), (a, a))) e)该文法产生的语言是什么 解:设该文法产生语言(符号串集合)L,则 L = { (A1, A2, …, A n) | n是任意正整数,A i=a,或A i∈L,i是1~n之间的整数} (Aho)4.2考虑文法 S→aSbS | bSaS | ε a)为句子构造两个不同的最左推导,以证明它是二义性的 S?aSbS?abS?abaSbS?ababS?abab S?aSbS?abSaSbS?abaSbS?ababS?abab b)构造abab对应的最右推导 S?aSbS?aSbaSbS?aSbaSb?aSbab?abab S?aSbS?aSb?abSaSb?abSab?abab c)构造abab对应语法树 d)该文法产生什么样的语言? 解:生成的语言:a、b个数相等的a、b串的集合 (Aho)4.3 考虑文法 bexpr→bexpr or bterm | bterm bterm→bterm and bfactor | bfactor bfactor→not bfactor | ( bexpr ) | true | false a)试为句子not ( true or false)构造分析树 解:

编译原理课后习题答案

第1 章 1、编译过程包括哪几个主要阶段及每个 阶段的功能。 答案:编译过程包括词法分析、语法分析、语义分析和中间代码生成、优化、目标代码生成5 个阶段。词法分析的功能是对输入的高级语言源程序进行词法分析,识别其中的单词符号,确定它们的种类,交给语法分析器,即把字符串形式的源程序分解为单词符号串形式。语法分析的功能是在词法分析结果的基础上,运用语言的语法规则,对程序进行语法分析,识别构成程序的各类语法范畴及它们之间的层次关系,并把这种层次关系表达成语法树的形式。词义分析和中间代码生成的功能是在语法分析的基础上,对程序进行语义分析,“理解”其含义,产生出表达程序语义的内部表达形式(中间代码)。优化的功能是按照等价变换的原则,对语义分析器产生的中间代码序列进行等价变换,删除其中多余的操作,对耗时耗空间的代码进行优化,以期最后得到高效的可执行代码。目标代码生成的功能是把优化后的中间代码变换成机器指令代码,得到可在目标机器上执行的机器语言程序。 第2 章 1、写一上下文无关文法G,它能产生配 对的圆括号串(如:(),(()),()(())等,甚至 包括0 对括号) 文法为:S→(L)|LS|L L→S| ε 2 、已知文法G :E→E+T|E-T|T T→T*F|T/F|F F→(E) |i (1)给出i+i*i,i*(i-i)的最左推导,最右推导以及语法树。 (2)i-i+i 哪个算符优先。 【解答】 (1)最左推导:E?E+T?T+T? F+T ? i+T ? i+T*F ? i+F*F ?i+i*F ?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) 最右推导:E?E+T?E+T*F? E+T*i ? E+F*i ? E+i*i ? T+i*i ? F+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) i+i*i 以及i*(i-i)的语法树如下所示: (2)i-i+i 的语法树如下图所示。 从上图的语法树可知:“-”的位置位 于“+”的下层,也就是前面两个i 先进 行“-”运算,再与后面的i 进行“+” 运算,所以“-”的优先级高于“+”的 优先级。 3 、文法G: E→ET+|T T→TF*|F F→FP↑|P P→E|i (1)试证明符号串TET+*i↑是G 的一 个句型(要求画出语法树). (2)写出该句型的所有短语,直接短语和句柄. 【解答】(1)采用最右推导: E?T?F? FP↑? Fi↑? Pi↑? Ei↑ ? Ti↑? TF*i↑? TP*i↑? TE*i↑? TET+*i↑ 语法树如下图所示。 从文法G 的起始符号出发,能够推导 出符号串TET+*i↑,所以给定符号串是文法G的句型。 (2) 该句型的短语有: ET+,TET+*,i ,TET+*i↑ 直接短语有:ET+, i 句柄是:ET+ 4、已知文法G:S→iSeS|iS|i ,该文法 是二义文法吗?为什么? 【解答】该文法是二义文法。 因为对于句子iiiei 存在两种不同的最 左推导: 第 1 种推导:S? iSeS? iiSeS? iiieS? iiiei 第2种推导:S?iS?iiSeS?iiieS?iiiei 第3 章 1、用正规式描述下列正规集: (1)C 语言的十六进制整数; (2)以ex 开始或以ex 结束的所有小写字母构成的符号串; (3)十进制的偶数。 【解答】 (1)C 语言十六进制整数以0x 或者0X 开头,所以一般形式应该为(+|-|ε) (0x|0X)AA*,其中前面括号表示符号, 可以有正号、负号,也可以省略(用ε表示)默认是正数,A 表示有资格出现在十六进制整数数位上的数字,AA*表示一位或者多位(一个或者多个数字的

编译原理试题及答案

参考答案 一、单项选择题(共10小题,每小题2分,共20分) 1.语言是 A .句子的集合 B .产生式的集合 C .符号串的集合 D .句型的集合 2.编译程序前三个阶段完成的工作是 A .词法分析、语法分析和代码优化 B .代码生成、代码优化和词法分析 C .词法分析、语法分析、语义分析和中间代码生成 D .词法分析、语法分析和代码优化 3.一个句型中称为句柄的是该句型的最左 A .非终结符号 B .短语 C .句子 D .直接短语 4.下推自动机识别的语言是 A .0型语言 B .1型语言 C .2型语言 D .3型语言 5.扫描器所完成的任务是从字符串形式的源程序中识别出一个个具有独立含义的最小语法单位即 A . 字符 B .单词 C .句子 D .句型 6.对应Chomsky 四种文法的四种语言之间的关系是 A .L 0?L 1?L 2?L 3 B .L 3?L 2?L 1?L 0 C .L 3=L 2?L 1?L 0 D .L 0?L 1?L 2=L 3 7.词法分析的任务是 A .识别单词 B .分析句子的含义 C .识别句子 D .生成目标代码 8.常用的中间代码形式不含 A .三元式 B .四元式 C .逆波兰式 D .语法树 9. 代码优化的目的是 A .节省时间 B .节省空间 C .节省时间和空间 D .把编译程序进行等价交换 10.代码生成阶段的主要任务是 A .把高级语言翻译成汇编语言 B .把高级语言翻译成机器语言 C .把中间代码变换成依赖具体机器的目标代码 装 订 线

D.把汇编语言翻译成机器语言 二、填空题(本大题共5小题,每小题2分,共10分) 1.编译程序首先要识别出源程序中每个(单词),然后再分析每个(句子)并翻译其意义。2.编译器常用的语法分析方法有(自底向上)和(自顶向下)两种。 3.通常把编译过程分为分析前端与综合后端两大阶段。词法、语法和语义分析是对源程序的(分析),中间代码生成、代码优化与目标代码的生成则是对源程序的(综合)。 4.程序设计语言的发展带来了日渐多变的运行时存储管理方案,主要分为两大类,即(静态存储分配)方案和(动态存储分配)方案。 5.对编译程序而言,输入数据是(源程序),输出结果是(目标程序)。 三、名词解释题(共5小题,每小题4分,共20分) 1.词法分析 词法分析的主要任务是从左向右扫描每行源程序的符号,按照词法规则 从构成源程序的字符串中识别出一个个具有独立意义的最小语法单位, 并转换成统一的内部表示(token),送给语法分析程序。 2.LL(1)文法 若文法的任何两个产生式A →α | β都满足下面两个条件: (1)FIRST(α) ? FIRST(β ) = φ; (2)若β?* ε,那么FIRST(α) ? FOLLOW( A ) = φ。 我们把满足这两个条件的文法叫做LL(1)文法,其中的第一个L代表从左 向右扫描输入,第二个L表示产生最左推导,1代表在决定分析器的每步 动作时向前看一个输入符号。除了没有公共左因子外,LL(1)文法还有一 些明显的性质,它不是二义的,也不含左递归。 3.语法树 句子的树结构表示法称为语法树(语法分析树或语法推导树)。 给定文法G=(V N,V T,P,S),对于G的任何句型都能构造与之关联的 语法树。这棵树具有下列特征: (1)根节点的标记是开始符号S。 (2)每个节点的标记都是V中的一个符号。 (3)若一棵子树的根节点为A,且其所有直接子孙的标记从左向右的排列 次序为A1A2…A R,那么A→A1A2…A R一定是P中的一条产生式。

龙书 第四章课后作业答案

P1774.14 为练习4.3的文法构造一个预测语法分析器 bexpr→bexpr or bterm|bterm bterm→bterm and bfactor | bfactor bfactor→not bfactor|(bexpr)|true |false 解1 非递归方法 1)消除左递归 ①bexpr→bterm A ②A→or bterm A ③A→ε ④bterm→bfactor B ⑤B→and bfactor B ⑥B→ε ⑦bfactor→not bfactor ⑧bfactor→(bexpr) ⑨bfactor→true ⑩bfactor→false 2)求first集与follow集 针对以同一非总结符开头的产生式右部求first集如果该非终结符能产生ε则需要求其follow集 ①bexpr→bterm A first(bterm A)= {not,(,true,false} ②A→or bterm A first(or bterm A)={or} ③A→εfollow(A)=follow(bexpr)= {$, )} ④bterm→bfactor B first(bfactor B)={not,(,true,false} ⑤B→and bfactor B first(and bfactor B)={and} ⑥B→εfollow(B)=follow(bterm)=first(A) 因为first(A)= {or , ε} 包含ε 所以follow(B)=follow(bterm) =first(A)∪follow(A)-{ε}={or, $, )} ⑦bfactor→not bfactor first(not bfactor)={not} ⑧bfactor→(bexpr)first((bexpr))={(} ⑨bfactor→true first(true)={true} ⑩bfactor→false first(false)={false} 表中空白处填error,表示调用错误处理程序 4)根据步骤3)编写预测分析程序 下面给出通用的预测分析算法,具体程序留给同学们根据算法自己完善。 repeat

编译原理(清华大学 第2版)课后习题答案

第三章 N=>D=> {0,1,2,3,4,5,6,7,8,9} N=>ND=>NDD L={a |a(0|1|3..|9)n且 n>=1} (0|1|3..|9)n且 n>=1 {ab,} a n b n n>=1 第6题. (1) <表达式> => <项> => <因子> => i (2) <表达式> => <项> => <因子> => (<表达式>) => (<项>) => (<因子>)=>(i) (3) <表达式> => <项> => <项>*<因子> => <因子>*<因子> =i*i (4) <表达式> => <表达式> + <项> => <项>+<项> => <项>*<因子>+<项> => <因子>*<因子>+<项> => <因子>*<因子>+<因子> = i*i+i (5) <表达式> => <表达式>+<项>=><项>+<项> => <因子>+<项>=i+<项> => i+<因子> => i+(<表达式>) => i+(<表达式>+<项>) => i+(<因子>+<因子>) => i+(i+i) (6) <表达式> => <表达式>+<项> => <项>+<项> => <因子>+<项> => i+<项> => i+<项>*<因子> => i+<因子>*<因子> = i+i*i 第7题

第9题 语法树 s s s* s s+a a a 推导: S=>SS*=>SS+S*=>aa+a* 11. 推导:E=>E+T=>E+T*F 语法树: E +T * 短语: T*F E+T*F 直接短语: T*F 句柄: T*F 12.

短语: 直接短语: 句柄: 13.(1)最左推导:S => ABS => aBS =>aSBBS => aBBS => abBS => abbS => abbAa => abbaa 最右推导:S => ABS => ABAa => ABaa => ASBBaa => ASBbaa => ASbbaa => Abbaa => a1b1b2a2a3 (2) 文法:S → ABS S → Aa S →ε A → a B → b (3) 短语:a1 , b1 , b2, a2 , , bb , aa , abbaa, 直接短语: a1 , b1 , b2, a2 , , 句柄:a1 14 (1) S → AB A → aAb | ε B → aBb | ε (2) S → 1S0 S → A A → 0A1 |ε 第四章 1. 1. 构造下列正规式相应的DFA (1)1(0|1)*101 NFA (2) 1(1010*|1(010)*1)*0 NFA

编译原理考试试题与答案(汇总)

《编译原理》考试试题及答案(汇总) 一、是非题(请在括号,正确的划√,错误的划×)(每个2分,共20分) 1.编译程序是对高级语言程序的解释执行。(× ) 2.一个有限状态自动机中,有且仅有一个唯一的终态。(×) 3.一个算符优先文法可能不存在算符优先函数与之对应。(√ ) 4.语法分析时必须先消除文法中的左递归。(×) 5.LR分析法在自左至右扫描输入串时就能发现错误,但不能准确地指出出错地点。(√) 6.逆波兰表示法表示表达式时无须使用括号。(√ ) 7.静态数组的存储空间可以在编译时确定。(×) 8.进行代码优化时应着重考虑循环的代码优化,这对提高目标代码的效率将起更大作用。(×) 9.两个正规集相等的必要条件是他们对应的正规式等价。(× ) 10.一个语义子程序描述了一个文法所对应的翻译工作。(×) 二、选择题(请在前括号选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共40分) 1.词法分析器的输出结果是_____。 A.( ) 单词的种别编码B.( ) 单词在符号表中的位置 C.( ) 单词的种别编码和自身值D.( ) 单词自身值 2.正规式 M 1 和 M 2 等价是指_____。 A.( ) M1和M2的状态数相等 B.( ) M1和M2的有向边条数相等C.( ) M1和M2所识别的语言集相等D.( ) M1和M2状态数和有向边条数相等

3.文法G:S→xSx|y所识别的语言是_____。 A.( ) xyx B.( ) (xyx)* C.( ) xnyxn(n≥0) D.( ) x*yx* 4.如果文法G是无二义的,则它的任何句子α_____。 A.( )最左推导和最右推导对应的语法树必定相同 B.( ) 最左推导和最右推导对应的语法树可能不同 C.( ) 最左推导和最右推导必定相同 D.( )可能存在两个不同的最左推导,但它们对应的语法树相同 5.构造编译程序应掌握______。 A.( )源程序B.( ) 目标语言 C.( ) 编译方法 D.( ) 以上三项都是 6.四元式之间的联系是通过_____实现的。 A.( ) 指示器B.( ) 临时变量 C.( ) 符号表 D.( ) 程序变量 7.表达式(┐A∨B)∧(C∨D)的逆波兰表示为_____。 A. ( ) ┐AB∨∧CD∨B.( ) A┐B∨CD∨∧ C.( ) AB∨┐CD∨∧ D.( ) A┐B∨∧CD∨ 8. 优化可生成_____的目标代码。 A.( ) 运行时间较短B.( ) 占用存储空间较小C.( ) 运行时间短但占用存空间大D.( ) 运行时间短且占用存储空间小 9.下列______优化方法不是针对循环优化进行的。 A. ( ) 强度削弱 B.( ) 删除归纳变量 C.( ) 删除多余运算 D.( ) 代码外提

相关主题