第8章语法制导翻译
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
语义分析Semantics Analysis
伍春香
武汉大学计算机学院
语法正确并不能保证含义(语义)正确。
程序的含义涉及程序中的两部分内容:•数据结构的含义
——名字的含义(类型正确性检查)•控制结构的含义
——语言自身定义(形式化与非形式化)
依据语言的语义规则对语法分析得到的语法结构进行静态语义检查(static semantic analysis)(确定类型、类型和运算合法性检查、识别含义与相应的语义处理及其它一些静态语义检查),并用另一种内部形式表示出来,或者直接用目标语言表示出来。
语义分析程序:semantic analyzer
一般情况下,语义分析仅产生中间代码。
◆词法分析与语法分析简单、比例小,有利于难点分解;
◆有利于中间代码优化;
◆有利于程序的移植;
◆有利于任务的分解、人员的组织。
语义分析的基本功能:
◆确定类型——确定标识符所关联的数据类型(词法分析)
◆类型检查——运算合法性、运算对象类型一致性或相容性
◆识别含义——语法成分的含义(中间代码、目标代码)
◆控制流检查——控制流语句必须转移到合法的地方
◆其他静态语义检查——一致性检查、相关名字检查、名字作
用域分析
语义是上下文有关的,进行形式化很困难。
尚无公认的、广泛被接受与流传的语义形式化系统用于描述程序设计语言的语义。
尚未形成可用于编译程序构造的、系统的形式化语义算法或典型技术。
语法制导翻译技术有利于语义分析与目标代码生成的形式化走向实用。
语法制导翻译Syntax Directed Semantics
◆属性文法
◆语法制导翻译
◆目标代码结构
◆中间代码
◆控制语句的翻译
语法制导翻译简介
属性文法
语法制导翻译的基本思想
属性的计算
1. 属性文法(Attribute Grammar)
对某个上下文无关文法,为每个文法符号指定一组属性,且为文法中的每个产生式附加一段属性计算方法——语义规则/语义动作/语义子程序,则称该文法为属性文法。原文法称为基础文法。
1. 属性文法(Attribute Grammar)
属性值的计算,由语法分析过程中产生的语法分析树相应结点的环境推导出来。——属性的联编/绑定( binding )
属性可以:
静态( static )属性:在执行之前联编,如数的有效位数;
动态( dynamic )属性:在执行期间联编,如表达式的值,动
态分配的数据结构的位置。
编译程序编写者关注的是那些在翻译时联编的动态属性。
1. 属性文法——举例
G[L]:
L→En E→E1+T
E→T
T→T1*F
T→F
F→(E)
F→digit print(E.val);
E.val:=E1.val+T.val;T.val:=T1.val*
F.val;
E.val:=T.val;
F.val:=E.val;
T.val:=F.val;
F.val:=digit.lexval;
1. 属性文法——举例
G[D]:
D→TL
T→int
T→real
L→L1,id L→id L.in:=T.type;
T.type:=integer;
L1.in:=L.in ;
T.type:=real;
addtype(id.entry,L.in) ;addtype(id.entry,L.in) ;
2. 语法制导翻译的基本思想
在语法分析的过程中,依随分析的过程,根据每个产生式添加的语义动作进行翻译。一旦某个产生式被选用于推导或归约,就执行其后相应的语义动作,完成预定的翻译工作。
语法分析与语义分析穿插进行,语法分析引导语义分析——语法制导。
3. 属性的种类与计算——种类
属性通常分为两类:综合属性(Synthesized Attribute)和继承属性(Inherited Attribute) 。
综合属性:依赖于子结点的属性,用于“自下而上”传递信息。
继承属性:依赖于父结点和兄弟结点的属性,用于“自上而下”传递信息。
3. 属性的种类与计算——计算
⑴每个文法符号的继承属性和综合属性之交集为空。
⑵终结符号只有综合属性,由词法分析器提供。
⑶非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性的计算,其所有继承属性值为属性计算前的初始值。
⑷属性计算规则中只能使用相应产生式中文法符号的属性。
⑸产生式左边的继承属性和产生式右边的综合属性不由所给的产生式的属性计算规则进行计算,而由其它产生式的属性计算规则计算或由属性计算器的参数提供。
3. 属性的种类与计算——计算
从语法树的角度看:
⑴一个结点的综合属性的值由子结点的属性之值来计算。
⑵一个结点的继承属性之值由该结点的兄弟结点和/或父结点
的属性之值来计算。
3. 属性的种类与计算——计算顺序
3. 属性的种类与计算——举例,T entry entry
L 1id .entry G[D]:
D →TL
T →int
T →real
L →L 1, id
L →id L.in:=T.type ;T.type:=integer ;L 1.in:=L.in ;T.type:=real ;addtype(id.entry, L.in) ;addtype(id.entry, L.in) ;integer •••