欢迎来到天天文库
浏览记录
ID:39707070
大小:802.50 KB
页数:81页
时间:2019-07-09
《语法制导翻译和中间代码生成2》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第四、五章语法制导翻译和中间代码生成概述语法分析之后,编译的任务是由已识别为正确的源程序生成一组规格一致,便于计算机加工的指令形式。一、中间代码生成方法语法制导翻译,属性文法制导翻译中间代码:不是机器语言,便于生成机器语言,便于代码优化。中间代码的形式:逆波兰式树形表示法三元式四元式:最常用的形式二、翻译方法1、属性文法制导翻译将文法的终结符、非终结符及动作符号附加以语义参数,这些参数称作为文法符号的属性,从而构成属性文法。注:1)在属性文法中是利用各种属性作为语义动作之间的通信介质2)一个文法符号可以和多个语义参数相关联3)属性可分为两种:继承属性和综合属性。继承属性
2、值的计算规则是自上而下——产生式右部符号的某些值是根据其左部符号的属性和右部其它符号的某些属性计算而得。4)综合属性值的计算规则是自下而上——产生式左部符号的某些属性值是根据其右部符号的属性和左部其它符号的某些属性计算而得。5)属性翻译的依据是属性规则。6)属性规则嵌入在产生式右部适当位置。2、语法制导翻译在语法分析的基础上进行边分析边翻译。注:1)语法制导翻译时会根据文法产生式右部符号串的含义,进行翻译,翻译的结果是生成相应中间代码。2)语法制导翻译的依据是语义子程序。3)具体做法:为每个产生式配置一个语义子程序,当语法分析进行归约或推导时,调用语义子程序,完成一部分翻译
3、任务。4)语法分析完成,翻译工作也告结束。语法制导翻译适用于多种语法分析。语法制导翻译种类1、自上而下语法制导翻译:对每个文法符号配以语义动作。2、自下而上语法制导翻译:我们主要讨论LR语法制导翻译。三、语义子程序1、作用用来描述一个产生式所对应的翻译工作。如:改变某些变量的值;查填各种符号表;发现并报告源程序错误;产生中间代码等。注:这些翻译工作很大程度上决定了要产生什么形式的中间代码。2、写法语义子程序写在该产生式后面的花括号内。Eg:Xα{语义子程序1}注:在一个产生式中同一个文法符号可能出现多次,但他们代表的是不同的语义值,要区分可以加上角标。如:EE(1)+E
4、(2)3、语义值为了描述语义动作,需要为每个文法符号赋予不同的语义值:类型、地址、代码值等。4、语义栈各个符号的语义值放在语义栈中当产生式进行归约时,需对产生式右部符号的语义值进行综合,其结果作为左部符号的语义值保存到语义栈中。下推栈包含3部分:状态栈、符号栈和语义栈注:语义栈与状态栈和符号栈是同步变化的。注:1)若把语义子程序改成产生某种中间代码的动作,就能在语法分析制导下,随着分析的进展逐步生成中间代码。2)若把语义子程序改成产生某种机器的汇编语言指令,就能随着分析的进展逐步生成某机器的汇编语言代码。例如:产生式语义子程序(0)S`E{PRINTE•VAL}(1)E
5、E(1)+E(2){E•VAL=E(1)•VAL+E(2)•VAL}(2)EE(1)*E(2){E•VAL=E(1)•VAL*E(2)•VAL}(3)E(E(1)){E•VAL=E(1)•VAL}(4)Ei{E•VAL=LEXVAL}注:LEXVAL指的是词法分析送来的机内二进制整数四、常见的中间代码形式1、四元式形式:(Operator,Operand1,Operand2,Result)注:1)Operand1,Operand2,Result可能是用户自定义的变量,也可能是编译时引进的变量。这里Operator是双目运算符,若只有一个运算量,则是单目运算符。2)四元
6、式中变量采用符号表入口的地址,而不用变量的地址,因为语义分析不仅需要变量的地址,还需要从符号表查到的变量的属性、类型和地址等。3)四元式的优点是容易转换为目标代码和容易进行优化。2、三元式(Operator,Operand1,Operand2)注:1)这里三元式本身作为存放结果的单元。2)为了在其它三元式中利用当前三元式的结果,需要对三元式进行编号。三元式的编号就作为相应三元式的结果值。3、后缀表示式(逆波兰表达式)Operand1Operand2Operator4、树形表示法注:常用中间代码表示法是四元式。赋值语句的翻译仅含简单变量的表达式的赋值语句的翻译1、赋值语句的文
7、法Ai=EEE+E
8、E*E
9、-E
10、(E)
11、i2、需要的语义过程NEWTEMP函数:每次调用送回一个代表新临时变量的序号,可认为是送回T1、T2这样的一些临时变量ENTRY(i)函数:用于查变量i的符号表入口地址GEN(OP,ARG1,ARG2,RESULT)过程:产生一个四元式,并填入四元式序列表。3、需要的语义变量E•PLACE:与非终结符E相联系的语义变量值为某变量的符号表入口地址或临时变量序号。它与文法的非终结符相联,分析过程需要就建立,不需要就消亡。产生式语义子程序(1)Ai=E{GEN(=,E•PL
此文档下载收益归作者所有