第5章语法制导翻译_第1页
第5章语法制导翻译_第2页
第5章语法制导翻译_第3页
第5章语法制导翻译_第4页
第5章语法制导翻译_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章语法引导翻译和中间代码的生成、编译中的语义处理是指审查各语法结构的静态意义,即检验语法结构是否合法的程序是否真的有意义。 二、如果静态意义正确,则语义处理生成真正的翻译,即程序的中间表示(中间代码),或者生成实际的目标代码。 教学内容,属性语法和属性翻译语法诱导翻译概论常见的中间语言概要简单算术表达式和代入句翻译布尔表达式的翻译过程流程控制句的翻译数组要素及其代入句中的翻译,5.1属性语法和属性翻译语法,一个属性语法包括上下文相关语法和一系列语义规则,这些语义规则附加在语法的生成表达式中, 常用于描述属性语法、属性、事物或人的特征、性质、质量等,这些属性语法、属性、属性附属于语法分析过程

2、中使用的生成公式。 例如,可以用“颜色”表示某个物体,用“有幽默感”表示某个人。 编译器使用的语法树的节点可以用“类型”、“值”或“存储位置”来描述。 g :上下文相关语法。 v :有一组连接到语法结束符或非结束符的贫穷属性。 f :属性的属性断言或谓词集。 每个断言都与一个生成表达式相关联。 此断言仅引用与生成表达式左端或右端的终结符或非终结符相关联的属性。 属性语法是三个组,A=(G,v,f ),其中,例如,语法g是ET1 T2|T1orT2 Tnum|true|false。 这是因为t在同一生成式中出现2次。 属性语法符号中多用N.t的形式表示与非终结符号n相关的属性t。 例如,将完成上

3、述式的类型检查的属性语法与非终结符号e的生成式相关联,该非终结符号e的生成式可以写成形式:类型检查的属性语法et1t2t1. t=int andt2. t=inte t1or t2t1. t=bool andt2. t=booltfalset.t 1)EE1 E2E.val:=E1.val E2.val,e的“值”的含义可定义为:2 ) e1e.val:=1,3 )在e0e编译的许多实际应用中,属性和断言以各种形式出现。 即,与每个语法符号相关联的是各种属性、断言、语义规则、某些编程语言的程序段等。 生成式语义规则(0) le print (e.val ) (1) ee1te.val 3360

4、=e1. valt.val (2) ete.val 3360=。 根据ft.val 3360=t1. valf.val (4) tft.val 3360=f.val (5) f (e ) f.val 3360=e .语义规则,对每个生成式,其左部e、t、f的属性值的校正运算是从其右部开始的非终结符号,该属性单词digit仅为综合属性,其值由词法分析程序提供。 与生成表达式LE关联的语义规则是打印由e生成的表达式值的过程。 l的属性可以理解为空或者虚。 5.2语法诱导翻译的概要、基本思想:在语法分析过程中,随着分析的进展,每次使用一个生成式导出(自上而下分析的情况)或归约(自下而上分析的情况),

5、执行与该生成式对应的语义动作,完成相应的翻译工作。语法指南翻译是指,在表示语言结构的语法符号上附加语言的一部分属性,这些属性值从附加在语法生成式上的“语义规则”中进行修正,即针对每个生成式准备翻译子程序、即语义子程序。 语法诱导翻译法既适用于自上而下的分析,也适用于自下而上的分析。 翻译任务:语法结构的静态语义分析和正确性检查,如果正确的话翻译成中间代码或目标代码。 所使用的方法:称为语法导航翻译。 基本思想(更简单地说) :根据翻译的需要设置语法符号的属性(这些属性代表关于语法符号的信息),以描述语法结构的意义。 中的组合图层性质变更选项。 属性分为两类:统一属性和继承属性。 简单地说,统一

6、属性用于自下而上的消息,继承属性用于自上而下的消息。 属性加工的过程是语义处理的过程,为每个语法生成式准备了一系列属性的修正算法规则,称为语义规则。 中的组合图层性质变更选项。 属性语法包括上下文相关语法和一系列语义规则。 这些语法规则附在语法的各个生成式中。 在语法诱导定义中,AP被认为b:=f(c1,c2,ck ),f取决于函数,1b取决于a的集成属性,c1,c2,ck取决于中码元的属性,或者是属性b取决于属性c1,c2,ck还是任何其它情况。 语法诱导定义的形式通常必须同时为出现在生成式右侧的继承属性和出现在生成式左侧的综合属性提供修正规则,只能使用与属性修正规则对应的生成式的语法符号的

7、属性,有利于生成式范围内的“包”属性的依赖性。 然而,出现在生成表达式左侧的继承属性和出现在生成表达式右侧的集成属性不由所给定生成表达式的属性校正计算规则校正,而是由其他生成表达式的属性规则校正,并且由属性校正计算功能的残奥参数提供。 特例:开始符号不继承属性,开始时必须确定的结束符只能有统一属性,不能有继承属性。 非终结符可以同时具有综合属性和继承属性,描述语义规则的作业可以包括属性纠正、静态语义校验、符号表操作、代码生成等。 语义规则可能会产生副作用,如生成代码,或者不是参数的严格函数(例如,规则提供下一个可用数据单元格的地址)。 此类语义规则通常被描述为过程调用或过程段。 统一属性:在语

8、法树中,一个节点的统一属性的值由其子节点的属性值决定。 因此,通常使用由下而上的手法在各节点中使用语义规则来修正综合属性的值。 只使用综合属性的属性语法称为s属性语法。 继承属性:在语法树中,一个节点的继承属性由该节点的父节点和/或同级节点的某些属性决定。 用继承属性表现程序语言结构中的上下文依存关系是很方便的。 例6.1台式计算机程序的语法导航定义(表6.1 )、生成式语义规则、se print (eval ) ee1teval :=e1valtvaleteval :=tval TT1* ftv al :=t1val * fvaltftval 3360=fvalf fval :=evalfd

