第8章语法制导翻译和中间代码生成docWord格式.docx

上传人:b****5 文档编号:18774407 上传时间:2023-01-01 格式:DOCX 页数:22 大小:118.77KB
下载 相关 举报
第8章语法制导翻译和中间代码生成docWord格式.docx_第1页
第1页 / 共22页
第8章语法制导翻译和中间代码生成docWord格式.docx_第2页
第2页 / 共22页
第8章语法制导翻译和中间代码生成docWord格式.docx_第3页
第3页 / 共22页
第8章语法制导翻译和中间代码生成docWord格式.docx_第4页
第4页 / 共22页
第8章语法制导翻译和中间代码生成docWord格式.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

第8章语法制导翻译和中间代码生成docWord格式.docx

《第8章语法制导翻译和中间代码生成docWord格式.docx》由会员分享,可在线阅读,更多相关《第8章语法制导翻译和中间代码生成docWord格式.docx(22页珍藏版)》请在冰豆网上搜索。

第8章语法制导翻译和中间代码生成docWord格式.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1