编译器设计及实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2020/12/4
三、代码生成接口
这一章内容定义了与目标机器无关的前端和 与目标机器相关的后端之间的接口。
Lcc接口包括一些共享数据结构、18个函数和 包括36个操作符的语言。该语言用于将可执 行代码从源程序生成dag(有向无环图)。
共享数据结构可供前后端共享,但某些域为 一端私有。symbol就是一个共享数据结构。
2020/12/4
1、类型度量
typedef struct metrics { unsigned char size, align, outofline;
} Metrics; size:类型的大小; align:对齐字节数; outofline:控制相关类型的常量的放置。为1时,不出现在dag中,存于
首字母大写的类型表示全小写类型的指针,如Symbol。
2020/12/4
2、符号表的表示
extern Table extern Table extern Table extern Table extern Table extern Table
constants; externals; globals; identifiers; labels; types;
Symbol
up; //连接符号表中上一个符号
List
uses; //可保存一个Coordinate列表,表示使用情况
int
sclass; //扩展存储类型
<symbol flag>
//符号标记
Type
type; //如变量、函数、常量、结构或联合等信息
float
ref; //被引用的粗略次数
union {
静态变量中。
Metrics charmetric; Metrics shortmetric; Metrics intmetric; Metrics floatmetric; Metrics doublemetric; Metrics structmetric;
2020/12/4
2、接口记录
typedef struct interface { <metrics> <interface flags> <interface functions> Xinterface x;
dag节点
struct node { short op; short count; Symbol syms[3]; Node kids[2]; Node link; Xnode x;
Symbol all;
//指向当前及其外层所有符号列表的表头
};
2020/12/4
2020/12/4
3、符号表举例
int x, y; f(int x, int a){
int b; y = x + a*b; if (y < 5){
int a; y = x + a*b; } }
3 0 4
5
6
2020/12/4
0 0
0
0
abxy
0
4、符号表的相关操作
查找和建立标识符
Symbol install(const char * name, Table * tpp, int level, int arena); Symbol lookup(const char *name, Table tp);
标号:与标识符相似,但不涉及作用域 常量:这些符号保存在constants表中 产生变量:用于产生静态变量保存字符串等
编译器设计与实现
——Lcc原理剖析
2020/12/4
华中科技大学计算机学院 张德
一、概述
1、编译器各阶段 源程序
词法分析器
语法分析器
符号表管理器
语义分析器 中间代码生成器
代码优化器
代码生成器
2020/12/4
目标程序
错误处理器
2、编译器各阶段的分组
前端:依赖于语言并很大程度上独立于目 标机器。一般包括语法分析、词法分析、 符号表的建立、语义分析、中间代码生成 以及相关错误处理。
后端:依赖于目标机器的阶段或某些阶段 的某些部分。一般来说,后端完成的任务 不依赖于源语言而只依赖于中间语言。主 要包括代码优化、代码生成以及相关的错 误处理和符号表操作。
2020/12/4
二、符号表
符号表是编译器保存信息的中心库,编译 器的各部分通过符号表进行交互,并访问 符号表中的数据——符号。
src域: typedef struct coord { char *file; unsigned x, y; } Coordinate; file指名包含该符号定义文件名,y和x表示出现的行号及行中位置。
sclass域:符号扩展类型 可以是AUTO、REGISTER、STATIC或EXTERN等
struct table {
int level;
//同symbol中scope域
Table previous; //符号表链表,指向level-1的表
struct entry {
struct symbol sym;
struct entry *link;
} *buckets[256]; //这是一个哈希链数组,方便插入、查找
//联合u为标号、结构、联合、枚举、常量、全局
<appendent info> //和静态变量提供附加信息
} u;
//
Xsymbol x;
//由后端处理,如为变量分配寄存器
<debugger extension>//
为调Fra Baidu bibliotek器产生数据信息
}
2020/12/4
1、符号的表示
scope域: enum { CONSTANTS=1, LABELS, GLOBAL, PARAM, LOCAL }; 第k层中声明的局部变量其scope域等于LOCAL+k。
符号表把各种名字映射到符号集合。常量 、标识符和标号都是名字,不同名字有不 同的属性。
符号管理不仅要处理符号本身,还管理符 号的作用域。
2020/12/4
1、符号的表示
struct symbol {
char
*name; //名称
int
scope; //作用域
Coordinate src; //在源程序中位置
} Interface;
lcc为每一种目标机器形成一个独有的接口实例。x 域是对interface的扩展,后段使用它存放与目标 及其相关的接口数据和函数,对后端私有。
2020/12/4
3、dag操作
可执行代码用dag来描述。函数体是用dag 组成的序列或森林。每个dag都可以同过 gen函数传给后端。
相关文档
最新文档