9、igitfval :=digitlexval,各语法符号和属性值val的关联,属性值的设定和语法结构的意义和翻译程序的必要性。 例如,将左边的示例类型扩展为int和real。 统一属性S-属性定义仅使用统一属性的语法引导定义。 节点属性值的修正运算与由下而上分析进行的分析树节点的制作正好同步进行。例6 .2输入:3*5 4n、数字:=3、Fval:=3、Tval:=3、数字:=5fval 3360=4、Tval:=4、Eval:=19 综合lene属性值,使用语义规则,在哪个生成式归约后,从叶节点到根节点修正执行该生成式的s属性定义修正运算属性的值。 继承属性继承属性值由该节点的父节点和同级节

10、点的部分属性值决定。 示例描述解释语句中各种变量的类型信息的语义规则。 语法定义以关键字int或real开头,后跟每个标识符用逗号分隔的标识符表的说明文。 非终结符号t具有综合属性type,其值由关键字int或real决定。 与生成式D-TL关联的语义学L.in:=T.type将L.in的属性值设定为该说明文所指定的类型。 属性L.in沿着语法树传递给下面的节点使用,在与l生成式相关的规则中使用。 过程addtype的功能是在符号表的相关项中注册每个标识符的类型信息。 具有继承属性L.in的语法引导定义,生成式语义规则DTL Lin :=ttypetinttype :=integertreal

11、ttype :=realll 1,IDL1in 3360 l in ) L in addtype (id入口,l id 分析i3,d,t,l,real,l,i3,的语法诱导翻译的实现途径是通过自下而上(LR分析)的语法诱导翻译扩大LR分析器能力,归约后增加呼出语义规则的功能,增加语义堆栈,将语义值放入与符号堆栈同步操作的语义堆栈中示例简单算术表达式评估的属性语法le print (e.val ) ee1te.val 3360 e1. valt.valete.val 3360 t.valt t1* digit.val : t1digit.lexvaltdigitt.val : d 这些任务可以更

12、改某些编译器变量的值,检查各种符号表,检测并报告源程序错误,以及生成中间代码。 在记述语义动作时,需要对每个语法符号分配各种语义值(类型、地址、代码值等)。 在一个生成式中出现多次一个符号的情况下,用以上的方形标记进行区别。 例如,E=E(1) E(2)假定我们将要分析的语法成分是简单的算术表达式,完成意义的处理不翻译成中间代码或目标代码,而是校正表达式的值。 采用的记述系统是上一节的例1。 如果语法分析方法由下而上。 一边用某个生成式进行归约,一边执行与之相应的语义动作,分析某个句子,同时生成该句子的“值”。 例如,输入列为3*5 4。 法律诱导翻译的具体实现途径不难。 假定存在LR解析器,

13、当前扩展其解析栈,在每个语法符号具有语义值的同时扩展LR解析器的能力,以执行语法解析任务,并且在归约为某个生成公式的同时调用相应的语义子例程,以完成属性语法中所描述的语义操作。 各步骤的作业后的意义值保存在扩展后的分析堆栈的“意义值”栏中。 使用d代替digit的LR分析。 对值2 3*5进行分析和计数的过程。 所谓的“中间代码”是一种结构简单、意义明确的符号系统,该符号系统可以设定修订成多种形式,重要的设定修订原则有两点:一是容易生成,二是容易将其翻译成目标代码。 编译器使用的中间代码有多种形式。 常见的有倒波兰符号、三元式、四元式和树形表示。、中间代码形式、5.3常见中间语言的概述、反波兰

14、符号以最简单的中间代码表示形式,在编译器出现之前就被用于表示算术公式,由波兰的逻辑学家卢卡西维奇发明。 该表达方式是将运算对象记为前面,将运算符号记为后面,例如将a b记为a b,将a*b记为ab*,用该表达方式表示的式子也称为后缀式。 逆波兰符号,编程语言中的逆波兰表示: ababab * cabc * (ab ) * cabc * a :=b * CB * dabc * BD * :=,后缀表示式。 使用一个堆栈从左到右扫描算术表达式(后缀显示)。 每次碰到运算对象时,将其向堆栈前进,碰到运算符,如果该运算符是两个目的,则对堆栈最上面的两个运算对象实施运算,将运算结果代替这两个运算对象放入

15、堆栈。 对于所需的运算符,对堆栈顶部的元素执行运算,并将该元素的堆栈替换为运算结果。 最后的结果会留在堆栈的最上面。BCD* (其中骑马订表示-B C*D,代表预期减法)计数过程将预期减法应用到:1,b栈2 .将预期减法应用到堆栈元素,将结果放置在堆栈上,即-B放置在堆栈上的3,c栈4,d栈,等等将两个要素叠加在堆栈上,将乘法结果放置在堆栈上,从后缀表达式显示上的简洁性和计数值的便利性出发,特别适合解释执行的编程语言的中间表示,对于具有堆栈体系的修正机的目标代码生成也很方便。 6 .将堆栈顶部的两个元素相加,将两个元素放入堆栈,将结果放入堆栈,现在堆栈的顶部存储整个表达式的值。 将表达式和各种语句表达为三元表达式的集合。 各三维形式的三个元素是运算符op、第一运算对象ARG1和第二运算对象ARG2。 三元表达式表示a:=b*c b*d的三元表达式。 (1)(*,b,c) (2)(*,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论