第5讲语法制导翻译.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第5章 语法制导翻译及中间代码的生成 编译中的语义处理是指两个功能: 教学内容 属性文法与属性翻译文法 语法制导翻译概论 常见中间语言概述 简单算术表达式和赋值语句的翻译 布尔表达式的翻译 程序流程控制语句的翻译 含数组元素及其在赋值语句中的翻译 §5.1 属性文法与属性翻译文法   G:是一个上下文无关文法。   V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连。   F:关于属性的属性断言或谓词集。每个断言与一个产生式相联.而此断言只引用该产生式左端或右端的终结符或非终结符相联的属性。 5.2 语法制导翻译的概述 基本思想: 在语法分析过程中,随着分析的步步进展,每当使用一条产生式进行推导(对于自上而下分析)或归约(对于自下而上分析),就执行该产生式所对应的语义动作,完成相应的翻译工作。语法制导翻译就是把语言的一些属性附加到代表语言结构的文法符号上,这些属性值是由附加到文法产生式的“语义规则”中计算的,也就是为每个产生式配备翻译子程序,即语义子程序。语法制导翻译法不论对自上而下分析或自下而上分析都适用。 属性一般分为两类:综合属性和继承属性。简单的说,综合属性用于“自下而上”传递信息,而继承属性用于“自上而下”传递信息。 属性加工的过程即是语义处理的过程,对于文法的每一个产生式都配备了一组属性的计算规则,则称为语义规则。 分析real i1, i2, i3 语法制导翻译的实现途径 以自下而上( 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 }? 语义子程序 一个语义子程序描述了一个产生式对应的翻译工作。 这些工作有:改变编译程序某些变量的值、查填各种符号表、发现并报告源程序错误、产生中间代码。 在描述语义动作时需要为每个文法符号赋以各种不同的语义值:类型、地址、代码值等。 如果一个产生式中一个符号多次出现,就用上角标来区分,如:E = E(1) + E(2) 语法制导生成后缀式 利用算符优先进行语法分析 设置一个一维数组POST来寄存后缀式,初值为1,然后再为产生式配置语义子程序: (1)E?E(1) OP E(2) { POST[k]:=OP;k:=k+1 } (2)E?(E(1)) { } (3)E?i { POST[k]:=ENTRY(i);k:=k+1 } 假设已经有了算符优先表,则利用算符优先分析法分析,在对素短语进行归约时,执行上述的语义子程序,可得到后缀式。 语法制导生成后缀式 利用优先函数进行语法指导翻译 设置一个一维数组POST存放后缀式,并t初:=1;POST[t] :=0;下推栈初始指针K:=1;S[k]=# 翻译算法如下: (1)从左至右扫描源程序串,每次读一字符给a; (2)若g(a)f(s[k])则k:=k+1,s[k]:=a,转(1); (3)若g(a)f(s[k])则s[k]上弹并送至POST[t],t:=t+1;k:=k-1,转(2); (4)若g(a)=f(s[k])且不等于1,则上弹s[k];k:=k-1,转(1) (5) 若g(a)=f(s[k])=1,结束。 后缀式的计算 后缀式的计算过程: 自左至右扫描后缀式,每碰到运算量就把它推进栈,每碰到k目算符就把它作用于栈顶的k项,并将运算结果来代替这k项。 后缀式产生中间代码: 自左至右扫描后缀式,每碰到运算量就把它推进栈,每碰到k目算符就把它作用于栈顶的k项,并生成相应的中间代码,并以结果的临时变量序号代替该栈顶的k项。 后缀式的推广 (1)赋值语句A:=E,后缀式为:AE:= (2)转向语句GOTO L的后缀式为:L’jmp (3)条件语句if xy then m:=x else m:=y 三元式 表达式以及各种语句都可以表示成三元式序列,由算符OP,第一运算量ARG1,第二运算量ARG2组成,形势如下: (op,ARG1,ARG2) 例:A+B*C可表示成: (1) ( * , B , C ) (2) ( + , A , (1) ) 树 §5.4简单算术表达式和赋值语句的翻译 赋值语句文法: A?i:=E E?E+E | E*E | -E | (E) | i 为了实现翻译,需要一些语义变量和过程: NEWTEMP:函数,返回一

文档评论(0)

0520 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档