编译原理典型例题.docx
- 文档编号:27959424
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:24
- 大小:161.97KB
编译原理典型例题.docx
《编译原理典型例题.docx》由会员分享,可在线阅读,更多相关《编译原理典型例题.docx(24页珍藏版)》请在冰豆网上搜索。
编译原理典型例题
编译原理典型案例
1.对于文法G[S]
SFL)
StaS
Sta
LtL,S
LtS
(1)画出句型(S,(a))的语法树;
(2)写出上述句型的所有短语、直接短语、句柄和素短语。
解答
这类题目重点考查语法树、推导、短语、直接短语、句柄和素短语等基本概念。
在句型中寻找短语、直接短语、句柄的方法:
(1)画出句型对应的语法树。
句型(S,(a))的语法树如下图所示
a
(2)在该语法树中寻找短语、直接短语、句柄。
首先我们看短语的定义:
令G是一个文
法,S是文法的开始符,假设a,3,3是文法G的句型,如果有
*+
S=aA3且A=3
则称3是句型a33相对于非终结符A的短语。
如果有A=3,则称3是句型a33相对于规则At3的直接短语。
一个句型的最左直接短语称为该句型的句柄。
根据短语的定义可
知,以非终结符A为根的子树的叶结点从左到右排列就是相对于非终结符A的短语;如果
子树只有两代,则短语就是直接短语;最左边的两代子树的所有叶结点从左到右排列,就是
该句型的句柄。
素短语是一个短语,它至少包含一个终结符,且除自身外不再包含其他素短语。
处于句型最左边的素短语为最左素短语。
从语法树中我们可以找到:
短语:
a,S,(a),_S,(a),(S,(a))
直接短语:
a,S
句柄:
S
素短语:
a
2.写一个上下文无关文法,使其语言能被5整除且不以0开头的无符号整数集合(如{5,
10,15})
解答
能被5整除的数从形式上看,是以0,5结尾的数字串。
题目要求不以0开头,注意0
不是该语言的句子。
句子的结构分为三种:
BA两位数
CA多位数
其中,A代表可以出现在个位上的数字,只能是0或5;
C代表可以出现在中间位上的数字。
0-9所有数字都可以。
Bt1|2|3|4|5|6|7|8|9
Ct0|B
写文法时,先描述一位数结构,于是有产生式St5。
对于两位数和多位数,都是以B
开头和以A结尾,于是有产生式StDA。
用非终结符D推导出两位数和多位数中除个位数字以外的数字。
对与多位数,由于中间位可以是许多位,必须使用递归技术来描述其结构。
于是有产生式:
DtDC
DtB
因此,所求文法为G[S]:
St5
StDA
DtDC
Dtb
At0|5
Bt1|2|3|4|5|6|7|8|9
Ct0|B
3.写一个文法G,使其语言为不以0开头的偶数集。
解答
不以0开头的偶数集数字的结构分为三种:
一位数、两位数和多位数。
一位数
两位数
DB多位数
其中,A代表可以出现在个位上的数字,可以是
2,4,6,8,但不能是0;
B代表可以出现在开始位上的数字,除了0以外,其他数字都可以;
C代表可以出现在中间位上的数字。
0-9所有数字都可以。
Bt0|A
Ct1|3|5|7|9|A
Dt0|C
写文法时,先描述一位数结构,于是有产生式StA。
对于两位数和多位数,都是以C
开头和以B结尾,于是有产生式StCE。
用非终结符E推导出两位数和多位数中除个位数字以外的数字。
对与多位数,由于中间位可以是许多位,必须使用递归技术来描述其结构。
于是有产生式:
EtCE
EtB
因此,所求文法为G(S):
StA|CE
EtCE|B
At2|4|6|8
Bt0|A
Ct1|3|5|7|9|A
Dt0|C
4.考虑下面的程序:
procedureP(x,y,z);beginy:
=y+1;z:
=z+xend;begina:
=2;b:
=3;
P(a+b,a,a);
printa
end.
试问,若参数传递的方式分别采用传值、传地址、得结果和传名时,程序执行后输出a
的值是什么?
解答
所谓传值是调用段把实在参数的值计算出来,被调用段把这些值抄进自己的形式参数中,像使用局部名一样使用这些形式单元。
对形式参数的任何运算不影响实参的值。
上面过程P调用的的参数传递过程如下图所示。
过程调用前
但过程P无法改变实参a的值。
因此,程序执行后输出a的值是2。
所谓传地址是把实在参数的地址传递给相应的形式参数。
在过程段中每个形式参数都有
一个相应的单元,称为形式单元。
形式单元将用来存放相应实在参数的地址。
过程体对形式
参数的任何引用或赋值都被处理成对形式单元的间接访问。
过程调用前
过程调用后
过程调用后,形参x的形式单元指向存a+b值的临时变量的地址,形参y的形式单元指向变量a的地址,形参z的形式单元指向变量b的地址。
形参通过指针可以间接访问实参。
执行y:
=y+1;后,实在参数的变化:
执行z:
=z+x;后,实参的变化:
因此,程序执行后输出a的值是8。
所谓得结果是每个形式参数对应两个单元,第一个单元存放实参的地址,第二个单元存
放实参的值。
在过程体中对形参的任何引用或赋值都被处理成对第二个形式单元的直接访问,但在过程工作完成返回之前必须把第二个单元的内容存放到第一个单元所指的那个实参单元之中。
过程调用前
过程调用后
执行y:
=y+1;后,实参和的形参的变化:
执行z:
=z+x;后,实参和的形参的变化:
过程工作完成返回之前必须把第二个单元的内容存放到第一个单元所指的那个实参单元之中。
实参和的形参的变化:
因此,程序执行后输出a的值是7。
(4)所谓传名是在进入调用段之前不对实在参数预先进行计值,而是过程中每当使用到
相应的形参时才对它实行计值。
因此,在实现时通常都把实参处理成型个子程(称为参数子程
序),每当过程体中使用到相应形参时就调用这个子程序。
因此,过程体执行y:
=y+1;语句,实现时处理成为:
a=a+1;
过程体执行z:
=z+x;语句,实现时处理成为:
a=a+(a+b);
执行上述两语句后,a的值是9。
因此,程序执行后输出a的值是9。
综上所述程序执行时a的输出:
(1)传值:
2
(2)传地址:
8
⑶得结果:
7
(4)传名:
9
5.已知文法G[S]
StS*aP|aP|*aP
Pt+aP|+a
(1)将文法G[S]改写为LL
(1)文法G'S];
(2)构造文法G'[S]的预测分析表。
解答
构造文法的预测分析表,通常应当按下列步骤进行:
(1)消除文法的左递归
(2)对消除左递归后的文法,提取左公因子。
(3)对经过上述改造后的文法,计算它的每个非终结符的FIRST和FOLLOW集合。
(4)根据FIRST和FOLLOW集合构造预测分析表。
消除直接左递归方法:
假设关于非终结符P的规则为
PtPa
其中,b不以p打头。
把p的规则改写为如下非直接左递归形式:
Pt3P'
PtaP[;|
文法G[S]消除直接左递归方法后,文法变为G[S]:
STaps'|*as‘
S'tPS'I£
Pt+aP|+a
提公共左因子的方法:
假设关于非终结符A的规则为
At§31|S32|…|S3n|y1|丫2|…|丫m
其中,每个丫不以§开头。
把A的规则改写为如下形式:
AtaA'|y1|Y2|…|ym
A't31|32|…|3n
于是,文法G(S)提公共左因子后,文法变为G'[S]
STaPS'|*as‘
S'TPS'|£
Pt+aP'
P'-P|£
计算每个非终结符的FIRST和FOLLOW集合:
a.计算非终结符X的FIRST方法:
(1)若有产生式X_;a…,则把a加入到FIRST(X)中;
⑵若X_.;.也是一条产生式,则把也加到FIRST(X)中;
⑶若X—;丫…是一个产生式且Y-VN,则把FIRST(Y)中的所有非元素都加到FIRST(X)中;若X>Y1Y2-YK是一个产生式,Y1,Y2,…,Yi-1都是非终结符,而且,对于任何j,Kjwi-1,FIRST(Yj)都含有;,则把FIRST(Yj)中的所有非元素都加到FIRST(X)中;特别是,若所有的FIRST(Yj)(j=1,2,…,K均含有;,则把加到FRIST(X)中。
根据计算非终结符的FIRST方法的第一点,有
FIRST(S)={a;*}
FIRST(S')={*}
FIRST(P)={+}
FIRST(P)={}
根据计算非终结符的FIRST方法的第二点,有
FIRST(S)={a;*}
FIRST(S')={*;£
FIRST(P)={+}
FIRST(P)={£
根据计算非终结符的FIRST方法的第三点,有
FIRST(S)={a;*}
FIRST(S')={*;£
FIRST(P)={+}
FIRST(P)={+;£
b.计算非终结符X的FOLLOW方法:
(1)对于文法的开始符号S,置#于FOLLOW(S)中;
(2).若A-aBB是一个产生式,则把FIRST(3)\{}加至FOLLOW(B)中;
(3)若人-aB是一个产生式,或A-aB3是一个产生式而3(即严FIRST(3)),则把FOLLOW(A),加至FOLLOW(B)中。
根据计算非终结符的FOLLOW方法的第一点,有
FOLLOW(S)={#}
FOLLOW(S')={}
FOLLOW(P)={}
FOLLOW(P')={}
根据计算非终结符的FOLLOW方法的第二点,有
FOLLOW(S)={#}
FOLLOW(S')={#}
FOLLOW(P)={*;#}
FOLLOW(P')={*;#}
根据FIRST和FOLLOW集合构造预测分析表方法:
(1)对文法G的每个产生式At:
•执行第二步和第三步;
⑵对每个终结符aFIRST(:
),把At:
•加至M[A,a]中;
⑶若,三FIRST(:
),则对任何bFOLLOW(A),把At:
.加至\|[A,b]中;
(4)把所有无定义的.JA,a]标上出错标志”。
构造预测分析表方法如下:
*
+
a
#
S
St*aPS'
S-aPS'
S'
S'tps'
S't£
P
Pt+aP'
p.
P'T£
P'-P
P'-£
6.设文法G(S):
St(T)|aS|a
Ttt,S|S
⑴消除左递归和提公共左因子;
⑵构造相应的FIRST和FOLLOW集合;
⑶构造预测分析表。
解答
(1)消除左递归和提公共左因子,文法变为G'S]
St(L)|aS'
S'ts|£
LtSL'
L't,SL'|£
此文法没有公共左因子
(2)构造相应的FIRST和FOLLOW集合
FIRST(S)={a,(}
FIRST(S')={a(,£}
FIRST(L)={a,(}
FIRST(L')={,,£
FOLLOW(S)={,,),#}
FOLLOW(S)={,,),#}
FOLLOW(L)={)}
FOLLOW(L)={)}
(3)构造预测分析表
(
)
a
5
#
S
St(L)
StaS'
S'
S'ts
S'te
S'tS
S'te
S'te
L
LtSL'
LtSL'
LJ,SL'
L'
L't&
7.设文法G[S]
S>(A)
S\a
A>A+S
A'■S
(1)构造每个非终结符的FIRSTVT和LASTVT集合;
(2)构造优先关系表;
解答
对于这类题目,关键是准确掌握FIRSTVT和LASTVT集合的定义和构造方法。
+,+_、
FIRSTVT(P)={a|P=£•••或P=Qa...,aVT而QVN}
即,对于非终结符P,其往下推导所可能出现的首个算符。
LASTVT(P)={a|P+=…a或P+n...aQ,a^VT而Q^VN}
即,对于非终结符P,其往下推导所可能出现的最后一个算符。
构造FIRSTVT和LASTVT集合的方法
(1)构造FIRSTV集合
若有产生式P—;a…或P—;Qa…,贝UaFIRSTVT(P);
若有aFIRSTVT(Q),且有产生式P—;Q…,贝UaFIRSTVT(P)。
(2)构造LASTVT集合
若有产生式P—;…a或P—;…aQ,贝UaLASTVT(P);
若有aLASTVT(Q),且有产生式PQ,贝UaLASTVT(P)。
对于文法G[S],构造它的每个非终结符的FIRSTVT和LASTVT集合:
FIRSTVT(S)={a,(}
FIRSTVT(A)={+,a,(}
LASTVT(S)={a,)}
LASTVT(A)={+,a,)}
构造算符优先关系表方法:
(1)关系’
直接看产生式的右部,若出现了
Pt…ab…或Pt…aQb,贝Va=b
⑵’关系
求出每个非终结符P的FIRSTVT(P)
若Pt…aR…,则-b€FIRSTVT(R),a
求出每个非终结符P的LASTVT(P)
若Pt…Rb…,则—a€LASTVT(B),a>b
对于文法G[S],构造它的算符优先关系表如下:
a
+
(
)
a
>
>
+
<
>
<
>
(
<
<
<
=
)
>
>
8.设文法G(S):
StT|SvT
Ttu|T人U
Uti|-U
(1)计算FIRSTVT和LASTVT;
(2)构造优先关系表。
解答
(1)对于文法G[S],构造它的每个非终结符的FIRSTVT和LASTVT集合。
FIRSTVT(S)={V,A,i,-}
FIRSTVT(T)={A,i,-}
FIRSTVT(U)={i,-}
LASTVT(S)={V,A,i,-}
LASTVT(T)={A,i,-}
LASTVT(U)={i,-}
(2)构造优先关系表。
i
V
A
-
S
.>
.>
V
V.
.>
V.
V.
A
V.
.>
.>
V.
-
V.
.>
.>
V.
9.下面映射if语句的文法G[S]是算符优先文法吗?
如果是,则构造算符优先关系表。
如果不是,则说明理由。
G[S]
S>iBtS
S—;iBtSeS
S>a
B巾
解答
对于文法G[S],它是一个二义性文法。
因为存在句子ibtibtaea有两个不同的最左推导
S:
iBtS二ibtS=ibtiBtSeS二ibtibtSeS:
ibtibtaeS二ibtibtaea
S:
iBtSeS=ibtSeS:
ibtiBtSeS=ibtibtSeS=ibtibtaeS二ibtibtaea
由于算符优先文法一定不是二义性文法,所以文法G[S]不是算符优先文法。
10.设有如下的基本块
T1:
=A+B
T2:
=5
M:
=T2*4
T3:
=C-D
T4:
=M+T3
L:
=T1*T3
T4:
=A+B
N:
=T4
(1)画出该基本块的DAG图;
(2)假设只有
L,M和N在基本块之后还要引用,写出优化后的四元式序列。
解答
在构造基本块的DAG图时,必须注意两个方面:
一是对于已知的常量要进行计算;二是对同一变量进行多次定值时,最后一次定值是基本块中该变量的最终变量。
由于基本块有
语句T2:
=5,可知T2是已知量。
所以,语句M:
=T2*4可计算出M的值来,即,M也转为常量(M=20)。
一方面,变量T4进行了两次操作,基本块执行完时,最后一次给T4
的定才是T4的最终结果。
活跃信息是针对变量而言的。
如果一个变量在基本块之后不再被引用,则称该变量是非活跃的(或称为非活跃变量),反之称之为活跃的(或称为活跃变量)。
变量的活跃信息对代码优化和代码生成都有非常重要的指导意义。
当DAG图构造出来后,根据题目所给的条件从DAG图中计算出活跃变量的结果即可。
本
是中只要计算出变量L、M和N的结果就行了。
基本块对应的DAG图如下:
按照构造其结点的顺序,重新写成四元式序列G'
T仁A+B
T4=T1
N=T4
T2=5
M=20
T3=C-D
L=T1*T3
由于只有L,M和N在基本块之后还要引用,
T1、T2、T3和T4都不会引用,于是重
新写出优化后的四元式序列为:
N:
=A+B
M:
=20
T3:
=C-D
L:
=N*T3
11.把语句
whilea>0Ab>0doifx>ythenb:
=b-1
elsea:
=a-1;
翻译为四元式序列。
解答
对于这类题目,关键是准确掌握语句的语动作。
while-do语句的语义动作
if-then-else语句的语义动作
作为条件控制的布尔式的翻译:
把AorB解释成ifAthentrueelseB
把AandB解释成ifAthenBelsefalse
把notA解释成ifAthenfalseelsetrue
布尔表达式赋予两种出口”:
一是真"出口;一是假"出。
假设四元式序列从100开始编号。
表达式a>0翻译为:
100(j>,a,0,_)
101(j,_,_,」
继续翻译表达式a>0Ab>0,由于是与运算,100号语句应转跳到102号语句,102号语句为“真”出口,101号语句和103号语句为“假”出,四元式序列为:
100(j>,a,0,102)
101(j,_,_,」
102(j>,b,0,」
103(j,_,_,_)
继续翻译语句whilea>0Ab>0do
ifx>y…
while语句中的逻辑表达式的“真”出口应转跳到其循环体的第一个四元式标号,即104号
语句。
100(j>,a,0,102)
101(j,_,_,」
102(j>,b,0,104)
103(j,_,_,_)
104(j>,x,y_)
105(j,_,_,」
if语句中的逻辑表达式的“真”出口为104号语句,应转跳到then中的第一个四元式标号,“假”出口为105号语句,应转跳到else中的第一个四元式标号。
then中语句翻译完,应转跳出去。
100(j>,a,0,102)
101(j,_,_,」
102(j>,b,0,104)
103(j,_,_,_)
104(j>,x,y_)
105(j,_,_,」
106(-,b,1,T1)
107(:
=,T1,_,b)
108(j,_,_,」
109(-,a,1,T2)
110(:
=,T2,_,a)
while语句中循环体翻译完,应转跳到while语句的第一个四元式标号,即100号语句。
while语句中的逻辑表达式的“假”出口应转跳到while语句后的第一个四元式标号。
100(j>,a,0,102)
101(j,_,_,112)
102(j>,b,0,104)
103(j,_,_,112)
104(j>,x,y_)
105(j,_,_,」
106(-,b,1,T1)
107(:
=,T1,_,b)
108(j,_,_,100)
109(-,a,1,T2)
110(:
=,T2,_,a)
111(j,_,_,100)
12.已知文法G[S]及相应翻译方案
StaAb{print“1”}
Sta{print“2”}
AtAS{print“3”}
Atc{print“4”}
输入acab,输出是什么?
解答
对于这类题目,首先画出句子acab对应的语法树。
每当用一个产生式归约时,则执行
相应的语义动作。
句子acab对应的语法树为:
因此,输入acab,输出是4231。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 典型 例题