- 1、本文档共97页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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);表达式中可能出现不同类型的变量和常量
语义审查包括:
每个使用性标识符是否都有声明?
运算符的分量类型是否相容?
若不接受不同类型的运算对象混合运算,则应指出错误;
若接受混合运算则要进行类型转换处理。
例 :假定表达式可
您可能关注的文档
- 纯电动车立体充电车库设计方案介绍选读.pptx
- 词汇学习语选读.pptx
- 磁性材料第一节选读.pptx
- 辞退员工的流程及注意事项选读.pptx
- 磁感应强度_磁通量选读.pptx
- 聪明的阿凡提选读.pptx
- 聪明童话童装供应链管理选读.pptx
- 聪明童话童装月度工作总结模板选读.pptx
- 从学校人到企业人选读.pptx
- 促进社区医生的治疗性医患关系选读.pptx
- 新高考生物二轮复习讲练测第6讲 遗传的分子基础(检测) (原卷版).docx
- 新高考生物二轮复习讲练测第12讲 生物与环境(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第3讲 酶和ATP(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第9讲 神经调节与体液调节(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第11讲 植物生命活动的调节(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第8讲 生物的变异、育种与进化(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第5讲 细胞的分裂、分化、衰老和死亡(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第5讲 细胞的分裂、分化、衰老和死亡(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第12讲 生物与环境(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第11讲 植物生命活动的调节(检测)(原卷版).docx
文档评论(0)