编译原理(清华) 第八章 语法制导和中间代码生成.ppt
上传人:qw****27 上传时间:2024-09-12 格式:PPT 页数:81 大小:1.3MB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

编译原理(清华) 第八章 语法制导和中间代码生成.ppt

编译原理(清华)第八章语法制导和中间代码生成.ppt

预览

免费试读已结束,剩余 71 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第八章语法制导翻译和中间代码生成目标程序语义分析基础8.1属性文法(AttributeGrammar)属性文法的形式定义一个属性文法是一个三元组,A=(G,V,F)G是一个上下文无关文法;V是属性的有穷集;F是关于属性的断言的有穷集。说明:每个属性与文法符号相联,N.t表示文法符号N的属性t。属性值又称语义值。存储属性值的变量又称语义变量。每个断言与文法的某个产生式相联,写在{}内。属性的断言又称语义规则,它所描述的工作可以包括属性计算、静态语义检查、符号表的操作、代码生成等,有时写成函数或过程段。例简单算术表达式求值的属性文法L→E{Print(E.val)}E→E1+T{E.val:=E1.val+T.val}E→T{E.val:=T.val}T→T1*F{T.val:=T1.val*F.val}T→F{T.val:=F.val}F→(E){F.val:=E.val}F→digit{F.val:=digit.lexval}例描述变量类型说明的属性文法D→TL{L.in:=T.type}T→int{T.type:=int}T→real{T.type:=real}L→L1,id{L1.in:=L.in;addtype(id.entry,L.in)}L→id{addtype(id.entry,L.in)}8.2语法制导翻译概论例简单算术表达式求值的属性文法E→E1+T{E.val:=E1.val+T.val}E→T{E.val:=T.val}T→T1*digit{T.val:=T1.val*digit.lexval}T→digit{T.val:=digit.lexval}语法制导翻译的实现途径以自下而上(LR分析)的语法制导翻译来说明将LR分析器能力扩大,增加在归约后调用语义规则的功能增加语义栈,语义值放到与符号栈同步操作的语义栈中,多项语义值可设多个语义栈,栈结构为:例简单算术表达式求值的属性文法L→E{print(E.val)}E→E1+T{E.val:=E1.val+T.val}E→T{E.val:=T.val}T→T1*digit{T.val:=T1.val*digit.lexval}T→digit{T.val:=digit.lexval}步骤8.3中间代码的形式8.3.1逆波兰记号后缀式的计算机处理后缀式的最大优点是易于计算机处理处理过程:从左到右扫描后缀式,每碰到运算对象就推进栈;碰到运算符就从栈顶弹出相应目数的运算对象施加运算,并把结果推进栈。最后的结果留在栈顶。逆波兰表示法的扩充逆波兰表示法很容易扩充到表达式以外的范围例如:8.3.2三元式和树形表示8.3.3四元式四元式的另一种表示有时为了更直观,把四元式写成简单赋值形式或更易理解的形式8.4基本语言成分的自下而上语法制导翻译8.4.1简单赋值语句的翻译1.属性和语义规则中用到的变量、过程和函数属性:用id.name表示单词id的名字。用E.place表示存放E值的变量名在符号表的入口地址或临时变量编码。变量、函数和过程:用nextstat变量给出在输出序列中下一个四元式的序号用lookup(id.name)函数审查id.name是否出现在符号表中,是则返回id的入口地址,否则返回nil。用emit过程向输出序列输出一个四元式,emit每调用一次,nextstat的值增加1用newtemp函数生成临时变量,每次调用生成一个新的临时变量,如t1,t2,……用error过程进行错误处理。S→id:=E{p:=lookup(id.name);ifp≠nilthenemit(:=,E.place,-,p)elseerror}E→-E1{E.place:=newtemp;emit(@,E1.place,-,E.place)}例翻译赋值语句A:=B+C表达式中可能出现不同类型的变量和常量语义审查包括:每个使用性标识符是否都有声明?运算符的分量类型是否相容?若不接受不同类型的运算对象混合运算,则应指出错误;若接受混合运算则要进行类型转换处理。例:假定表达式可以有混合运算,id可以是整型和实型,且当两个不同类型的id进行运算时先把整型id转换成实型,再进行运算。用E.type表示E的类型信息,其值为int或real。用+i,*i表示整型运算,用+r,*r表示实型运算。用一目算符itr表示将整型量转换成实型量的运算。E.place:=newtemp;ifE1.type=intANDE2.type=intthenbeginemit(+i,E1.pl