语义分析与中间代码生成

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

•不同的分析目标也对应不同的语义规则 表操作、代码生成及
打印各种错误信息
编译原理
2020年6月21日
9
例5.1
• 非终结符E、T及F都有一个综合属性val,符号i 有一个综合属性,它的值由词法分析器提供。
• 某些非终结符加下标是为了区分一个产生式中 同一非终结符多次出现
产生式
语义规则
E E1+T ET T T1 * F TF
编译原理
2020年6月21日
8
5.2.1 属性文法
附加了一组语属义性信和息运算(语义)规则的文法
1. 属性的表示
文法符号X的属性t常用X.t来表示
2.语义规则的表示
语义之间的关系
•语义规则是根据产生式所蕴涵的语义操作建立起来的,
并与语义分析的目标有关
•不同的产生式对应不同的语义规则
静态语义检查、符号
在产生式右部的适当位置,插入相应的语义动作,按照分 析的进程,执行遇到的语义动作。这是一种动作与分析交 错的实现方案。
编译原理
2020年6月21日
13
翻译步骤
(1)分析输入符号串,建立分析语法树 (2)从分析树得到描述结点属性间依赖关系的依赖图,由 依赖图得到语义规则的计算次序 (3)进行语义规则的计算,得到翻译结果
本章要介绍的是语义分析和中间代码生成技术。 程序语言 翻译 中间代码 翻译 目标代码
编译原理
2020年6月21日
4
5.1 语义分析的任务
根据语义规则对识别出的各种语法成分析其含义, 进行初步翻译,生成相应的中间代码或直接生成目 标代码。
(1)确定数据类型 (2)语义检查
动态语义检查:在运行时刻进行 静态语义检查:在编译时完成 (3)识别含义,进行真正的翻译
2020年6月21日
12
语法制导翻译分为两种处理方法:
(1)语法制导定义(自底向上):
对每个产生式编制一个语义子程序,在进行语法分析的过 程中,当一个产生式获得匹配时,就调用相应的语义子程 序实现语义检查与翻译。这种实现方案隐藏了其中语义规 则的计算次序等实现细节,不必规定翻译顺序。
(2)翻译方案(自顶向下):
④相关名字检查。有的语言中有时规定,同一名字 必须出现两次或多次。例如,Ada语言中,循环或程 序块可以有一个名字,它出现在这些结构的开头和结 尾,如同语句括号一般,编译程序必须检查它们的配 对情况。
编译原理
2020年6月21日
7
5.2 语法制导翻译
实际应用中比较流行的语义分析方法: 基于属性文法的语法制导翻译方法
S.P 词法分析程序
符 号 表 管 理
语法分析程序
语义分析、生成中间代码
代码优化
错 误 处 理
生成目标程序 O.P
编译原理
2020年6月21日
1
第5章 语义分析与中间代码生成
教学目标
1. 要求明确语义分析的任务 2. 明确属性文法和语法制导翻译的含义 3. 明确自底向上和自顶向下语法制导翻译的
区别和特点 4. 明确生成中间代码的目的,中间代码的几
输入符号串 分析树 执行语义规则
翻译结果
编译原理
2020年6月21日
14
5.2.3 语法制导定义
对每个产生式编制一个语义子程序 在进行语法分析的过程中,当一个产生式获得匹配时,就调 用相应的语义子程序实现语义检查与翻译
综合属性
继承属性
自底向上 传递信息
编译原理
自顶向下(自左 向右)传递信息
2020年6月21日
F (E) Fi
E.val=E1.val+T.val
E.val=T.val
T.val=T1.val F.val T.val=F.val F.val=E.val F.val=i.lexval
编译原理
2020年6月21日
10
5.2.2 语法制导翻译的过程
语法制导翻译:将语义规则与语法规则相结合,在 语法分析的过程中通过执行语义动作,计算语义属 性值,从而完成预定的翻译工作。
编译原理
2020年6月21日
5
静态语义检查
①类型检查。
②控制流检查,确保控制语句有合法的转向点。例 如,C语言中的break语句使控制跳离包括该语句的 最小的switch,while或for语句。如果不存在包括它 的这样的语句,则应报错。
编译原理
2020年Βιβλιοθήκη Baidu月21日
6
静态语义检查
③一致性检查。很多情况下要求对象只能被定义一 次。例如,C语言中规定一个标识符在同一作用域中 只能被说明一次,同一case语句的标号不能相同,枚 举类型的元素不能重复出现等。
只含有综合属性的语法制 导定义称为S属性定义
通常使用自底向上的分析方法 •在每个结点处使用语义规则 来计算综合属性值 •当一个产生式获得匹配时, 就调用相应的语义子程序 •从叶结点到根结点进行计算
种形式 5. 掌握PL/0编译程序的语义分析方法
编译原理
2020年6月21日
2
教学内容
• 5.1 语义分析的任务 • 5.2 语法制导翻译 • 5.3 中间代码 • 5.9 PL/0编译程序的语义分析
编译原理
2020年6月21日
3
词法分析,语法分析:解决单词和语言成分的识别 及词法和语法结构的检查。语法结构可形式化地用 一组产生式来描述。给定一组产生式,我们能够很 容易地将其分析器构造出来。
Yacc利用的就是语法制导翻译方法,它使用符号$$表示 产生式左端的属性,$n表示存取产生式右端第n个文法 符号相联的属性
expr : expr '+' expr
{ $$ = $1 + $3; }
编译原理
2020年6月21日
11
语法制导翻译的实现
自底向上语 法制导翻译
自顶向下语 法制导翻译
编译原理
15
• print(E.val)打印由E产生的算术表达式的值, 可认为这条规则定义了L的一个虚属性。
例5.2 综合属性
产生式
语义规则
LE
print(E.val)
E E1+T ET T T1 * F TF
F (E) Fi
E.val=E1.val+T.val
E.val=T.val
T.val=T1.val F.val T.val=F.val F.val=E.val F.val=i.lexval
编译原理
2020年6月21日
16
L E.val = 14 n
E.val = 2
+ T.val = 12
T.val = 2
T.val = 3 *
F.val = 4
F.val = 2
F.val = 3
i.lexval = 4
i.lexval = 2 i.lexval = 3
2+3*4的注释分析树
• 一个结点的综合属性值 是其子结点的某些属性 来决定的
相关文档
最新文档