第七章 语法制导翻译与中间代码生成4.0.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章 语法制导翻译与中间代码生成4.0

如果数组元素为A[B,C[D,E[F,G]]],那么,在按上面的文法归约下标表达式串时,无法获得数组的内情向量,对每一维的下标都需要保存下来。在该表达式中,就要保存B,D,F等中间结果,如果规模进一步扩大的话,要保存的中间量就会迅速增加,很是繁琐。所以,要寻求能及时计算下标的方法。 定义要点 1 文法允许数组元素嵌套定义 ,A[B,C[2]+1]。 2 为了在归约时完成VARPART的计算,需要修改V的文法。 这样能够在整个下标串elist的翻译过程中随时知道数组名i的入口,获取登记在符号表中的数组信息。 V ? i[elist]|i V ? elist] | i elist ? elist,E | E elist ? elist,E | i[E 回顾一下VARPART的计算公式,它是一个乘加式。 (…(i1*d2+i2)d3+i3)…+in-1)dn+in elist. PLACE limit( ARRAY,k) 语义变量和过程 Elist.ARRAY 数组名的符号表入口 Elist.DIM 数组维数计数器 Elist.PLACE 记存业已形成的VARPART的中间结果名字在符号表中的位置,或者是一个临时变量的整数码。 Limit(ARRAY,k) 函数过程,数组ARRAY的第k维长度dk 现在要考虑的变量有两类,每个变量V有两项语义值。 V.PLACE 简单变量 变量名的符号表入口 下标变量 保存CONSPART的临时变量的整数码 V.OFFSET 简单变量 NULL(用于区分简单变量和下标变量) 下标变量 保存VARPART的临时变量的整数码 语义动作 1 A?V:=E {IF (V.OFFSET=NULL) THEN GEN(:=,E.PLACE,_,V.PLACE) ELSE GEN([]=,E.PLACE,_,V.PLACE[V.OFFSET])} 2 E?E(1)+E(2) { T:=NEWTEMP; GEN(+,E(1).PLACE,E(2).PLACE,T); E.PLACE := T } 3 E ? (E(1)) { E.PLACE := E(1).PLACE } 4 E?V { IF (V.OFFSET=NULL) THEN E.PLACE := V.PLACE; ELSE BEGIN T:=NEWTEMP; GEN (=[],V.PLACE[OFFSET],_,T); E.PLACE:=T; END } 5 V?elist] { T:=NEWTEMP; GEN(-,elist.ARRAY,C,T); V.PLACE:=T; V.OFFSET := elist.PLACE; } 6 V ? i { V.PLACE:= ENTRY(i); V.OFFSET:= NULL; } 7 elist?elist(1),E { T:=NEWTEMP; k:= elist(1).DIM + 1; dk:=LIMIT(elist(1).ARRAY,k); GEN(*,elist(1).PLACE,dk,T);GEN(+,E.PLACE,T,T); elist.ARRAY := elist(1).ARRAY; elist.PLACE := T; elist.DIM := k; } 8 elist? i[E { elist.PLACE := E.PLACE; elist.DIM := 1; elist.ARRAY := ENTRY(i) } A是一个10*20的数组,A[I+2,J+1]:= M+N的翻译 (+, I, 2, T1) (+, J, 1, T2) (*, T1, 20, T3) (+, T2, T3, T3) (-, A, 21, T4) (+, M, N, T5) ([]=, T5, _,T4[T3]) [ I+2 E A i elist , elist E?I+2 { T1:=TEMP; GEN(+,I,2,T1); E.PLACE:= T1 } elist ? A[E { elist.PLACE:=E.PLACE; elist.DIM :=1; elist.ARRAY:=ENTRY(A) } J+1 E E?J+1 { T2:=TEMP; GEN(+, J, 1, T2); E.PLACE:= T2 } elist?elist(1),E { T3:=NEWTEMP; k:= elist(1).DIM+1; dk:=limit(elist(1).ARRAY,k

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档