网站大量收购独家精品文档,联系QQ:2885784924

编译原理(第5版)-课件(更新)2025第5章 语法制导翻译技术 中间代码生成 .pptx

编译原理(第5版)-课件(更新)2025第5章 语法制导翻译技术 中间代码生成 .pptx

  1. 1、本文档共119页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

源程序语法树中间代码目标代码

语义分析

;本章主要介绍:

基本思想

几种中间代码的形式

各种语法结构的语法制翻译

;语义分析的任务:

静态语义审查

审查每个语法结构的静态语义,即验证语法结构合法的程序,是否真正有意义。;例如:

表达式A+B*C

对运算对象进行类型检查;对变量进行先定义后使用检查;执行真正的翻译

如果静态语义正确,则要执行真正的翻译:生成程序的中间代码或直接生成目标代码。

;多数编译程序进行语义分析的方法:

语法制导翻译法

语法制导翻译法:使用属性文法为工具来描述程序设计语言的语义。

;1.属性文法

(1)属性

对文法的每一个符号,引进一些属性,这些属性代表与文法符号相关的信息,如类型、值、存储位置等。

与属性相关的信息,即属性值,可以在语法分析过程中计算和传递。;属性加工的过程即是语义的处理过程。

属性分为两类:综合属性和继承属性。

综合属性按“自下而上”方式计算:

即规则左部符号的某些属性根据其右部符号的属性和(或)自己的其他属性计算而得。

继承属性按“自上而下”方式计算:

即规则右部符号的某些属性根据其左部符号的属性和(或)右部其他符号的某些属性计算而得。

;(2)属性文法

属性文法包含一个上下文无关文法和一系列语义规则。

语义规则:为文法的每一个规则配备的计算属性的计算规则,称为语义规则(描述语义处理的加工动作)。

语义规则附在文法的每个产生式上,在语法分析过程中,执行语义规则描述的动作,从而实现语义处理。

;;语法制导翻译法的基本思想:

为文法的每个产生式都配备一个语义动作或语义子程序。

语法分析的过程中,每当使用一条产生式进行推导或归约时,就执行相应产生式的语义动作,从而实现语义处理。;语义动作(语义子程序)

描述了一个产生式所对应的翻译工作。

产生式只能产生符号串,并没有指明所产生符号串的意义,仅仅是一些符号串的集合。;语义动作不仅指明了该产生式所产生符号串的意义,而且还根据这种意义规定了对应的加工动作(如查填各类表格、改变编译程序的某些变量的值、打印各种???误信息及生成中间代码等),从而完成预定的翻译工作。

;语法制导翻译法

在语法分析过程中,依随分析的过程,根据每个产生式所对应的语义子程序(或语义规则描述的语义处理的加工动作)进行翻译的方法。;例如,设有简单算术表达式的文法:

E→E+E|E*E|(E)|digit

为文法每一产生式设计相应的求值的语义描述(语义动作):

;;语法制导翻译技术分为:

;LR分析制导的具体实现方法:

为文法的每一个产生式设计相应的语义动作

为文法构造LR分析表

;扩充LR分析栈,以便存放文法符号对应的语义值

;修改总控程序:

1.查分析表

2.当归约时,调用规则相应的语义程序

;例如,设有简单算术表达式的文法:

E→E+E|E*E|(E)|digit

为文法每一产生式设计相应的语义动作

(求值的语义描述):

;2.为上述文法构造LR分析表如下图:

;根据前表,用LR语法制导翻译法得到表达式7+8*5的计值过程,如下图:;;自下而上语法制导翻译法的特点:

当栈顶形成句柄执行规约时,调用相应的语义动作

语义分析栈与语法分析栈同步操作

如何给出相应的语义描述?

;编译中常见的中间语言:

;逆波兰式

逆波兰式除去了原表达式中的括号,并将运算对象写在前面,运算符写在后面,因而又称为后缀式。

例如:

;逆波兰式表示法同中缀表示法相比优点?;1.不再有括号,且运算符出现的顺序体现了中缀表达式的运算顺序

2.易于计算机处理

;一般表达式计值时,要处理两类符号,一类是运算对象,另一类是运算符,通常用两个工作栈分别处理。

但处理用逆波兰式表示的表达式只用一个工作栈。;计算机自左到右顺序扫描逆兰波式:

a若当前符号是运算对象,则进栈;

b若当前符号是运算符:设为K元运算,则将栈顶的K个元素依次取出,同时进行K元运算,并将运算结果置于栈顶,

c表达式处理完毕时,其计算结果自然呈现在栈顶。

;逆波兰式ab+c*的处理过程如下图:

;逆波兰形式可以推广到其他语法结构:

;LR分析制导生成逆波兰式:

给出算术表达式翻译到逆波兰式的语义描述

首先搞清楚生成什么样的中间代码或计值

根据各种语法成份的语义,搞清楚它们应翻译成什么形式的代码结构

;;例如:

;(3)给出从源结构到目标结构的变换方法

;E→E+E|E*E|(E)|i

;2.为上述文法构造LR分析表如下图:

;3.算术表达式

您可能关注的文档

文档评论(0)

balala11 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档