编译原理(第3版-王生原)课后习题答案-第二章

1.文法G=({A,B,S},{a,b,c},P,S)其中Р为:S→Ac|aB
A→ab→bc
写出L(GISJ)的全部元素。

答案: 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} (允许 0 开头的非负整数)

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

答案:G[S]: S→S+DIS-DID

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

4.证明文法G=({E,O}),{(,),+,*,v,d},P,E)是二义的,其中P为
E->EOE|(E)|v|d
O->+|*

答案:E=>EOE=>EOEOE

E=>EOE=>EOEOE

有两个不同的最左推导(两颗不同的语法树),所以是二义的。

5.已知文法 G[Z]:
Z::=a Z b
Z::=a b
写出 L(G[Z])的全部元素。

答案:L(G[Z])={|n≥1}

6.已知文法 G:
<表达式>::=<项>| <表达式>+<项>
<项>::=<因子>| <项>*<因子>
<因子>::= (<表达式>) l i
试给出下述表达式的推导及语法树。
(1)i (2) (i) (3) i*i
(4)i*i+i (5) i+(i+i) (6) i+i*i

答案:

7.习题1中的文法G[S]是二义的吗?为什么?

答案:是二义的,对于一个产生式有两个不同的语法树。

8.考虑下面的上下文无关文法:
S->SS*|SS+|a
(1)表明通过此文法如何生成串 aa+a*,并为该串构造语法树.
(2)该文法生成的语言是什么?

答案:

(1)S=>SS*=>SS+S*=>aS+S*=>aa+S*=>aa+a*

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

9.文法 S->S(S)S|ε
(1)该文法生成的语言是什么?
(2)该文法是二义的吗? 说明理由。

答案:(1)生成的语言是:嵌套的括号

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

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

答案:存在推导序列:E=>E+T=>E+T*F,所以E+T*F 是它的一个句型。

短语:T*F、E+T*F

直接短语:T*F

句柄:T*F

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)产生式有:S->ABS|Aa|ε、A->a、B->SBB|b

可能元素有:ε、aa、ab、abbaa、aaabbaa......

(3)短语:a、ε、b、εbb、aa、aεbbaa

简单(直接)短语:a、ε、b

句柄:a

12.构造产生如下语言的上下文无关文法各一个:
(1) { }
(2) { }
(3) { {a,b}* |u|=|w|}
(4) { }
(5) { }
(6) { {a,b}*},其中, 表示w的反向串,其含义是将w中的字母依次反转,首尾字母交换 位置,下同。
(7) { {a,b}+ |u|=|w|=1}
(8) {w|w∈{a,b} w= }

答案:

13.构造产生如下语言的上下文无关文法各一个:
(1) { }
(2) { {a,b}*}
懒得打了......CSDN写公式太麻烦了,找找规律吧。

答案:

(1)G[S]:S->AB

A->ε|aAbb

B->ε|CB

(2)G[S]:S->aSa|bSb|c

15.分以下两种情况,各写一个文法,使其语言是十进制非负偶数的集合:
(1)允许0打头。
(2)不允许0大头。

答案:

(1)G[S]:S->D|NT

D->0|2|4|6|8

N->1|3|5|7|9|D

T->NT|D

(2)G[S]:S->D|NT

D->2|4|6|8

N->1|3|5|7|9|D

T->0|D|FT

F->0|N

  • 55
    点赞
  • 399
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
1解:源程序是指以某种程序设计语言所编写的程序。目标程序是指编译程序(或解释程序)将源程序处理加工而得的另一种语言(目标语言)的程序。翻译程序是将某种语言翻译成另一种语言的程序的统称。编译程序与解释程序均为翻译程序,但二者工作方法不同。解释程序的特点是并不先将高级语言程序全部翻译成机器代码,而是每读入一条高级语言程序语句,就用解释程序将其翻译成一段机器指令并执行之,然后再读入下一条语句继续进行解释、执行,如此反复。即边解释边执行,翻译所得的指令序列并不保存。编译程序的特点是先将高级语言程序翻译成机器语言程序,将其保存到指定的空间中,在用户需要时再执行之。即先翻译、后执行。 2解:一般说来,编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。 3解:C语言的关键字有:auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while。上述关键字在C语言中均为保留字。 4解:C语言中括号有三种:{},[],()。其中,{}用于语句括号;[]用于数组;()用于函数(定义与调用)及表达式运算(改变运算顺序)。C语言中无END关键字。逗号在C语言中被视为分隔符和运算符,作为优先级最低的运算符,运算结果为逗号表达式最右侧子表达式的值(如:(a,b,c,d)的值为d)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值