当前位置:首页 > 编译原理课程设C语言子集的定义-Read
编译原理课程设计报告
一.编译系统概述
使用过现代计算机的人都知道,多数用户是应用高级语言来实现他们所需要的计算的。现在计算机系统一般都含有不只一个的高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序,供用户按不同需要进行选择。高级语言编译程序是计算机系统软件最主要的组成部分之一,也是用户最直接关系的工具之一。
计算机上执行一个高级语言程序一般分为两步:第一,用一个编译程序把高级语言翻译成机器语言程序;第二,运行所得的机器语言程序求得计算结果。
通常说的翻译程序是指能够把某一种语言程序转换成另一种语言程序(目标语言程序)。如果源语言诸如Fortran,Pascal,C,Ada或java这样的高级语言,而目标程序是诸如汇编语言或者机器语言这类的低级语言,这样的一个翻译程序就是称为编译程序。
一个编译程序的工作过程一般可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码生成、优化、目标代码生成。每个阶段都是从上一个阶段得到结果,对他进行分析,并且根据一些外部环境(例如符号表等)得到最终的输出结果。要构造一个编译程序,可以按照这样的阶段来分别构造,最后来连调。
现在人们已经建立了多种编制部分编译程序或整个编译程序的有效工具。有些能用于自动生成扫描器(如LEX),有些可以用于自动产生语法分析器(如YACC),有些甚至可以用来自动产生整个的编译程序。这些构造编译程序的工具成为编译程序-编译程序、编译程序产生器或翻译程序书写系统,他们是按照编译程序和目标语言的形式描述而自动产生编译程序的。
编译程序是一极其庞大而又复杂的系统,掌握它比较苦难。但是一旦对其掌握,对以后的程序语言设计,系统软件分析,系统软件设计,形式语言研究等方面都是非常有好处的。
二.编译系统需求分析
给出类C语言(C语言的子集)的词法和语法定义,并根据对应的语法定义写出一些属性文法和语法制导。根据词法和语法的定义,构造一个编译程序,它主要可以完成如下功能:
1、读入某个已经编辑好的类C源程序文件,通过词法分析器,生成二元组,同时检查词法错误;
2、语法分析器将产生的二元组作为输入,进行语法分析,同时检查语法错误;
3、在语法分析同时,利用属性文法和语法制导技术,产生具体的语意动作,并对符号表进行操作;
4、根据语义动作产生整个源程序的四元式序列;
5、将产生的四元式序列连同符号表一起输出,作为编译程序的最终输出结果;
6、对最后的代码优化和目标代码生成要有所考虑,必须留有一定的接口供以后扩展;
7、增大程序的可移植性,努力做到整个系统方便移植。
一些特殊要求
由于做这样一个编译系统机会非常难的,不仅对自己的编译技术有些提高,而且对一些其他课程也是非常有帮助的,因此我想做一个较为标注的软件开发过程,提高自己的程序开发能力和经验。以下自我提出的是一些特殊要求,希望能够在开发过程种完成:
1、整个系统的开发、测试、维护等工作都在Linux下完成。希望借此更加深刻的了解Linux系统的软件开发技术和工具的使用的方法;
2、希望能够按照软件开发的全过程来完成这次的编译系统的开发。做好前期的设计工作和资料查询工作,然后着手开始编制代码。这样做既可以减少开发周期,提高开发效率,又可以了解一些有关的软件工程的知识;
3、尽量采用正规的开发模式和开发方法,使用一些已经非常成熟的编译系统开发工具,例如FLEX和BISON等等,可以减少大量的不必要的人力工作; 4、作好开发中间过程的总结工作,将发现的一些问题和总结出来的新方法及时的提取出来,这对以后的调试维护工作都是非常有好处的。
三.C语言子集规定
3.1 C语言的简介
ALGOL 60是C语言的前身,它是由剑桥大学最先开发出来的一个语言。1967年,剑桥大学的Matin Richards对CPL语言进行的简化,于是产生了BCPL语言。1970年,美国贝尔实验室的Ken Thompson将BCPL进行的修改,并取名为“B语言”,并用它写出了第一个UNIX操作系统。到了1973年,D.M.RITCHIE在B语言的基础上最终设计出了一种新的语言,取名为C语言。1978年,Brian W.Kernighian和Dennis M.Ritchie出版了著名的《The C Programming Language》,从而使C语言成为目前世界上最为流行的高级程序语言。
C语言之所以在目前世界上流行、使用广泛,这是因为它有非常多的优点。首先它简洁紧凑、灵活方便,有着非常丰富的运算符和数据结构。其次他是一个结构化的语言,便于使用、维护及调试。还有就是C语言允许直接对物理地址访问,可以直接对硬件操作。最后C语言生成的代码质量高,程序执行效率高,并且使用范围大,可移植性好,因此在多钟操作系统中均可以使用。
由于C语言的流行,随之而来的是许许多多的编译软件和环境。其中Turbo C、Borland C编译器以及后来的VC++可视化编程环境都是广大编程人员所钟爱的编程工具。
为了对整个C语言的词法,语法,语义,编译等等方面有一个整体且深入的了解,因此这次的课程设计开发的编译器就以C语言为基础,对自己定义的类C的集合进行深入分析定义,设计出一个较为稳定可用的编译器。
3.2 C子集的定义
本次设计的C语言的子集(便于叙述,以后称之为Cxx),是本着简单、易懂、易操作,而且能够完成一定功能的原则,尽量实现最基本的,人们最常用的部分,而抛弃那些不常使用的,或者难以实现的部分。这样考虑的目的是为了能过在短时间做出一个编译程序大的框架,并且开发出一个较为稳定的版本,来为以后的扩充更多的功能提供一定的接口和方便。这种设计是由里到外,逐步求精,也是符合一般设计的规律。
下面就是我定义的Cxx的说明,由于与具体的编码有关,因此不可能使用形式化的语言,而只作简单的说明性的定义。稍后的详细设计报考中将会写出Lex词法定义和Yacc语法定义。
1.Cxx以main函数做为主函数,且是整个语言唯一的函数。main函数是一个无参的,无返回类型的,不需要返回语句retrun的函数。所有的程序必须写在main函数里面;
2.Cxx的程序是以一行或多行表达式和多个程序块构成,每行表达式的结尾以分号“;”做为标志,一个程序块以大括号{}做为区域定义标志;
3.Cxx的表达包括变量定义表达式、赋值表达式、算术运算表达式、逻辑运算表达式; 4.Cxx的程序块包括三大程序结构,即顺序、分支和循环;
5.Cxx的变量定义只允许整型变量定义,并且可以赋初值,即类似int i=5的定义; 6.Cxx的赋值语句只允许使用等号“=”将一个表达式的值付给一个整型变量,例如x=3*y;
7.Cxx的算术表达式的符号包括+,-, * , / , ^ , %。对应的操作为加法,减法,乘法,除法,乘方,求模;
8.Cxx的逻辑表达式的符号包括&&, | | , !,= = , != ,< , > , <= , >=。对应的运算为逻辑与,逻辑或,逻辑非,等于,不等于,小于,大于,小于等于,大于等于;
9.Cxx分支程序块包括if,if-else,if-elseif-…..-else的语句,其语法定语同Ansi C的定义;
10.Cxx循环程序块包括while,do-while和for语句;
3.3 简单举例
下面是一个简单的标准的Cxx的源程序:(其中/* */为说明部分,不作为程序的内容)
main() /*main函数定义*/ { int i=0,x=10,y=20,z=30,a,b,c; /*整型变量定义*/ a=x+y*z; /*赋值和算术表达式语句*/ b=(3*z )%y; for(i;i<=10;i=i+1) /*for循环语句*/
{ if(((a||b)&&(x||y))!=0) /*if-else分支语句和逻辑运算语句*/ c=a+b; else c=a-b;
} }
四.编译系统设计原理
4.1 编译系统构成及原理
编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。由编译程序的五个阶段就对应了编译系统的结构。下图给出了编译系统的结构框图:
源程序 表 格 管 理 词法分析器 单词符号 语法分析器 语法单元 语义分析与中间代码生成器 中间代码优化器 中间代码 目标代码生成器 目标代码
其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成为一个一个的单词符号二元式。一般程序语言的单词符号包括关键字、运算符、常数、标识符和界符。语法分析器将这些单词符号做为输入,对它进行语法分析。语法分析分为两种方法:自上而下分析法和自下而上分析法。针对不同程序语言的语法规则可以采取不同的分析方法,当然两种方法也可以同时使用。语法分析器把语法单元做为输入供语义分析器使用。一般的语义分析器主要采用的是语法制导方法,即在语法分析的同时进行语法分析,并产生一定的语义动作,来
出 错 处 理
共分享92篇相关文档