资源描述:
《一个c编译器的设计与实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、MicroC:一个编译器的设计与实现MicroC一个C编译器的设计与实现摘要编译程序是把高级语言编写的源程序翻译成机器语言表示的目标程序的转换程序,是程序员接触最多的系统软件之一。C、PASCAL、BASIC等高级语言具有功能强大、结构化好、可移植性好、可读性好等众多优点,基本取代了汇编语言,而更先进的语言,如C++,SmallTalk,Ada,Java等面向对象的语言也是层出不穷。这就对编译器的理论、技术提出了一个挑战。一个好的语言,势必需要一个高效、功能强大的编译器。编译理论,在计算机科学中是比较成熟的学科,它建立在形式语
2、言和自动机理论的基础之上。形式语言是对程序设计语言形式化的描述,它一方面涉及产生形式语言的规则——文法;另一方面涉及识别形式语言的装置——自动机。运用这些理论可以构造词法分析和语法分析的有力工具——有限自动机和下推自动机。编译理论还包括语法制导翻译方法、存储空间组织、错误处理、代码优化等内容。自己动手设计一个编译器是学习编译理论的一个好方法。本文以设计、实现C语言的一个子集的编译程序(MICROC)为主题,介绍本编译器的原理,一些具体的数据结构以及X86汇编语言等内容。本编译器的目标是把C语言的源代码翻译成X86汇编代码,再由
3、MASM或TASM汇编成目标代码,再由连接程序连接成可执行代码。C语言是BELL实验室的DennisRitchie在B语言的基础设计并实现的一种高级语言,它是一种结构化语言,具有语句简洁、紧凑,易于移植等特点,因此选择它作为编译器的源语言。由于目前实验室基于Intel体系的机器较多,因此选择8086汇编语言为目标语言。同时也能在开发中使用现成的汇编器(Assembler)和调试器(Debugger)。MicroC编译器简介1、主要性能源语言:C语言子集目标代码:80x86汇编语言1)文法:整数C文法2)支持的数据类型:void
4、,char,int以及数组。忽略unsigned和signed。能够识别extern,static,long(extern为函数,不支持extern变量。static和long都忽略)。22MicroC:一个编译器的设计与实现对double和float作int处理。忽略auto,register,const。支持函数,main当作普通函数处理。3)支持的运算符:算术运算符:+,-,*,/,%,?:(三目),sizeof。关系运算符:<,>,>=,<=,!=,==逻辑运算符:&&,
5、
6、,!位运算:&,
7、,^,~,<<,>>,赋值
8、运算:=,+=,-=,*=,/=,%=,&=,!=,^=,~=,<<=,>>=4)支持typedef5)支持预编译#include6)支持的语句:条件语句:if...else循环语句:while{},do...while,for(;;)转移语句:goto,return,continue,break分支语句:switch()case7)支持两种类型的注释◆ANSIC风格的注释/*……*/不支持注释的嵌套,位于/*和*/之间的字符串将被忽略。◆C++行注释//……1、基本结构MicroC由词法分析、语法分析、代码生成、符号表管理以
9、及错误处理等部分组成,如图所示。C源程序词法分析出错处理符号表管理语法分析与代码生成C源程序2、运行环境:Intel80x86/1MMS-DOS词法分析22MicroC:一个编译器的设计与实现1、MicroC的词法特点1)保留字:保留字是编译器预定义的且不可重定义的、在程序中承担固定作用的字符序列。MicroC中的保留字有:auto,break,case,char,const,continue,default,do,double,else,extern,float,for,goto,if,int,long,register,r
10、eturn,short,signed,sizeof,static,switch,typedef,unsigned,void,volatile,while,include。2)标识符:在程序中定义的表示常量、变量、过程以及函数名的字符序列。标识符由一个字母后面跟着数字和字母的任意组合,由于作用域规则的存在,标识符可以有条件地重新定义。在MicroC中,标识符中不能有‘_’字符。3)标点符号:在MicroC中,标点符号用于表示数学、逻辑运算的操作;定义数据结构;访问控制和分隔标识符。标点符号有:(){}[]+-*/%=
11、&~^<<
12、>>
13、
14、&&!==!=<><=>=+=-=*=/=%=
15、=&=^=<<=>>=,;:.‘?++--4)数字、字符、字符串常量:整数可以用十进制、八进制、十六进制表示。如12,0x5a,036;实数可以用科学记数法或小数表示。如1.2,3.0e+2;字符是界于两个单引号之间的字