语义分析和中间代码生成2

语义分析和中间代码生成2

ID:46570349

大小:611.00 KB

页数:42页

时间:2019-11-25

语义分析和中间代码生成2_第1页
语义分析和中间代码生成2_第2页
语义分析和中间代码生成2_第3页
语义分析和中间代码生成2_第4页
语义分析和中间代码生成2_第5页
资源描述:

《语义分析和中间代码生成2》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第7章语义分析和 中间代码生成(2)2021/8/131主要内容中间代码赋值语句的翻译控制语句的翻译(if、循环)属性文法的实现说明语句翻译组合数据说明的翻译过程调用翻译2021/8/132重点难点重点:三地址码,各种语句的目标代码结构难点:布尔表达式的翻译,对各种语句的目标代码结构的理解。2021/8/1337.4组合数据说明的翻译分类同结构的组合数据(同质数据结构)数组、集合异结构的组合数据(异质数据结构)记录、结构、联合抽象数据类型类、模块2021/8/134数组的引用与分配策略操作元素的引用、修改:数组:A[i,j,…,k]记录、结构、联合:B.h.j结构的引用、修改:A,B,

2、A.c分配策略静态:直接完成相应的分配工作动态:构造代码,以在运行时调用分配过程2021/8/135数组说明的翻译符号表及有关表格(内情向量)处理维数、下标上界、下标下界空间分配首地址、需用空间计算存放方式按行存放、按列存放——影响具体元素地址的计算low1up1d1low2Up2d2……lownupndncan2021/8/136静态数组分配要完成的工作数组存放在一个连续的存储区中知道起始地址要计算该数组的大小按照与简单变量类似的方式进行分配2021/8/137??哪些要处理的问题准备上下界的计算体积的计算动态分配子程序将计算的结果告诉动态分配子程序进行分配动态数组分配要完成的工作2

3、021/8/138动态分配方案下数组说明的代码结构D→id:array[low1:up1,……,lown:upn]ofTlow1.code送工作单元W1up1.code送工作单元W2……lown.code送工作单元W2n-1upn.code送工作单元W2n其它参数(n,type)转动态分配子程序入口?D→id:array[num]ofT2021/8/139数组元素的引用数组元素的翻译完成上下界检查生成完成相对地址的计算代码目标x:=y[i]和y[i]:=xy为数组地址的固定部分——相当于第1个元素的地址,i是相对地址,不是数组下标2021/8/1310数组元素地址计算-按行存放一维数组

4、A[low1:up1](nk=upk-lowk+1)Addr(A[i])=base+(i-low1)*w=(base-low1*w)+i*w=c+i*w二维数组A[low1:up1,low2:up2]~A[i1,i2]Addr(A[i1,i2])=base+((i1-low1)*n2+(i2-low2))*w=base+(i1-low1)*n2*w+(i2-low2)*w=base-low1*n2*w-low2*w+i1*n2*w+i2*w=base-(low1*n2-low2)*w+(i1*n2+i2)*w=c+(i1*n2+i2)*w2021/8/1311相关属性Elist引进综合

5、属性array:记录指向符号表中相应数组名字表项指针。Elist.ndim:记录Elist的下标表达式的个数,即维数limit(array,j):表示array所指示的数组的第j维长度。Elist.place:表示临时变量,存放由Elist中的下标表达式计算出来的值。2021/8/1312id[E1,E2,…,Ek](P345/181Elist为id[E1,E2,…,Ek)S→L:=E{ifL.offset=nullthengen(L.place’:=’E.place)elsegen(L.place[L.offset]’:=’E.place}E→L{ifL.offset=nullthe

6、nE.place:=L.placeelse{E.place:=newtemp;gen(E.place’:=’L.place[L.offset]}}L→id{L.place:=id.place;L.offset:=null}L→Elist]{L.place:=newtemp;L.offset:=newtemp;gen(L.place’:=’c);gen(L.offset’:=’Elist.place*w)}Elist→id[E{Elist.place:=E.place;Elist.ndim:=1;Elist.array:=id.place}Elist→Elist1,E{t:=newtem

7、p;m:=Elist1.ndim+1;gen(t’:=’Elist1.place’*’limit(Elist.array,m);gen(t’:=’t’+’E.place);Elist.array:=Elist1.array;Elist.place:=t;Elist.ndim:=m}Addr(A[E1,E2,….Ek])=c+(((E1*n2+E2)*n3+…Ek-1)*nk+Ek)*w2021/8/1313记录说明的翻译空间分配设置首地址和各元

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。