第8章语法制导翻译和中间代码生成docWord格式.docx
《第8章语法制导翻译和中间代码生成docWord格式.docx》由会员分享,可在线阅读,更多相关《第8章语法制导翻译和中间代码生成docWord格式.docx(22页珍藏版)》请在冰豆网上搜索。
![第8章语法制导翻译和中间代码生成docWord格式.docx](https://file1.bdocx.com/fileroot1/2022-12/31/b0f121b5-6e3c-4a1a-a092-0da378a97c2d/b0f121b5-6e3c-4a1a-a092-0da378a97c2d1.gif)
103(WM
104(+,a,b,⑸
105(+,t5,c,⑹
106t4,t6,t7)
树形:
++
z\z\
abed
逆波兰:
ab+cd+*-ab+c+-
[典型例题]:
写出ifAandBandC>
DthenifA<
BthenF:
=l
elseF:
=0
elseG:
=G+1;
的四尤式序列,
写出WHILEA<
CANDB<
DDO
IFA=1THENC:
=C+1ELSE
WHILEA<
=DDOA:
=A+2;
的四尤式序歹lj。
(100)(jv,A,C,102)
(101)
(101)(jVBD,104)
(103)
(104)
(j=A,1,106)
(105)
(106)
(+,C,1,T)
(107)
(:
=,T,-,C)
(108)
(Jr,-,100)
(109)
(j<
=AD,lll)
(110)
100)
(111)
(+,A,2,T)
(112)
(113)
109)
(114)
)专业的计算机学习网站
采用语法制导翻译思想,表达式E的“值”的描述如下:
产生式
(0)SJE
(1)EtE】+E?
(2)E-^E^E2
(3)E-KE1)
(4)E->
n
语义动作
{printE.VAL}
{EAAL:
=E1AAL+E:
AAL}
{E.VAL:
=E1.VAL*E:
=El.VAL}
=n.LEXVAL}
如采用LR分析方法,给出表达式(5*4+8)*2的语法树并在各结点注明语义值VALo
S{S\t=Eet}
采用语法制导翻译思想.表达式E的“值”的描述如下:
(0)SJE
(1)EtE】+E‘
(2)E->
EUE2
⑶Et(E】)
(4)E->
=E1.VAL+EZ.VAL}
=E1AAL*E:
=E1AAL}
=n.LEXA^JL}
假如终结符n可以是整数或实数,算符+和巒的运算对象类型一致,语义处理增加“类型匹配检査3请给出相应的语义描述。
(0)S'
—>
E{iferrors1thenprintEVAL}
(1)EtE】+e2{ifEl.TYPE=intANDE2.TYPE=intthen
begin
EVAL:
=E】・VAL+E’.VAL;
E.YTPE:
=int;
end
elselfElTYPE^ealANDE2.TYPE=realthenbegm
E.VALuE'
vaL+E\VAL;
E.YTPE:
=ieal;
elseeiTor=l
}
(2)b-^E^E2{ifb1TYPb=intANDE2TYPb=iiitthen
E/VAL:
=e1.VAL*E’.VAL;
;
elseifE〔TYPE=realANDE2.TYPE=realthenbegm
EVAL:
=E〔VAL♦e'
.VAL;
;
EYTPE:
=real;
(3)Et(E){EVAL=E〔VAL;
ETYPE4・TYPE}
(4)E-^n{EVAL—n.LEXVAL;
ETYPE:
=n.LEXTYPE}
令Swl为下面的文法由S生成的二进制数的值(如,对于输入101.101,S.val=5.625);
S9L.L|L
L->
LB|B
B->
0|l
按照语法制导翻译的方法,对每个产生式给出相应的语义规则.(中国科学院计算所
1995年)
答案:
加入新的开始符号S'
和规则STS,得到增广文法。
语法制导泄义如卜•:
语义规则
STS
pnnt(S.val)
S-»
LbL2
S.val:
=Li.val+Li.val/?
12length
S9L
=L.val
LiB
L.val:
=Li.val*2+B.val
Llength:
=L】.length+1
L9B
=B.val
L.length:
B今0
Bval:
1
B.val:
如果题目是S:
:
=L.L|LL:
=LB|BB:
=0|1则写成:
S'
=S{pniit(S.val);
S:
=LbL2{S.val:
=L}val+L2.vaV2L2kngth;
=L{S.val:
=L.val;
}
L:
=LiB{L.val:
=Li.val♦2+B.x*al;
L.length:
=Lilengtli+1;
=B{L.val:
=B.val;
L.lengtli:
=l;
B:
=0{B.val:
=0;
=l{B.val:
下面文法产生的表达式是对整型和实型常数应用算符+形成的。
当两个整数相加时,结果为整数,否则为实数。
E今E+T|T
T->
num.num|num
(1)给出语法制导定义确定每个子表达式的类型。
(2)把表达式翻译成前缀形式,并且决定类型。
试用一元运算符inttoreal把整型值转换为相等的实型值.以使得前缀表达式中两个运算对象是同类型的.
(1)设type是综合属性,代表各非终结符的“类熨"
属性语法制导定义
ETE1+T
IF(E1t}rpe=integer)and(T.type=mteger)THENE.type:
=integer
ELSE
E.type:
=real
E->
T
=Ttype
num.nuni
T.type:
nuin
(2)设code为综合属性,代表各非终结符的代码属性type为综合属性,代表各非终结符的类型属性inttoreal把整型值转换为相等的实型值
vlochar将数值转换为字符串
语法制导定义
StE
printE.code
IF(El.type=integer)aiid(T.type=integer)THENbegin
E.code=屮||Ei.code||T.code;
ELSEbegin
IFE1type=integerTHEN
El.type:
Elval:
=inttoreal(El.val)
E1.code=vtochar(E1.val)end
IFT.type:
=mtegerTHENbegin
Ttype:
T.val:
=mttoreal(T.val)
T.code=xlochai(T.val)
E.code=屮||Eicode||T.code;
End
=T.type
E.val:
=T.val
E.code=xlocliar(b.val)
num.num
Tval:
=iiumnumlexval
T.code=vtochar(Tval)
num
=num.lexva
假设变量的说明是由下列文法生成的:
D9iL
4L|:
integer|real
建立一个语法制导定义,把每一个标志符的类型加在符号表中。
type为综合属性,代表类型厲性,
函数addtype实现向符号表中i对应项填类型信息。
DT1L
DType:
=LTypeaddtype(i.entryDtype)
L"
L1
L.Type:
=Ll.Typeaddtype(i.entry:
L.type)
L9T
L.type:
=T.type
T->
integer
Ttypemteger
real
〉专业的计算机学习网站
附加题
问题1:
请将下列语句
while(A<
Bdoif(C>
D)thenX:
=Y+Z翻译成四元式
假定翻译的四元式序列从(100)开始:
ifA<
Bgoto(102)
goto(107)
(102)
ifC<
Dgot(104)
goto(100)
T:
=Y+Z
X:
=T
问题2:
对于输入的表达式(4*7+1)*2,根据下表的语法制导定义建立一棵带注释的分析树。
V"
:
表示非终结符的整数值,综合属性,lexval是单词digit的属性语法制导定义
LtE
print(E.val)
EtE'
E.val
■Elval+T.val
EtT
E・val
-T.va1
T'
*F
T.val
=T!
.val拿F・val
F
=F.va1
F->
(E)
F.val
=E.va1
FTdigil
■digit.lexval
T.val=58
T.val=29
F.val=2
E.val=29
digit.lexval=2
E.val=28+
T.val=l
T.val=28
F.val=l
T.val=4*
F.val=7
digit.lexval=l
F.val=4
digit.lexval=7
digit.lexval=4
问题3:
请按语法制导的定义.将后缀表达式翻译成中缀表达式。
注意,不允许出现冗余括号,后续表达式的文法如下,
E—EE+
E-*EE*
id
S-*E
EfE1E2+
E.code=Ei.code||M-^Ei-code;
E.op='
+‘
E-EiE2*
IFEiop='
+'
ANDE2.op=,+,THEN
E.code=”(”||Ei.code『y||*『C||E2.code『):
ELSEIFEbop=屮THEN
E.code=VI|EiCode||y||,*,||E2.code;
ELSEIFE2op='
+*THEN
E.code=Ei.code||,*,||'
(*||E2.code||y;
ELSEE.code=Ei.code||'
*'
||E2.code||;
E—>
E.code:
=idlexeme;
问题4:
有文法:
Sf(L)|a
L,S|S
给此文法配上语义动作子程序(或者说为此文法写一个语法制导定义),它输出配对括号的个数。
如对于句子(a,(a,a)),输出是2・(中国科学院计算所1994)
加入新开始符号S和产牛式S—S,设num为综合屈性.代表值属性•则语法制导定义如卜:
s-s
pnnt(S.mun)
S-(L)
Snum:
=Lniun+1
S—a
S.niim:
=O
L-*L1,S
Lnuin:
=L1nuni+S.num
L-S
L.num:
=S.num
问题5:
文法G的产生式如下:
S-*(L)|a
1试写出一个语法制导定义,它输出配对括号个数;
2写一个翻译方案,打印每个a的嵌套深度。
如((a),町,打印2,1。
(中国科学院软件所1999)
①为S,L引入综合属性num,代表配对括号个数;
S—S
piint(S.num)
S~(L)
S.num:
=L.num+l
Snum=0
L-L1,S
L.nxim:
=Llnum+S.nuin
LS
=S.muii
②引入继承属性f,代农腋套深度
-*{S.f:
=O}S
S-*rC{L.f:
=S.fH;
L
7
Sfa{print(S.f);
L-{Ll.f:
=Lf;
LI,{Sf:
=L.f}
S
L-{Sf=L.f;
s
问题6:
对下面的文法,只利用综合属性获得类型信息.
D9L,id|L
L9Tid
int|real
DTL,id
D.type:
=L.typeaddtype(id.entry,L.type)
DTL
D.type【=L.type
LTTid
=T.typeaddtype(id.entry,T.type)
int
问题7:
E-»
TR
R->
+TR|e
町给出语法制导定义确定每个子表达式的类型。
b)把表达式翻译成前缀形式,并且决定类型・试用一元运算符inttoreal把整型值转换为相等的实型值,以使得前缀表达式中两个运算对象是同类型的。
a)设type是综合属性,代表各卄终结符的“类熨”屈性
设m是继承属性,
翻译方案
i吾义规则
ETT
R
{R.i:
=T.type}
{E.Type:
=R.s}
R->
+
R1
{IF(Ri=integer)and(T.type=integer)THEN
Rl.i:
Rl.i:
=ieal}
{Rs:
=Rl.s}
£
{Rs:
=R.i}
b)设屈性s利11用传递屈性type,属性t利Ij用「传递属性vaL,
E讥
{Ri:
=T.type}{R.j:
=T.val}
=Rs}{Eval:
=Rt}
RT+T
{IF(R.i=integer)and(T.type=integer)THENBEGIN
Pnnt(+,R.j,T.val)
Rl.j:
=R.j+T.val
END
ELSEBEGIN
=ieal
IFRi=integerTHEN
BeginR.i:
R.j:
=inttoreal(R.j)
IFTtype=integerTHEN
Begm
T.val=mttoreal(T.val)
Print(+Rj工val)
Rl.j:
END}
{Rs:
=Rl.s}{R上=Rl.t}
RT£
=R1}{Rt:
=Rj}
{Ttype:
=real}
{T.val:
=num.numlexval}
{T.type:
=integer}
=num.lexval}
问题8:
翻译算术表达式a*-(b+c)为
町一棵语法树
b)后缀式
C)三地址代码
a)语法树:
b)后缀式:
abc+imunus*C)三地址代码:
tl:
=b+ct2:
=・tlt3:
=a*t2
问题9:
翻译算术表达式-<
a+b)*(c+d)+(a+b+c)为
a)四元式
b)三元式
c)间接三元式
先写出三地址代码为:
tl:
=a+b
t2tl
t3:
=c+d
t4:
=t2♦t3
t5:
t6:
=t5+c
t7:
=t4+16
a):
对应的四元式为:
°
P
argl
arg2
result
(0)
a
b
tl
(1)
ununus
t2
(2)
c
d
t3
⑶
*
t4
(4)
t5
⑸
t6
(6)
t7
b):
对应的三元式为:
op
Umuius
(3)
(5)
问题10:
将下列赋值语句译成三地址代码.
A[ijl:
=B[i,j]+C[A[k,lJ]+D[i+j]
til:
=i♦20tl2:
=tll+jtl3:
=A-84;
tl4:
=4*tl2tl5:
=tl3[tl4]t21:
=1*20t22:
=t21+jt23:
=B-84;
t24:
=4*t22
t25:
=t23[t24]
t31:
=k*20
t32:
=t31+l
www.17xuexiba・com—起学习II巴t33:
=A・84t34:
=4*t32t35:
=t33[t34]t36:
=4*t35t37:
=C-4
B8:
=t37[t36]t41:
=i+jt42:
=4*t41t43:
=D-4t44:
=t43[t42]tl:
=t25+t38t2:
=tl+t44t23[t24]:
=t2
问题11:
写出•语句的翻译方案
动作
STforEdoSl
S.begin:
=newlabel
S.fiist:
=newlemp
S.last:
=nexxlemp
Scurr:
=newtemp
S.code:
=gen(S.firstcc:
=nEmit)
||gen(S.lastE.final)
||gen(“iFS.fii-stS.last“goto"
S.next)
||gen(S.currS.first)
||gen(S.begin"
”)
||genCcifnS.curr今”S.Last“goto”S.next)
||Sl.code
||gen(S.ciirr:
=succ(Scun))
||gen(“goto”S.begin)
v:
=uutialtofinal
Emit:
=mitial.place
E.filial:
=final.place
问题12:
写出说明语句中的名字和类型及相对地址的翻译模式,以允许在形如D^id:
T的说明中可用一串名字表来代替单个名字•
PT
D
{offset:
=0}
DTDQ
D^idL
{enter(idname,L.type,offset)offset:
=offset+L.width}
L》d,Ll
{L.type:
=Ll.type
L.width:
=Ll.widthentei(idname,Ll.type,offset)ofifcet:
=offset+LI.width}
L》T
=T.type
=T.width}
{Ttype:
=integerT.width:
=4}
{T.type:
=realT.width:
=8}
array[num]ofT1
{Ttype:
=array(numxral,Tl.TypeT.width:
=num.val♦Tl.Widtli)
T-»
AT1
=pointer(Tl