资源描述:
《计算机编译chapt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第六章代码生成和代码优化第o节符号表在程序中,用户用标识符定义了不少名字来代表不同的数据对象,编译程序将这些名字保存在符号表中。符号表除了记录名字本身而外,还记录了与名字关联的各种属性信息。一.符号表的一般形式每个名字对应一个表项,一个表项包括名字域和信息域。名字信息其中,信息域通常设若干子域及标志位,其内容可以是和名字有关的任何信息:类型,种属,长度,相对地址,数组的内情向量,记录与分量的联系,形参标志,说明标志,赋值标志等。因名字的长度、信息域的组成及长度可能是各不相同的,一般采用间接表技术。二.常用的符号表结构1.线性表:用N个数组A1,A2,…,AN来存放符号表的N个子域2.
2、HASH表第一节语义分析和中间代码生成O.概述1.语义分析的主要工作(1)语义检查:如类型是否一致,数组维数是否正确。(2)语义处理:对说明语句,登记信息;对可执行语句,生成中间代码。2.语法制导翻译为每个产生式配上一个语义子程序,在语法分析过程中,当用一个产生式进行匹配或归约时,就调用相应的语义程序。上述语义子程序既可能包含了语义检查,也可能包含了语义处理,其核心是为了生成相应的中间代码。例:语法分析采用自底向上的LR分析法XABYCDZXY状态栈符号栈语义栈BAB的语义值A的语义值状态栈符号栈语义栈XX的语义值状态栈符号栈语义栈DCXD的语义值
3、C的语义值X的语义值状态栈符号栈语义栈YXY的语义值X的语义值状态栈符号栈语义栈ZZ的语义值语义可以是:“值”、“类型”、“种属”、“地址”等。可见:在分析过程中必须保存语义值。一.四元式形式:(op,ARG1,ARG2,RESULT)op—运算符,ARG1—第一运算量,ARG2—第二运算量,RESULT—结果如:A:=-B*(C+D)翻译成(@,B,_,t1)(+,C,D,t2)(*,t1,t2,t3)(:=,t3,_,A)由此可见:四元式出现顺序和表达式计值顺序一致;四元式之间的联系是通过临时变量实现的。二.简单赋值语句的翻译1.语义变量及过程(1)
4、X.a:文法符X的相应属性a如i.name,E.place(2)lookup(a):语义函数,为名字a查符号表;返回:a在符号表中的位置或nil(3)newtemp:语义函数,每调用一次就返回一个可用的临时变量地址(4)emit:语义过程,产生四元式并送到GAM的代码存储器ip指向位置(5)ip:指令指针,一般设初值为0,也可指定一个初值,每调用一次emit,ip自动加4(6)error:语义过程,错误处理2.翻译方案A→i:=E{p:=lookup(i.name);ifp<>nilthenemit(:=,E.place,_,p)elseerror}E→E1opE2{E.place:
5、=newtemp;emit(op,E1.place,E2.place,E.place)}E→-E1{E.place:=newtemp;emit(@,E1.place,_,E.place)}E→(E1){E.place:=E1.place}E→i{p:=lookup(i.name);ifp<>nilthenE.place:=pelseerror}举例:a:=-b*(c+d)的移进-归约过程a:=-b*(c+d)a:=-E1*(c+d)a:=E2*(c+d)a:=E2*(E3+d)a:=E2*(E3+E4)a:=E2*(E5)a:=E2*E6a:=E7Aii:=i:=-i:=-ii:=-
6、E1i:=E2i:=E2*i:=E2*(i:=E2*(ii:=E2*(E3i:=E2*(E3+i:=E2*(E3+ii:=E2*(E3+E4i:=E2*(E5i:=E2*(E5)i:=E2*E6i:=E7Aaa_a__a___a__ba_t1a_t1_a_t1__a_t1___a_t1__ca_t1__c_a_t1__c__a_t1__c_da_t1__t2a_t1__t2_a_t1_t2a_t3a:=-b*(c+d):=-b*(c+d)-b*(c+d)b*(c+d)*(c+d)*(c+d)*(c+d)(c+d)c+d)+d)+d)d))))(@,b,_,t1)(+,c,d,t2)(
7、*,t1,t2,t3)(:=,t3,_,a)符号栈PLACE输入四元式a:=-b*(c+d)的翻译过程3.类型转换对表达式E增加类型属性E.type;引进类型转换指令(itr,x,_,t)E→E1opE2的语义子程序如后t:=newtemp;ifE1.type=integerandE2.type=integerthenbeginemit(opi,E1.place,E2,place,t);E.type:=integerendelseifE1.type=rea