编译原理习题解答
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
由于<E> => <E>且<E> => <E><T><F><MOP><POP>,所以<E><T><F><MOP><POP>是句型<E><T><F><MOP><POP>相对于<E>的短语。
显然,句型<E><T><F><MOP><POP>的句柄是<T><F><MOP>。
14. 给出生成下述语言的上下文无关文法:
P:
SPD|D
P->NP|N
D0|2|4|6|8
N->0|1|2|3|4|5|6|7|8|9
(2)G[S]=({S,P,R,D,N,Q },{0,1,2,…,9},P,S)
P:
SPD|P0|D
P->NR|N
R->QR|Q
D2|4|6|8
N->1|2|3|4|5|6|7|8|9
Q->0|1|2|3|4|5|6|7|8|9
=>i+<项>*<因子>=> i+<因子>*<因子>=> i+i*i=w
语法树见下图:
7. 为句子i+i*i构造两棵语法树,从而证明下述文法G[<表达式>]是二义的。
<表达式>::=i|(<表达式>)|<表达式><运算符><表达式>
<运算符>::=+|-|*|/
解:为句子i+i*i构造的两棵语法树如下:
6. 已知文法G:
<表达式>::=<项>|<表达式>+<项>|<表达式>-<项>
<项>::=<因子>|<项>*<因子>|<项>/<因子>
<因子>::=(<表达式>)|i。
试给出下述表达式的推导及语法树。
(1)i;(2)(i)(3)i*i;
(4)i*i+i;(5)i+(i+i);(6)i+i*i。
解:
第二章:习题2-4 Table表
var x,y;
procedure p;
var a;
procedure q;
var b;
begin
b:=10;
end;
procedure s;
var c,d;
procedure r;
var e,f;
begin
call q;
end;
begin
call r;
end;
begin
<E><E><T><POP>|<T>
<T><T><F><MOP>|<F>
<F>a|b|c
<POP>+|-
<MOP>*|/
解:
(1)计算文法G[E]的语言:
由于L(T)={(a|b|c)((a|b|c)(*|/))n|n>=0}
所以L(E)={L(T)(L(T)(+|-))n|n>=0}
(2)该文法的一个句子是aab*+,它的语法树是:
所以,该文法是二义的。
8. 习题1中的文法G[S]是二义的吗?为什么?
答:是二义的。因为对于句子abc可以有两种不同的生成树,即:S=>Ac=>abc和S=>aB=>abc
11. 令文法G[E]为:
ET|E+T|E-T
TF|T*F|T/F
F(E)|i
证明E+T*F是它的一个句型,指出这个句型的所有短语、直接短语和句柄。
call s;
end;
begin
call p;
end
根据:Page289,变量table:array[0..txmax] of record结构体以及block函数得到下表,而表中各部分的含义,见教材Page18,Page19
Name
Kink
Val /Level
Adr
Size
x
variable
0
3
0
(3)证明:<E><T><F><MOP><POP>是G[<E>]的句型,并指出该句型的所有短语、直接短语和句柄。
由于下面的语法树可以生成<E><T><F><MOP><POP>,所以它是G[<E>]的句型。
由于<E>=> <E><T><POP>,且<T> => <T><F><MOP>,所以<T><F><MOP>是句型<E><T><F><MOP><POP>相对于<T>的短语,也是相对于规则<T><T><F><MOP>的直接短语。
y
variable
0
4
0
p
procedur
0
1
0
a
variable
1
3
0
q
procedur
1
3
4
s
procedur
1
7
0
c
variable
2
3
0wenku.baidu.com
d
variable
2
4
0
r
procedur
2
0
0
第三章文法和语言
5. 写一文法,使其语言是偶正整数的集合
要求:
(1)允许0打头
(2)不允许0打头
解:
(1)G[S]=({S,P,D,N},{0,1,2,…,9},P,S)
=><因子>*<因子>+<因子>=>i*i+i=w
(5)v=<表达式>=><表达式>+<项>=><项>+<项>=><因子>+<因子>=>i+(<表达式>)
=> i+(<表达式>+<项>)=>i+(<项>+<项>)=> i+(<因子>+<因子>)=>i+(i+i)=w
(6)v=<表达式>=><表达式>+<项>=><项>+<项>=><因子>+<项>=>i+<项>
解:可为E+T*F构造一棵语法树(见下图),所以它是句型。
从语法树中容易看出,E+T*F的短语有:
T*F是句型E+T*F的相对于T的短语,也是相对于规则TT*F的直接短语。
E+T*F是句型E+T*F的相对于E的短语。
句型E+T*F的句柄(最左直接短语)是T*F。
12. 下述文法G[E]生成的语言是什么?给出该文法的一个句子,该句子至少含五个终结符,构造该句子的语法树。证明:<E><T><F><MOP><POP>是G[<E>]的句型,并指出该句型的所有短语、直接短语和句柄。
S1S0|A
A0A1|ε
(3)W属于{0|a}*是指W可以的取值为{ε,0,a,00,a0,aa0,00aa,a0a0,…}
如果W=aa0a00,则Wt=00a0aa。
所求文法为G[S]=({S,P,Q},{0,a},P,S),其中P为:
S0S0|aSa|a
(1){anbnambm|n,m>=0}
(2){1n0m1m0n|n,m>=0}
(3){WaWt|W属于{0|a}*,W表示Wt的逆}
解:
(1)所求文法为G[S]=({S,A},{a,b},P,S),其中P为:
SAA
AaAb|ε
(2)所求文法为G[S]=({S,A},{0,1},P,S),其中P为:
(1)v=<表达式>=><项>=><因子>=>i=w
(2)v=<表达式>=><项>=><因子>=>(<表达式>)=>(<项>)=>(<因子>)=>(i)=w
(3)v=<表达式>=><项>=><项>*<因子>=><因子>*<因子>=>i*i=w
(4)v=<表达式>=><表达式>+<项>=><项>+<项>=><项>*<因子>+<项>
显然,句型<E><T><F><MOP><POP>的句柄是<T><F><MOP>。
14. 给出生成下述语言的上下文无关文法:
P:
SPD|D
P->NP|N
D0|2|4|6|8
N->0|1|2|3|4|5|6|7|8|9
(2)G[S]=({S,P,R,D,N,Q },{0,1,2,…,9},P,S)
P:
SPD|P0|D
P->NR|N
R->QR|Q
D2|4|6|8
N->1|2|3|4|5|6|7|8|9
Q->0|1|2|3|4|5|6|7|8|9
=>i+<项>*<因子>=> i+<因子>*<因子>=> i+i*i=w
语法树见下图:
7. 为句子i+i*i构造两棵语法树,从而证明下述文法G[<表达式>]是二义的。
<表达式>::=i|(<表达式>)|<表达式><运算符><表达式>
<运算符>::=+|-|*|/
解:为句子i+i*i构造的两棵语法树如下:
6. 已知文法G:
<表达式>::=<项>|<表达式>+<项>|<表达式>-<项>
<项>::=<因子>|<项>*<因子>|<项>/<因子>
<因子>::=(<表达式>)|i。
试给出下述表达式的推导及语法树。
(1)i;(2)(i)(3)i*i;
(4)i*i+i;(5)i+(i+i);(6)i+i*i。
解:
第二章:习题2-4 Table表
var x,y;
procedure p;
var a;
procedure q;
var b;
begin
b:=10;
end;
procedure s;
var c,d;
procedure r;
var e,f;
begin
call q;
end;
begin
call r;
end;
begin
<E><E><T><POP>|<T>
<T><T><F><MOP>|<F>
<F>a|b|c
<POP>+|-
<MOP>*|/
解:
(1)计算文法G[E]的语言:
由于L(T)={(a|b|c)((a|b|c)(*|/))n|n>=0}
所以L(E)={L(T)(L(T)(+|-))n|n>=0}
(2)该文法的一个句子是aab*+,它的语法树是:
所以,该文法是二义的。
8. 习题1中的文法G[S]是二义的吗?为什么?
答:是二义的。因为对于句子abc可以有两种不同的生成树,即:S=>Ac=>abc和S=>aB=>abc
11. 令文法G[E]为:
ET|E+T|E-T
TF|T*F|T/F
F(E)|i
证明E+T*F是它的一个句型,指出这个句型的所有短语、直接短语和句柄。
call s;
end;
begin
call p;
end
根据:Page289,变量table:array[0..txmax] of record结构体以及block函数得到下表,而表中各部分的含义,见教材Page18,Page19
Name
Kink
Val /Level
Adr
Size
x
variable
0
3
0
(3)证明:<E><T><F><MOP><POP>是G[<E>]的句型,并指出该句型的所有短语、直接短语和句柄。
由于下面的语法树可以生成<E><T><F><MOP><POP>,所以它是G[<E>]的句型。
由于<E>=> <E><T><POP>,且<T> => <T><F><MOP>,所以<T><F><MOP>是句型<E><T><F><MOP><POP>相对于<T>的短语,也是相对于规则<T><T><F><MOP>的直接短语。
y
variable
0
4
0
p
procedur
0
1
0
a
variable
1
3
0
q
procedur
1
3
4
s
procedur
1
7
0
c
variable
2
3
0wenku.baidu.com
d
variable
2
4
0
r
procedur
2
0
0
第三章文法和语言
5. 写一文法,使其语言是偶正整数的集合
要求:
(1)允许0打头
(2)不允许0打头
解:
(1)G[S]=({S,P,D,N},{0,1,2,…,9},P,S)
=><因子>*<因子>+<因子>=>i*i+i=w
(5)v=<表达式>=><表达式>+<项>=><项>+<项>=><因子>+<因子>=>i+(<表达式>)
=> i+(<表达式>+<项>)=>i+(<项>+<项>)=> i+(<因子>+<因子>)=>i+(i+i)=w
(6)v=<表达式>=><表达式>+<项>=><项>+<项>=><因子>+<项>=>i+<项>
解:可为E+T*F构造一棵语法树(见下图),所以它是句型。
从语法树中容易看出,E+T*F的短语有:
T*F是句型E+T*F的相对于T的短语,也是相对于规则TT*F的直接短语。
E+T*F是句型E+T*F的相对于E的短语。
句型E+T*F的句柄(最左直接短语)是T*F。
12. 下述文法G[E]生成的语言是什么?给出该文法的一个句子,该句子至少含五个终结符,构造该句子的语法树。证明:<E><T><F><MOP><POP>是G[<E>]的句型,并指出该句型的所有短语、直接短语和句柄。
S1S0|A
A0A1|ε
(3)W属于{0|a}*是指W可以的取值为{ε,0,a,00,a0,aa0,00aa,a0a0,…}
如果W=aa0a00,则Wt=00a0aa。
所求文法为G[S]=({S,P,Q},{0,a},P,S),其中P为:
S0S0|aSa|a
(1){anbnambm|n,m>=0}
(2){1n0m1m0n|n,m>=0}
(3){WaWt|W属于{0|a}*,W表示Wt的逆}
解:
(1)所求文法为G[S]=({S,A},{a,b},P,S),其中P为:
SAA
AaAb|ε
(2)所求文法为G[S]=({S,A},{0,1},P,S),其中P为:
(1)v=<表达式>=><项>=><因子>=>i=w
(2)v=<表达式>=><项>=><因子>=>(<表达式>)=>(<项>)=>(<因子>)=>(i)=w
(3)v=<表达式>=><项>=><项>*<因子>=><因子>*<因子>=>i*i=w
(4)v=<表达式>=><表达式>+<项>=><项>+<项>=><项>*<因子>+<项>