资源描述:
《Micro C 一个C编译器的 设计与实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、MicroC一个C编译器的设计与实现本次演讲以设计、实现C语言的一个子集的编译程序(MICROC)为主题,介绍本编译器的原理,一些具体的数据结构和设计上的独到之处。主要性能整体设计主要性能源语言:C语言子集目标代码:80x86汇编语言1)文法:整数C文法2)支持的数据类型:void,char,int以及数组。忽略unsigned和signed。忽略auto,register,const。能够识别extern,static,long(extern为函数,不支持extern变量。static和long都忽略)。对double
2、和float作int处理。3)支持的运算符:算术运算符:+,-,*,/,%,?:(三目),sizeof。关系运算符:<,>,>=,<=,!=,==逻辑运算符:&&,
3、
4、,!位运算:&,
5、,^,~,<<,>>,赋值运算:=,+=,-=,*=,/=,%=&=,!=,^=,~=,<<=,>>=4)支持typedef5)支持函数,main当作普通函数处理。6)支持预编译#include7)支持的语句:条件语句:if...else循环语句:while{},do...while,for(;;)转移语句:goto,return,cont
6、inue,break分支语句:switch()case8)支持两种类型的注释◆ANSIC风格的注释/*……*/不支持注释的嵌套,位于/*和*/之间的字符串将被忽略。◆C++行注释//……C源程序词法分析语法分析与代码生成汇编源程序符号表管理出错处理MicroC总体设计符号表的设计与实现MicroC的符号表用堆栈和二叉树的形式实现。MicroC的符号是以CompoundStatement为单位进行组织的,把处于同一CompoundStatement中的符号放在一个二叉树上。全局变量的处理方式:在MicroC中,全局变量是作为
7、最外层的CompoundState-ment挂在第一个被压入堆栈的指针上。直到程序结束,此指针才被退栈。这样,全局变量始终是可见的。函数的符号表在MicroC中,函数由于其特殊性,并不与一般的变量作同样的处理,而是放在一个称为sg_function_symtab的全局表中。此sg_function_symtab用二叉树的形式实现,使得查找方式得到统一,并提高查找的效率。Label的符号表在MicroC中,当前函数中出现的label放在头节点为sg_goto_label_symtab的二叉树中。源程序可以使用got
8、olabel语句,但label的范围限定在当前函数中。也就是说,不能通过goto跳到另外一个函数中,每个函数可以看作是一个只有单一入口的基本块,这样有利于程序的结构化。数据结构:Typedefstruct_symbol_{charname[NAME_LEN];charrname[LABEL_LEN];unsignedis_symtab;unsignedis_function;unsignedis_declaration;unsignedis_array;unsignedis_argument;unsi
9、gnedis_assign;unsignedis_cl;unsignedis_rvalue;unsignedis_pushed;intnum_ele;specifierbasetype;intoffset;struct_symbol_*next;struct_symbol_*args;struct_symbol_*lchild,*rchild;}symbol;symbol结构的几个关键域的具体含义解释如下:charname[NAME_LEN]是标识符的名称;charrname[NAME_LEN]是标识符在
10、汇编代码中的名称;unsignedis_symtab==1表示此Symbol是某个二叉树的根;unsignedis_function==1表示此标识符是一个函数;unsignedis_declaration==1若此标识符为一个标号或函数,则此标号或函数为声明,而不是定义;unsignedis_array==1表明此标识符是一个数组;unsignedis_argument==1表明此标识符表示函数的一个参数;ununsignedis_assign==1表示此标识符是一个变量,并且已经被赋予了初值;unsignedis_
11、cl==1表示此symbol是一个常量;unsignedis_rvalue==1表示此标识符是一个右值;unsignedis_pushed==1表示此标识符所代表的expression的值已经压入栈;intnum_ele标识符表示数组时,用来表示数组元素的个数;specifierbasetype用来表