编译原理平时作业答案0415160740Word文档格式.docx
《编译原理平时作业答案0415160740Word文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理平时作业答案0415160740Word文档格式.docx(42页珍藏版)》请在冰豆网上搜索。
(1)DFAM=({0,1},
其中3定义如下:
3(qo,0)=q1
3(q1,0)=q2
3(q0,1)=q0
3(q1,1)=q0
3(q2,0)=q2
3(q2,1)=q0
⑵正则表达式:
1*01*01*01
DFAM=({0,1},
{q。
,q1,q2,qs},q0,{q3},
3)
其中3定义如下:
3(q0,0)=q1
3(q2,0)=qs
3(q1,1)=q1
3(q2,1)=q2
3(qs,1)=qs
3下面是用正规式表示的变量声明:
(int|float)id(,id)*;
请改用上下文无关文法表示,也就是写一个上下文无关文法,它和该正规式等价。
DTL;
Tint|float
LL,id|id
4试分析下面给出的if-then-else语句的文法,它的提出原本是为了矫正dangling-else(悬而未
决的-else)文法的二义性:
stmtfifexprthenstmt
|matched-stmt
matched-stmtfifexprthenmatched-stmtelsestmt
|other
试说明此文法仍然是二义性的。
考虑句子ifethenifethenotherelseifethenotherelseother它具有如下所示的
两种分析树stmtexprtheneifstmtifmatched-stmtexprthenmatched-stmteotherifeslestmtmatched-stmtexprthenmatched-stmteothereslestmtmatched-stmtotherstmtmatched-stmtifexprthenmatched-stmteifeslestmteslestmtmatched-stmtexprthenestmtotherexprthenmatched-stmteotherifmatched-stmtother
则上面给出的if-then-else文法仍是二义性的。
5证明下面文法是SLR⑴文法,并构造其SLR分析表
EfE+T|T
TfTF|F
FfF*|a|b
该文法的拓广文法G'
为
(0)
E'
fE
(1)E
f
E+T
⑵E
fT
(3)T
TF
⑷T
fF
(5)F
F*
⑹F
fa
(7)F
b
其LR(0)项目集规范族和goto函数(识别活前缀的DFA)如下:
10={E'
f・E,Ef・E+T,Ef・T,Tf・TF,Tf・F,Ff・F*,Ff・a,Ff・b}
11={E'
fE-,EfE•+T}I2={EfT•,TfT•F,Ff・F*,Ff・a,Ff・b}
13={TfF•,FfF•*}I4={Ffa•}I5={Ffb•}
I6={EfE+•T,Tf・TF,Tf・F,Ff・F*,Ff・a,Ff・b}I7={TfTF•,FfF•*}I8={FfF*•}
求FOLLOW集:
FOLLOW(E)={+,$}
I9={EfE+T-,TfT•F,Ff・F*,Ff・a,Ff・b}
FOLLOW(T)={+,$,a,b}
FOLLOW(F)={+,$,a,b,*}
构造的SLR分析表如下:
狀态
action
aot»
+
•
a
$
E
T
F
34
35
1
2
3
S6
acc
r2
r2
S41
S5
rr2
「7
罔
SB
「4
r4
4
r6
「6
rG
r?
r7
r7n
Pr7
6
S4
9
7
r3
8
r5
Pr5
r1
rl
显然,此分析表无多重定义入口,所以此文法是SLR文法。
6为下面的文法构造LALR⑴分析表
S—E
iE+T|T
T—(E)|a
其拓广文法G'
:
(0)S'
—S
(1)S—E
(2)E—E+T(3)E—T
⑷T—(E)⑸T—a
I0={[S'
—•S,$],[S|1={[S'
—S•,$]}II4={[T—(•E),$/+],[E
I5={[T—a•,$/+]}
|7={[T—(E•),$/+],[EI9={[T—(•E),)/+},[E
110={[T—a•,)/+]}
I13={[E—E+-T,)/+],[T
构造其LR
(1)项目集规范族和goto函数(识别活前缀的DFA)如下:
[T—•(E),$/+],[T—•a,$/+]}
3={[E—T•,$/+]}
(E),)/+],[T—•a,)/+]}
—•a,$/+]}
—•E,$],[E—•E+T,$/+],[E—•T,$/+],
2={[S—E-,$],[E—E-+T,$/+]}I
—•E+T,)/+],[E—•T,)/+],[T—•
I6={[E—E+-T,$/+],[T—•(E),$/+],[T
—E-+T,)/+]}I8={[E—T-,)/+]}
—•E+T,)/+],[E—•T,)/+],[T—•(E),)/+],[T—•a,)/+]}
11={[E—E+T-,$/+]}I12={[T—(E)•,$/+]}
—•(E),)/+],[T—•a,)/+]}I14={[T—(E-),)/+],[E—E-+T,)/+]}
合并同心的LR
(1)项目集,得到LALR的项目集和转移函数如下:
t・S,$],[SfE,$],[EfE+T,$/+],[EfT,$/+],[T宀…(E),$/+],[Ta,$/+]}
1=
{[S'
tS-,$]}I2
={[Ste-,$],[Ete-+T,$/+]}
I3,8={[ETT•,$/+/)]}
4,9
={[Tt(•E),$/+/)],[E
t・E+T,)/+],[Et・t,)/+],
[TT.(E),)/+],[T
T.
a,)/+]}
5,10
={[Tta•,$/+/)]}
I6,13={[EtE+-T,$/+/)],[Tt-
(E),$/+/)],[Tt
•a,$
/+/)]}
7,14
={[Tt(E•),$/+/)],[E
tE-+T,)/+]}I11,15={[EtE+T-,$/+/)]}
12,16
={[Tt(E)•,$/+/)]}
LALR分析表如下:
STATE
goto
A
(
s
55,10
S4.9
acc
S6J3
3,3
43
S5.10
5J0
54,9
1L15
7J4
S6.13
S12.16
11,15
12.16
rd
7
(1)通过构造识别活前缀的DFA和构造分析表,来证明文法EE+id|id是SLR
(1)文法答:
先给出接受该文法活前缀的DFA如下:
再构造SLR分析表如下:
状态
动作
转移
id+$
s2
s3acc
r2r2
s4
r1r1
表中没有多重定义的条目,因此该文法是
SLR
(1)的。
(2)下面左右两个文法都和
(1)
的文法等价
EE+Mid|id
EME+id|id
M
请指出其中有几个文法不是LR
(1)文法,并给出它们不是LR
(1)文法的理由答:
只有文法
不是LR
(1)文法。
因为对于句子id+id+…+id来说,分析器在面临第一个id时需要做的空归约次数和句子中+id的
个数一样多,而此时句子中+id的个数是未知的。
8根据自上而下的语法分析方法,构造下面文法的LL
(1)分析表
DTL
Tint|real
LidR
R,idR|
先计算FIRST和FOLLOW
FIRST(D)=FIRST(T)={int,real}
FIRST(L)={id}
FIRST(R)={,,门
FOLLOW(D)=FOLLOW(L)={$}
FOLLOW(T)={id}
FOLLOW(R)={$}
LL
(1)分析表如下:
int
real
id
J
D
D->
TL
T->
int
real
L
L->
idR
R
R->
idR
£
9下面的文法产生的表达式是对整型和实型常数应用算符+形成的。
当两个整数相加时,结果仍为整数,否则就是实数。
iE+T|TT—numnumnum
(a)给出一个语法制导定义以确定每个子表达式的类型。
(b)扩充(a)中的语法制导定义把表达式翻译成前缀形式,并且决定类型。
使用一元算符
inttoreal把整型值转换成相等的实型值,以使得前缀形式中的+的两个操作对象是同类型的。
(a):
产生式
语义规则
EE1+T
IF(E1.type=integer)and(T.type=integer)THEN
E.type:
=integer
ELSE
=real
ET
=T.type
Tnum.num
T.type:
Tnum
(b):
IF(E1.type=integer)and(T.type=integer)THENBEGIN
Print('
+'
E1.val,T.val)
END
ELSEBEGIN
IFE1.type=integerTHEN
Begin
E1.type:
E1.val:
=inttoreal(E1.val)
End
IFT.type:
=integerTHEN
T.val:
=inttoreal(T.val)
E.val:
=T.val
=num.numlexval
=numlexval
10假设说明是由下列文法产生的:
XidL
L—,idL|:
T—integer|real
(a)建立一个翻译模式,把每一个标识符的类型加入到符号表中
(b)从(a)中的翻译模式构造一个预翻译程序。
⑻:
翻译模式
Did
{D.Type:
=L.Type}
{addtype(id.entry,D.type)}
L,id
L1
{L.Type:
=L1.Type}
{addtype(id.entry,L.type)}
L:
{L.type:
=T.type}
Tinteger
{T.type:
=integer}
Treal
=real}
(b):
ProcedureD;
begin
Iflookahead=idthen
Match(id);
D.type=L;
addtype(id.entry,D.type)end
else
error
end
FunctionL:
DataType;
Begin
Iflookahead='
'
then
Match('
'
);
match(id);
L.Type=L;
addtype(id.entry,L.type);
return(L.type)
Else
Elseiflookahead='
:
'
L.Type=T;
return(L.Type)
FunctionT:
Begin
Iflookahead=integerthenBegin
Match(integer);
return(integer)end
elseIflookahead=realthen
Begin
Match(real);
return(real)end
11为下面的算术表达式文法写一个语法制导的翻译方案,它将每个子表达式E的符号(即值大于零
还是小于零)记录在属性E.sign中(属性值分别用POS或NEG表示)。
你可以假定所有的整数都不为零,这样就不用担心零的符号。
EE*E|+E|E|unsigned_integer
_
EE1*E^ifE1.sign=E2.signthenEsign:
=POSelseE.sign:
=NEG}
E+E{E.sign:
=E1.sign}
EE1{ifE1.sign=POSthenE.sign:
=NEGelseE.sign:
=POS}
Eunsigned_integer{E.sign:
12为下面文法写一个语法制导的定义,用S的综合属性val给出下面文法中S产生的二进制数的值。
例如,输入101.101时,
S.val:
=5.625
(不得修改文法。
SL.R|L
LLB|B
RBR|B
B0|1
S
L.R
S.val
=L.
val+R.
val
L1B
L.
val:
=
=L1.val
2+B.val
B
L.val
=B.
BR1
R.
=(R
1.val+B.val)/2
val/2
B.
=0
=1
13试问下面的程序将有怎样的输出?
分别假定:
(a)传值调用(call-by-value);
(b)弓丨用调用(call-by-referenee);
(c)复制恢复(copy-restore);
(d)传名调用(call-by-name)。
programmain(input,output);
procedurep(x,y,z);
begin
y:
=y+1;
z:
=z+x;
end;
begin
a:
=2;
b:
=3;
p(a+b,a,a);
printa
end.
1).传地址:
所谓传地址是指把实在参数的地址传递给相应的形式参数。
在过程段中每
个形式参数都有一对应的单元,称为形式单元。
形式单元将用来存放相应的实在参数的地址。
当调用一个过程时,调用段必须领先把实在参数的地址传递到一个为被调用段可以拿得到的
地方。
当程序控制转入被调用段之后,被调用段首先把实参地址捎进自己相应的形式单元中,
过程体对形式参数的任何引用1或赋值都被处理成对形式单元的间接访问。
当调用段工作完毕返回时,形式单元(它们都是指示器)所指的实在参数单元就持有所指望的值。
2).传结果:
和“传地址”相似(但不等价)的另一种参数传递力法是所谓“传结果”。
这种方法
的实质是,每个形式参数对应有两个申元,第1个单元存放实参的地址,第2个单元
存放实参的值。
在过程体中对形参的任何引用或赋值都看成是对它的第2个单元的直接访
问。
但在过程工作完毕返回前必须把第2个单元的内容行放到第1个单元所指的那个实参单
元之中。
3).传值:
所谓传值,是一种简单的参数传递方法。
调用段把实在参数的值计算出来并
存放在一个被调用段可以拿得到的地方。
被调用段开始丁作时,首先把这些值抄入形式中元
中,然后就好像使用局部名一样使用这些形式单元。
如果实在参数不为指示器,那末,在被调用段中无法改变实参的值。
4).传名:
所谓传名,是一种特殊的形一一实参数结合方式。
解释“传名”参数的意义:
过程调用的作用相当于把被调用段的过程体抄到调用出现的地方,但把其中任一出现的形式
参数都替换成相应的实在参数(文字替换)。
它与采用“传地址”或“传值”的方式所产生的结果均不相同。
(a)2;
(b)8;
(c)7;
(d)9。
14对以下的Pascal程序画出过程c第二次被激活时的运行栈,控制链和访问链。
说明在c中如何访问变量X。
programenv;
procedurea;
varx:
integer;
procedureb;
procedurec;
beginx:
=2;
bend;
{procedurec}begincend;
{procedureb}beginbend;
{procedurea}
beginaend.{main}
env
I■aaBm'
i■■■■■■■ivm■■■■■■■■«
■BMarnmaai
controllink
accesslink
x
-b
controllinkaccesslink
说明:
c中沿着存取链向前走两步,到过程a的活动记录中就可以访问到变量x。
15下面给出一个C语言程序及其在SPARC/SUNT作站上经某编译器编译后的运行结果。
从运行结果看,函数func中4个局部变量i1,j1,f1,e1的地址间隔和它们类型的大小是一致的,而4
个形式参数i,j,f,e的地址间隔和它们的类型的大小不一致,试分析不