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

第八章语法制导和中间代码生成选读.pptx

  1. 1、本文档共97页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章 语法制导翻译和中间代码生成;目标程序;语义分析基础;;;;8.1 属性文法(Attribute Grammar);属性文法的形式定义 一个属性文法是一个三元组,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.type:=T.type } T→int { T.type:=int } T→real { T.type:=real } L→L1,id { L1.type:=L.type; addtype( id.entry,L.type )} L→id { addtype( id.entry,L.type )} ;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 ) ; if p≠nil then emit (:=, E.place , - , p ) else error };E→-E1 { E.place:=newtemp ; emit ( @ , E1.place , - , E.place ) };例 翻译赋值语句A:=B+C (A、B、C为标识符id);表达式中可能出现不同类型的变量和常量 语义审查包括: 每个使用性标识符是否都有声明? 运算符的分量类型是否相容? 若不接受不同类型的运算对象混合运算,则应指出错误; 若接受混合运算则要进行类型转换处理。 例 :假定表达式可

文档评论(0)

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

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

1亿VIP精品文档

相关文档