欢迎来到天天文库
浏览记录
ID:56527434
大小:424.00 KB
页数:43页
时间:2020-06-27
《com0405-07西安电子科技大学编译原理课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、上次课程内容回顾语法制导翻译生成符号表用栈保留各符号表节点信息,栈顶节点是正处理的过程进入一个过程声明D之前为D构造符号表,分析D时填写符号表,退出D后将此过程名填写进外层过程的符号表中简单算术表达式与赋值句的语法制导翻译简单是指变量是简单变量算术表达式内部类型转换:规定转换规则,按规则转换数组元素的引用多维数组到一维存储空间的转换:以行为主,以列为主数组元素地址的两个要素:首地址和偏移量地址计算公式(三个假设条件下):addr(A[i1,i2,...,in)]=a-c+vv1=i1vj=vj-1*dj+ij(j=2,3,...,n)(4.4)c1=
2、1cj=cj-1*dj+1(j=2,3,...,n)(4.3)v=vn*wc=cn*w14.6.2数组元素引用的语法制导翻译数组元素的寻址:CONSPART[VARPART],或者T1[T]取值的三地址码:X:=T1[T]赋值的三地址码:T1[T]:=X<1>引入数组元素后的赋值句文法A→V:=EV→id
3、id[EL](G4.4)EL→E
4、EL,EE→E+E
5、(E)
6、V修改文法以适应递推公式的同步计算:A→V:=E(1)V→id(2)
7、EL](3)EL→id[E(4)
8、EL,E(5)E→E+E(6)
9、(E)(7)
10、V(8)--得到数组名和第一维下标和
11、v1--递归计算第i维的vi--完成数组元素的分析和对v的计算2<2>属性和函数属性.array:数组名在符号表中的入口和数组首地址a。属性.dim:数组维数计数器,记录当前分析到的维数。属性.place:下标列表EL:存放vj=vj-1*dj+ij(j=2,3,...,n)的临时变量,简单变量id:仍然表示简单变量的地址,数组元素id[EL]:存放不变部分,一般可以是一个临时变量。属性.offset:保存数组元素的可变部分,简单变量的offset为空,可记为null。函数limit(array,k):计算并返回数组array中第k维成员个数dk。3
12、<3>语义规则(4)EL→id[E{EL.place:=E.place;EL.dim:=1;EL.array:=entry(id.name);}(5)EL→EL1,E{T:=newtemp;k:=EL1.dim+1;dk:=limit(EL1.array,k);emit(T':='EL1.place'*'dk);--Vk-1*dkemit(T':='T'+'E.place);--T:=Vk-1*dk+ikEL.array:=EL1.array;EL.place:=T;EL.dim:=k;}(3)V→EL]{V.place:=newtemp;emit(
13、V.place':='EL.array'-'c);V.offset:=newtemp;emit(V.offset':='EL.place'*'w);}(2)V→id{V.place:=entry(id.name);V.offset:=null;}(1)A→V:=E{ifV.offset=nullthenemit(V.place':='E.place);elseemit(V.place'['V.offset']'':='E.place);endif;}4<3>语义规则(续1)(6)E→E1+E2{T:=newtemp;emit(T':='E1.plac
14、e'+'E2.place);E.place:=T;}(7)E→(E1){E.place:=E1.place;}(8)E→V{ifV.offset=null;thenE.place:=V.place;elseT:=newtemp;emit(T':='V.place'['V.offset']');E.place:=T;endif;}5<4>分析举例例4.18:对于数组:arr:array[10,20]ofint赋值句arr[i+x,j+y]:=m+n的语法制导翻译(令w=4)。解:c=(c1*d2+1)*w=(1*20+1)*4=84。分析树:6数组元素
15、引用语法制导翻译的产生式A→V:=E{ifV.offset=nullthenemit(V.place':='E.place);elseemit(V.place'['V.offset']'':='E.place);endif;}(2)V→id{V.place:=entry(id.name);V.offset:=null;}(3)V→EL]{V.place:=newtemp;emit(V.place':='EL.array'-'c);V.offset:=newtemp;emit(V.offset':='EL.place'*'w);}(4)EL→id[E{
16、EL.place:=E.place;EL.dim:=1;EL.array:=entry(id.name);}
此文档下载收益归作者所有