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

发布时间:2020-05-10 07:07:18

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

 4 

对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、

代码生成)报告的。

1 else 没有匹配的if

2 数组下标越界

3 使用的函数没有定义

4 在数中出现非数字字符

答案:

1 语法分析

2 语义分析

3 语法分析

4 词法分析

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



文法G({A,B,S},{a,b,c},P,S)其中为:

SAc|aB

Aab

Bbc

写出L(G[S])的全部元素。

答案:

L(G[S])={abc}



文法G[N]为:

ND|ND

D0|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题

为只包含数字、加号和减号的表达式,例如9-253-1,7等构造一个文法。

答案:

G[S]:

S->S+D|S-D|D

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



已知文法G[Z]

ZaZb|ab

写出L(G[Z])的全部元素。

答案:

Z=>aZb=>aaZbb=>aaa..Z...bbb=> aaa..ab...bbb

L(G[Z])={anbn|n>=1}



写一文法,使其语言是偶正整数的集合。 要求:

(1) 允许打头;

(2)不允许打头。

答案:

(1)允许开头的偶正整数集合的文法

ENT|D

TNT|D

ND|1|3|5|7|9

D0|2|4|6|8

(2)不允许开头的偶正整数集合的文法

ENT|D

TFT|G

ND|1|3|5|7|9

D2|4|6|8

FN|0

GD|0



已知文法G

<表达式>::=<><表达式><>

<>::=<因子><>*<因子>

<因子>::=<表达式>)|i

试给出下述表达式的推导及语法树。

(5)i+(i+i)

(6)i+i*i

答案:

<表达式>

<表达式> + <>

<因子>

<表达式>

<表达式> + <>

<因子>

i

<>

<因子>

i

<>

<因子>

i

 )

(5) <表达式>

=><表达式><>

=><表达式><因子>

=><表达式>+(<表达式>

=><表达式>+(<表达式><>

=><表达式>+(<表达式><因子>

=><表达式>+(<表达式>i

=><表达式>+(<>i

=><表达式>+(<因子>i

=><表达式>+(ii

=><>+(ii

=><因子>+(ii

=>i+(ii

<表达式>

<表达式> + <>

<> * <因子>

<因子> i

<>

<因子>

i

i

(6) <表达式>

=><表达式><>

=><表达式><>*<因子>

=><表达式><>*i

=><表达式><因子>*i

=><表达式>i*i

=><>i*i

=><因子>i*i

=>ii*i



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

〈表达式〉∷=a|(〈表达式〉)|〈表达式〉〈运算符〉〈表达式〉

〈运算符〉∷=+|-|*|/

答案:

可为句子a+a*a 构造两个不同的最右推导:

最右推导〈表达式〉〈表达式〉〈运算符〉〈表达式〉

〈表达式〉〈运算符〉a

〈表达式〉* a

〈表达式〉〈运算符〉〈表达式〉* a

〈表达式〉〈运算符〉a * a

〈表达式〉+ a * a

a + a * a

最右推导〈表达式〉〈表达式〉〈运算符〉〈表达式〉

〈表达式〉〈运算符〉〈表达式〉〈运算符〉〈表达式〉

〈表达式〉〈运算符〉〈表达式〉〈运算符〉 a

〈表达式〉〈运算符〉〈表达式〉 * a

〈表达式〉〈运算符〉a * a

〈表达式〉+ a * a

a + a * a



文法G[S]为:

SAc|aB

Aab

Bbc

该文法是否为二义的?为什么?

答案:

对于串abc

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

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

或者:

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

S

a B

b c

S

A c

a b



考虑下面上下文无关文法:

SSS*|SS+|a

(1)表明通过此文法如何生成串aa+a*,并为该串构造语法树。

S

S S *

S S + a

a a

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

答案:

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

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

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

10 

文法SS(S)S|ε

(1) 生成的语言是什么?

(2) 该文法是二义的吗?说明理由。

答案:

(1) 嵌套的括号

(2) 是二义的,因为对于()()可以构造两棵不同的语法树。

11 

令文法G[E]为:

ET|E+T|E-T

TF|T*F|T/F

F(E)|i

证明E+T*F 是它的一个句型,指出这个句型的所有短语、直接短语和句柄。

答案:

此句型对应语法树如右,故为此文法一个句型。

或者:因为存在推导序列: E=>E+T=>E+T*F,所

 E+T*F 句型

此句型相对于的短语有:E+T*F;相对于的短语

T*F

直接短语为:T*F

句柄为:T*F

13 

一个上下文无关文法生成句子abbaa 的推导树如下:

(1)给出串abbaa 最左推导、最右推导。

(2)该文法的产生式集合可能有哪些元素?

(3)找出该句子的所有短语、直接短语、句柄。

B

a

S

A B S

a

S B A

ε b b a

答案:

(1)abbaa 最左推导:

S=>ABS=>aBS=>aSBBS=>aBBS=>abBS=>abbS=>abbAa=>abbaa

最右推导:

S=>ABS=>ABAa=>ABaa=>ASBBaa=>ASBbaa=>ASbbaa=>Abbaa=>abbaa

(2)产生式有:SABS |Aa|ε Aa BSBB|b

可能元素有:ε aa ab abbaa aaabbaa ……

(3)该句子的短语有:

是相对的短语

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

相关推荐