语义分析和语法制导翻译
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
语义分析和语法制 导翻译
第六章 语义分析和语法 制导翻译
语义分析的任务:检查语义错误
类型检查:
运算数类型
一致性检查: 名字声明与引用
控制流检查: 转移目标
名字检查:
作用域
翻译的任务:建立等价的目标程序
生成中间语言的指令序列
名字绑定:
变量名、过程名
建立运行环境
6.1 属性文法
语义分析与语法制导翻译的描述方法
属性文法的定义:
A=(G,V,F)
G 是上下文无关文法 V 属性的有穷集 F 关于属性的断言和谓词
用法
针对语义,为文法符号设置属性
终结符使用单词的属性
为每个产生式设置语义规则
通过描述各属性的关系 将语义分析和翻译步骤定义为产生式的 断言和谓词
例6-1: 计算器的算法设计
需求:算术表达式的求值 设计:
属性的计算
构造语法分析树,填加响应的语义规则 综合属性
自底向上按照语义规则来计算各结点的综 合属性值
继承属性
需要探讨计算次序
例6-3:3*5+4 的
语法树与属性计算
L P rin t(1 9 )
E .v a l= 1 9
E .v a l= 1 5
+
T .v a l= 4
T .v a l= 1 5
编制算术表达式的文法 引入属性表示语义信息
将值 val 作为表达式 E、项 T 和因子 F 的属性
用语义规则描述表达式的求值
属性文法(语法制导定义)
产生式 L→E
语义规则 print( E.val )
E → E1 + T E.val := E1.val + T.val
E→T
E.val := T.val
T -> n.n | n
6.2 中间语言
用于编译程序
源程序经过语义分析被译成中间代 码序列 (中间语言的语句)
用中间语言过渡的好处:
便于编译系统的实现、移植、代码 优化
常用的中间语言
三地址代码(四元式) 语法结构树(三元式) 后缀式 特点 形式简单、语义明确、便于翻译 独立于目标语言
语法制导编译
T → real T.type := ‘real’
L → L1,id L1.in := L.in addtype( id.entry, L.in )
L → id
addtype( id.entry, L.in )
entry 单词 id 的属性(符号表入口)
addtype 在符号表中为变量填加类型信息
属性文法的作用
如:说明语句的属性文法
翻译模式 (Translation Schemes)
特征
规定在语法分析中使用语义规则进行计算 的次序 保证当动作使用某属性时,该属性必须是 可用的
实现方法
将语义动作插入到产生式中的某个位置
例6-5:建立说明语句的翻译方案
产生式 D→TL T → int T → real L → L1,id
说明语句的作用
支持语义分析,提供语义检查的依据
设计
编写说明语句的文法 将类型信息作为类型描述 T 的属性 type 和变量表 L 的属性 in。
目的
分析说明语句 D,获取变量的类型信息
描述类型信息提取的属性文法
产生式
语义规则
D → T L L.in := T.type
T → int T.type := ‘integer’
抽象描述语义处理的要求
语义信息及其计算关系 适用于各种语义处理(分析、翻译、计算)
语义处理的步骤
属性求值计算、断言检查
语义处理算法的描述方法
一种通用的语义处理算法设计方法
属性分类:
综合属性
从其子结点的属性值计算出来的; 如:、
继承属性
从其兄弟结点和父结点的属性值计算出来的 如:
固有属性(单词属性)
L → id
语义规则 L.in := T.type T.type := ‘integer’ T.type := ‘real’ L1.in := L.in addtype( id.entry, L.in ) addtype( id.entry, L.in )
将语义动作中的计算向前移,使继承属性的计 算出现在其文法符号之前
,
id2
addtype
id1 例6-4:real id1,id2,id3 的
addtype 分析树和属性计算
S-属性定义:
仅包括综合属性
对于所有A → X1 X2 …Xn, A的属性计算仅用X1…Xn 的属性
如:算术表达式求值的属性文法
L-属性定义:
其属性可用深度优先的顺序从左 至右计算
对于所有 A→X1 X2 … Xn Xi 属性计算仅使用A X1 X2 … Xi-1 的属性
/* ‘c’ => E11.
一致性检查:
名字声明与引用
描述方法 第六章 语义分析和语法制导翻译
/* newtemp => t1 => E. 针对语义,为文法符号设置属性
E → E1 + E2 E.
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.attr
attr 是单词 digit 的属性 print( val ) 是输出函数
例6-2:说明语句的类型信息统计
习题
1. 下列文法是一个二进制数的文法。试根据 该文法,编写一个语法制导定义,描述由 S 生成的二进制数的数值计算。
S -> L . L
L -> L B | B
B -> 0 | 1
2. 参照下列表达式文法编写语法制导定义, 描述表达式的类型计算。要求在不同精度的 数的计算中,结果取精度高的类型。
E -> E + T | T
F .v a l= 4
T .v a l= 3
*
F .v a l= 5
d ig it.a ttr= 4
F .v a l= 3
d ig it.a ttr= 5
d ig it.a ttr= 3
T.type=real
D L .in= r e a l
real L.in=real
,
id3
addtype
L .in= r e a l
翻译模式的ቤተ መጻሕፍቲ ባይዱ计
D → T { L.in := T.type } L T → int { T.type := integer } T → real { T.type := real } L → { L1.in := L.in }
L1 , id { addtype(id.entry, L.in) } L → id { addtype(id.entry, L.in) }
第六章 语义分析和语法 制导翻译
语义分析的任务:检查语义错误
类型检查:
运算数类型
一致性检查: 名字声明与引用
控制流检查: 转移目标
名字检查:
作用域
翻译的任务:建立等价的目标程序
生成中间语言的指令序列
名字绑定:
变量名、过程名
建立运行环境
6.1 属性文法
语义分析与语法制导翻译的描述方法
属性文法的定义:
A=(G,V,F)
G 是上下文无关文法 V 属性的有穷集 F 关于属性的断言和谓词
用法
针对语义,为文法符号设置属性
终结符使用单词的属性
为每个产生式设置语义规则
通过描述各属性的关系 将语义分析和翻译步骤定义为产生式的 断言和谓词
例6-1: 计算器的算法设计
需求:算术表达式的求值 设计:
属性的计算
构造语法分析树,填加响应的语义规则 综合属性
自底向上按照语义规则来计算各结点的综 合属性值
继承属性
需要探讨计算次序
例6-3:3*5+4 的
语法树与属性计算
L P rin t(1 9 )
E .v a l= 1 9
E .v a l= 1 5
+
T .v a l= 4
T .v a l= 1 5
编制算术表达式的文法 引入属性表示语义信息
将值 val 作为表达式 E、项 T 和因子 F 的属性
用语义规则描述表达式的求值
属性文法(语法制导定义)
产生式 L→E
语义规则 print( E.val )
E → E1 + T E.val := E1.val + T.val
E→T
E.val := T.val
T -> n.n | n
6.2 中间语言
用于编译程序
源程序经过语义分析被译成中间代 码序列 (中间语言的语句)
用中间语言过渡的好处:
便于编译系统的实现、移植、代码 优化
常用的中间语言
三地址代码(四元式) 语法结构树(三元式) 后缀式 特点 形式简单、语义明确、便于翻译 独立于目标语言
语法制导编译
T → real T.type := ‘real’
L → L1,id L1.in := L.in addtype( id.entry, L.in )
L → id
addtype( id.entry, L.in )
entry 单词 id 的属性(符号表入口)
addtype 在符号表中为变量填加类型信息
属性文法的作用
如:说明语句的属性文法
翻译模式 (Translation Schemes)
特征
规定在语法分析中使用语义规则进行计算 的次序 保证当动作使用某属性时,该属性必须是 可用的
实现方法
将语义动作插入到产生式中的某个位置
例6-5:建立说明语句的翻译方案
产生式 D→TL T → int T → real L → L1,id
说明语句的作用
支持语义分析,提供语义检查的依据
设计
编写说明语句的文法 将类型信息作为类型描述 T 的属性 type 和变量表 L 的属性 in。
目的
分析说明语句 D,获取变量的类型信息
描述类型信息提取的属性文法
产生式
语义规则
D → T L L.in := T.type
T → int T.type := ‘integer’
抽象描述语义处理的要求
语义信息及其计算关系 适用于各种语义处理(分析、翻译、计算)
语义处理的步骤
属性求值计算、断言检查
语义处理算法的描述方法
一种通用的语义处理算法设计方法
属性分类:
综合属性
从其子结点的属性值计算出来的; 如:、
继承属性
从其兄弟结点和父结点的属性值计算出来的 如:
固有属性(单词属性)
L → id
语义规则 L.in := T.type T.type := ‘integer’ T.type := ‘real’ L1.in := L.in addtype( id.entry, L.in ) addtype( id.entry, L.in )
将语义动作中的计算向前移,使继承属性的计 算出现在其文法符号之前
,
id2
addtype
id1 例6-4:real id1,id2,id3 的
addtype 分析树和属性计算
S-属性定义:
仅包括综合属性
对于所有A → X1 X2 …Xn, A的属性计算仅用X1…Xn 的属性
如:算术表达式求值的属性文法
L-属性定义:
其属性可用深度优先的顺序从左 至右计算
对于所有 A→X1 X2 … Xn Xi 属性计算仅使用A X1 X2 … Xi-1 的属性
/* ‘c’ => E11.
一致性检查:
名字声明与引用
描述方法 第六章 语义分析和语法制导翻译
/* newtemp => t1 => E. 针对语义,为文法符号设置属性
E → E1 + E2 E.
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.attr
attr 是单词 digit 的属性 print( val ) 是输出函数
例6-2:说明语句的类型信息统计
习题
1. 下列文法是一个二进制数的文法。试根据 该文法,编写一个语法制导定义,描述由 S 生成的二进制数的数值计算。
S -> L . L
L -> L B | B
B -> 0 | 1
2. 参照下列表达式文法编写语法制导定义, 描述表达式的类型计算。要求在不同精度的 数的计算中,结果取精度高的类型。
E -> E + T | T
F .v a l= 4
T .v a l= 3
*
F .v a l= 5
d ig it.a ttr= 4
F .v a l= 3
d ig it.a ttr= 5
d ig it.a ttr= 3
T.type=real
D L .in= r e a l
real L.in=real
,
id3
addtype
L .in= r e a l
翻译模式的ቤተ መጻሕፍቲ ባይዱ计
D → T { L.in := T.type } L T → int { T.type := integer } T → real { T.type := real } L → { L1.in := L.in }
L1 , id { addtype(id.entry, L.in) } L → id { addtype(id.entry, L.in) }