- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理第8章语法制导翻译
1 1 综合属性其计算规则按“自下而上”方式进行, 即规则左部符号的某些属性根据其右部符号的属性和(或)自己的其他属性计算而得。 描述方法 利用属性文法描述如何将各种语句和表达式翻译成中间代码 工作方式 分析与综合并行进行 每识别出一个语言结构时, 完成相应的语义检查与中间代码生成 运算合法性检查 利用符号表保存的名字类型 类型自动转换 填加专用指令 临时变量空间的统计 了解需求、及时释放 布尔表达式到四元式的翻译 a:= -c+b*34 其中,di=ui-li+1,i=1,2,…,n。n为维数,a为数组的首地址, type是数组元素的类型,C是CONSPART=a-C中的第2项 一组计算VARPART,并将它放在某个临时单元T中 另一组计算CONSPART,并把它放在另一个临时单元T1 中。同时用T1[T]表示数组元素的地址 对应“数组元素引用”(引用其值)和“对数组元素赋值”有 两个相应的四元式:“变址取数”和“变址存数” “变址取数”的四元式是: (=[],T1[T],-,X) /*相当于X:=T1[T]*/ “变址存数”的四元式是: ([]=,X1,-,T1[T]) /*相当于T1[T]:=X*/ 产生两组计算数组元素地址的四元式: 例如,A是一个10×20的数组,即,d1=10,d2=20,那么, 赋值句 X:=A[I,J]的四元式为: (*,I,20,T1) /*其中20指d2*/ (+,J,T1,T1) /*T1为VARPART*/ (-,A,21,T2) /*相当于T2:=a-C*/ (=[],T2[T1],_,T3) /*T3:=T2[T1]*/ (:=,T3,_,X) 例如,赋值句A[I+2,J+1]:=M+N的四元式序列为: (+,I,2,T1) (+,J,1,T2) (*,T1,20,T3) (+,T2,T3,T3) /*T3=VARPART*/ (-,A,21,T4) /*T4=CONSPART*/ (+,M,N,T5) ([]=,T5,_,T4[T3]) /*T4[T3]:=T5*/ 结构(记录)是由已知类型的数据组合起来的一种数据类型 比如:struct(C)、record(Pascal),如: struct date{ int day; char month-name[4]; int year }; 二.结构(记录)说明和引用的翻译 结构说明的文法如下: type ? struct{f1}; |int |char |pointer f1 ? f1;f | f f ? type i | type i[n] 结构的最简单存储方式是连续存放 编译时,必须记录所有分量的信息,假定带n个分量的 结构按以下形式登录在一张单独的表中: 分量n …… 分量2 分量1 每个分量的前面各分量的长度总和,用offse表示该值, 将offset也记录下来 对于非终结符type、f和f1,分别用不同的语义变量len表 示长度,i.name表示i当前所代表的名字,f.name表示分 量名,n.val表示整数值,语义过程FILN(name,L)和 FILO(name,L)将分别把分量名表中名为name的项的长 度len和offset填为L 下面是处理结构类型说明的基本语义动作: 中间代码是复杂性介于源程序语言和机器语言的一种表式形式。编译程序中所使用的中间代码有多种形式,常见的有逆波兰记号、三元式和四元式等等。 源程序翻译成中间表示,要在保证源语言语句语义的条件下进行源语句到目标语句结构上的变换。学习了本章应能掌握一般语法成分,如条件语句,循环语句和简单说明语句等结构的翻译。 语法制导翻译指的是编译实现的方法,分析过程和分析树用于制导语义分析和源程序的翻译,常用的办法是扩充惯用的文法,加上控制语义分析和翻译的信息,这样的文法称为属性文法。Yacc这类工具接受这种方式提供的语义分析和翻译信息,因而成为编译程序的生成器。 【本章小结】 第8章 作业题 P202: 1.(1)(7) 2. 5. 8hours 下面是这些产生式相应的语义动作: F1 for i:=E1 {emit(entry(i),’:=‘,E1.place); F1.place:=entry(i);/*保存控制变量在符号表中的位置*/ F1.chain:=nextstat; emit(‘goto’-); /*goto OVE
文档评论(0)