静态语义分析和中间代码生成

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
语义分析 在处理程序的声明部分时构造标识符的符号表 在处理程序的语句部分时完成静态语义检查
静态语义分析和中间代码生成
8.1 符号表 8.2 静态语义分析 8.3 中间代码生成 8.4 多遍的方法
Biblioteka Baidu
符号表
1. 符号表及其作用 符号表(Symbol Table) 符号表是存放标识符信息的一种表,其中的信息 是标识符的属性(语义)。 如:种类,类型,偏移地址,占用空间等
第八章 静态语义分析和中间代码生成
学习目标: ❖ 掌握:
语法制导的语义分析 常见的中间代码形式; 常见语法成分的属性文法或翻译方案 ❖ 理解:
源程序 词法分析
语法分析
表 格
语义分析
出 错



中间代码生成

代码优化 目标代码生成
目标程序
静态语义分析和中间代码生成
语法制导翻译方法 使用属性文法/翻译模式为描述工具定义程序设 计语言的语义及代码生成方法。
1 静态语义分析的主要任务
代码生成前程序合法性检查的最后阶段 •控制流检查
控制流语句必须使控制转移到合法的地方(如 跳转语句 要有合法的跳转目标,break 语句必须有合法的语句包围 它)
•唯一性检查
很多场合要求对 象只能被定义一次(如枚举类型的元素 不能重复出现)
1 静态语义分析的主要任务
代码生成前程序合法性检查的最后阶段 • 名字的上下文相关性检查
符号表的组织方式可以是数组也可以是链表等等
查找算法可以是顺序查表法、平分查表法、散列查
表法等
合理的组织和查找,将使得符号表的操作更高效
过程的说明部分:
CONST A=35,B=49;
VAR C,D,E; PROCEDURE P;
变量相对本过程 基地址的偏移量
VAR G 符号表中的信息
NAME:A Kind :CONSTANT
处理声明的翻译模式
作用:计算变量声明相关语法单位的类型信息,并保存标 识符的类型信息到符号表 V V1 ; T { L.in := T.type } L { V.type := make_product_3 (V1.type, T.type, L.num) }
V
{ V.type := <> }
T integer { T.type := int }
➢ 符号表的信息将在词法分析、语法分析的过程 中陆续填入,将用于语义检查、中间代码生成 以及目标代码生成等不同的阶段。
8.2 静态语义分析
与语义分析相关的工作
静态语义检查
• 编译期间所进行的语义检查
动态语义检查
• 所生成的代码在运行期间进行的语义检查
收集语义信息 • 为语义检查收集程序的语义信息 • 为代码生成等后续阶段收集程序的语义信息
例如:变量在使用前必须声明;在外部不能访问私有变 量;名字的定义和使用之间要满足一定的上下文相关性
• 类型检查
检查每个操作是否遵守语言类型系统的定义
2 类型检查
类型检查程序(type checker)负责类型检查 • 验证程序的结构是否匹配上下文所期望的类 型 • 为代码生成阶段搜集及建立必要的类型信息 • 实现某个类型系统(type system)
T 是上述积类型表达式
专用类型表达式
• type_error 专用于有类型错误的程序单元
• ok
专用于没有类型错误的程序单元
2 类型检查
类型检查程序的设计
语法制导的方法可实现语言的一个类型系统 • 将类型表达式作为属性值赋给程序各个部分 • 设计实现类型检查的属性文法/翻译模式
语法制导的类型检查程序 举例-1
2 类型检查
一个简单语言的上下文无关文法G[P] :
2 类型检查
类型表达式和类型系统
类型表达式(type expressions)
•为程序单元的类型进行解释 •由基本类型,类型名字,类型变量,及类型构造子 (type constructor)通过归纳定义得到的表达式
类型系统(type systems)
T boolean { T.type := bool }
• 指针数据类型表达式:pointer(T)
T { bool, int, real } 指向类型为T的对象的指针类型
类型表达式 举例 (续)
积类型表达式
• <T1, T2, …, Tn>
T1, T2, …, Tn 为上述数据类型表达式;若n=0,则表示为 < >
过程类型表达式
• fun(T)
符号表
符号表的作用 符号表是连接声明与引用的桥梁。一个名字在声 明时,相关信息被填写进符号表,而在引用时, 根据符号表中的信息进行语义检查,进而生成中 间代码。它的作用主要有: ➢ 辅助语义的正确性检查 ➢ 辅助代码生成
2. 符号表的设计 如何有效记录各类符号的属性,以便在编译的各 个阶段对符号表进行快速、有效的查找、插入、 修改、删除等操作,是符号表设计的基本目标。 符号表的组成 表项分两部分,其中前者是标识符的名字,而后 者是属性部分(不同种类的标识符属性不同)。 符号表的组织方式和查找方法
• 将类型表达式赋给程序各个部分的规则集合
类型表达式 举例
类型表达式分四类定义
基本数据类型表达式,积类型表达式,过程类型表 达式, 专用类型表达式
基本数据类型表达式
• 纯量类型表达式:bool, int, real • 有界数组类型表达式:array(I,T)
T { bool, int, real };I 代表一个整数区间,如 1..10
ADR: DX ADR: DX+1 ADR: DX+2 ADR: ADR: DX …
SIZE:4
符号表
符号表的生存期
➢ 在编译过程中,每当遇到标识符时,就要查填 符号表:
➢ 若是新的标识符时,就向符号表中填入一个新的表 项;
➢ 否则,根据情况向符号表中的已有表项增填信息 (如填入存储地址)或者查获信息(如进行语义检 查等)
NAME:B Kind :CONSTANT
NAME:C Kind :VARIBALE
NAME:D Kind :VARIBALE
NAME:E Kind :VARIBALE
NAME:P Kind :PROCEDUR
NAME:G Kind :VARIBALE


VAL:35 VAL:49 LEVEL:LEV LEVEL:LEV LEVEL:LEV LEVEL:LEV LEVEL:LEV+1 …
相关文档
最新文档