c语言编译器前端实现,一个简单文法的编译器前端的设计与实现

《一个简单文法的编译器前端的设计与实现》由会员分享,可在线阅读,更多相关《一个简单文法的编译器前端的设计与实现(19页珍藏版)》请在人人文库网上搜索。

1、课程设计报告设计题目:一个简单文法的编译器前端的设计与实现班 级:计算机1208班组长学号:20124016组长姓名:樊荣指导教师:张俐 设计时间:2014年12月设计分工组长学号及姓名:20124016 樊荣分工:四元式生成、语义分析(未定义、重定义等卜整体设计组员1学号及姓名:20124020李鑫分工:符号表建立及其输入输出设计组员2学号及姓名:20124032杨学良分工:词法分析组员3学号及姓名:20124018 焦 通分工:语法分析组员4学号及姓名:201240陈凤分工:简单C语言文法设计及部分简单函数编写编译器是程序员使用的关键工具,程序员每天都在使用编译器,并且非常依赖于其正确性和。

2、可靠Tto编译器作为广大 IT从业者必须接触的系统软件,它 的设计本身又是一个极其庞大的工程。编译器相关的各项技术经过近几十年的发 展,已经日臻成熟,然而编译器构造原理和技术依然是计算机科学中理论与实践 相结合的最好典范。本文重点介绍了编译器前端的详细开发过程,分为四个部分 分别阐述:文法设计,词法分析器的设计,语法分析器的设计,语义分析部分。每个部分又分别从功能,数据结构和算法三个方面进行详尽阐述,。由于 C语 言本身的复杂性,很难面面俱到实现所有标准定义,所以本次设计只象征性的选 择部分具有代表性的功能。在本文的第四章详细给出了此次设计所实现的功能和 语法规范,同时也给出了编译器的运行方式。

3、。关键词:编译原理,编译器前端,C源程序摘要1概述 22课程设计任务及要求 32.1 设计任务 32.2 设计要求 33算法与数据结构 43.1 算法的总体思想(流程) 43.2 词法分析模块 53.2.1 功能 73.2.2 数据结构 83.2.3 算法 93.3 语法分析模块 103.3.1 功能 113.3.2 数据结构 123.3.3 算法 133.4 符号表模块 133.4.1 功能 133.4.2 数据结构 144序设计与实现 141.1 程序流程图 141.2 程序说明 151.3 实验结果 155 .结论 166 .参考文献。 177 .收获、体会和建议。 171 .概述经过一。

4、段时间的学习,我们在初步掌握了编译器的基本原理以后,设计了 一个具有基本编译功能的编译器前端。该编译器前端接受类C语言语法的源代码输入,输出结果是四元式组。本编译器实现了基本高级语言所必须的语法要素, 包括简单变量声明、条件判断语句和循环语句及跳转语句、 基本代数运算、赋值 等。由于编译程序本身涉及到词法分析、语法分析、中间代码生成等诸多模块, 要在实验中做到面面俱到不太可能,所以本编译器不可避免的会存在各种问题, 但作为一个具有基本功能的、可扩充的系统,完全达到了巩固编译原理的理论知 识,并将其运用于实践的目的。2 .课程设计任务及要求2.1 设计任务在下列内容中任选其一:1、一个简单文法的。

5、编译器前端的设计与实现。2、基本块的划分及中间代码优化程序设计与实现。3、LL (1)、LR分析表的自动生成算法的设计实现。4、自选一个感兴趣的与编译原理有关的问题加以实现,要求难度相当。我们组由于人数较多,且综合代码编写能力不强,经多方面考虑选择了简单 类C文法的编译前端设计与实现任务。2.2 设计要求1 .给出一个源程序文件,作为编译器前端的输入2 .输出相关编译阶段的运行结果词法分析阶段:Token序列;关键字表、界符表、符号表系统。中间代码生成阶段:四元式序列; 符号表系统。3 .算法及数据结构3.1 算法的总体思想(流程)输出信息程序整体上遵从上图所示流程图,源代码通过词法分析器,录。

6、入 token序列, 并纠察词法错误,接下来根据token序列进行语法分析,采用递归下降法对程序语法进行验证检查,在这过程中,建立和完善符号表,并进行语义差错(主要是 类型检查、未定义和重定义),通过前面过程后,才能生成中间代码,并输出有 关信息。3.2 词法分析模块3.2.1 功能词法分析程序又称扫描器,它是编译过程的第一个阶段。其主要任务是从左到右依次描描字符串形式的源程序的各个字符,逐个识别出其中的单词,并将其转换成为内部编码形式的单词符号用输出, 用于进行语法分析。概括的说语 法分析器在工作中完成以下几项任务:(1)识别出源程序中的各个单词符号,并将其转换成内部编码形式;(2)删除无用。

7、的空白字符、回车字符以及其他非实质性字符;(3)进行词法检查,报告所发现的错误;(4)填写符号表。3.2.2 数据结构struct TokenType int code,value;token100;/token 序歹!Jstring bsfwords20;标示符数组,code = 0int bsf = 0;char zifwords20;/字符数组,code = 1int zif = 0;string zfcwords20;/字符串数组,code = 2int zfc = 0;float numwords30;数字常量数组,code = 3int num =0;3.2.3 算法识别器算法流程。

8、图设计:一个简单识别器(有限自动机)的设计;无符号小数驾I (D e(字 译(数字),机源程.结束符):(2)摄奥格,回车,换行)-需要滤掉aC3)v (泛指单词的后继苻h(必一.t表示省略了其他界符的处理3总体算法流程图设计:开始关联文件,读文、 件获取数字常量,生成数字常 量token,填写符号表获取字符串,查 关键字表error生成标示符 token,存储字 符串,填写符 号表;生成关 键字token查界符表,生成界符token3.3 语法分析模块3.3.1 功能语法分析程序又称分析器,它以单词用形式的源程序作为输入或分析的 对象,其基本任务是:根据程序设计语言的语法规则(即定义该语言的。

9、前后无关 文法),分析源程序的语法结构,即分析如何由这些单词组成该源程序的各种语 法成分(如下标变量、函数、各种表达式、各种程序语句等),并在分析过程中进行语法正确性检查,产生内部形式的中间代码,供编译程序后续阶段处理3.3.2 数据结构int sem20;模拟语义栈,存储单词token码3.3.3 算法 扩展文法:增设一个产生式,作为主程序:Z-Z入出口约定:子程序入口时,其首符号已经读来!子程序出口时,其后继符应该读来! 子程序内容设计:遇终结符,判定之,确认后读下一单词;遇空用遇非终结符,调用之,返回后不读下一单词;(),直接出口;根据定义的文法和算法编写部分递归下降程序框图如下:P:入。

10、口NerrorNEXT (W)n?1y卢1结束L,IT:入口1 1cT最符?ErrornErrory NEXT (w)| n4出口诸如上面框图,实现文法内容,在相应的地方加入语法动作,可生成 四元式,调用符号表系统,可以填写符号表和语义查错。3.4 符号表模块3.4.1 功能符号表是标识符的动态语义词典,属于编译中语义分析的知识 库;主要内容:名字一标识符源码,用作查询关键字;类型-该标识符的数据类型及其相关信息;种类-该标识符在源程序中的语义角色;地址-与值单元相关的一些信息;由于文法比较简单,只是实现一部分功能,所以符号表部分也相应没 那么完整和强大,它只是帮助实现了变量重定义、变量未定义。

11、和类型匹配的查错功能。3.4.2 数据结构struct Ainfl / 数组表int low;int up;Typel Cpt;int clen;struct Rinfl / 结构表string ID;int off;Typel TP;struct Typel /类型表 char tval;Ainfl a;Rinfl d;TYPEL20; int pipei=0;struct symbol / 符号总表 string name;Typel type;char cat;int addr;Symbol20;4序设计与实现4.1 程序流程图开始输出token序列错?输出符号表信息,四元4.2 程序说。

12、明int isLetter(char ch)/ 字母判断int isNumber(char ch)/ 数字判断void initKeys()关键字,分界符初始化int lockupkeys(string s) 查询关键字和分界符void insertToken(int a,int b) /token 录入void printToken() /token 输出void scanner。/ 一个字符一个字符地扫描void P();递归下降子程序void Pp();void Iff();void Co();void II();void Dw();void Vt();void Vd();void It。

13、();void Wt();void D();void E();void T();void F();void I();void Ty();void addSymbol(string s,char tval,char cat,int addr)/ 添力口至U符号表sendVall();/输出活动记录表sendSymbol();输出符号表sendConst();输出常数表4.3 实验结果:由cikMi序列,符号表,巾间代码生成token序列为!void,8)(main,4(b,0一编译器蓟端2 功能表:I词沫芬需 谙理、悔义分 3佳成搜狗拼音输入法半二,11300,1273) 120) ,124 a。

14、WA爵礴蕊”入语法、语义分析:2输入容意字符进入符号表、常数表、中间代码生成:I ;作成四元式如下: l ;4 tl_ c3 t2 t2 t3 _ h h td_ _1t5_ b_ _1 ct_ a _ _iocess returned Q C0x0 exeiciit ion time ; 75.180 s iress any key to continue. 图福拚音揄人涉半普5 .结论经过全组人员共同努力,基本实现了编译前端的功能任务,能够实现扫描, 进行语法语义分析,并能生成符号表系统,将编译器前端的工作做得比较完善。 尽管如此,我们的系统还是有待完善的,诸如函数功能、符号表的进一步细化。

15、都 是可以继续进行的项目,由于精力和时间有限,我们组暂时只能做到这个地步。 整体结果我们自己还是很满意的,毕竟一个编译器前端真真切切地被实现了,我们的辛苦工作没有白费。6 .参考文献1、陈火旺.程序设计语言编译原理(第3版).北京:国防工业出版社.2000.2、美 Alfred V.Aho Ravi Sethi Jeffrey D. Ullman著.李建中,姜守旭译.编译原理.北京:机械工业出版社.2003.3、美Kenneth C.Louden著.冯博琴等译.编译原理及实践.北京:机械工业出版 社.2002.4、金成植著.编译程序构造原理和实现技术.北京:高等教育出版社.2002.7.收获、。

16、体会和建议通过本次开发设计,我们对 C语言课程、数据结构、编译原理等一系列的 课程的进行回顾学习。在开发基于 C语言小型编译器前端中,还是用系统分析、系统设计的思路。一个好的系统分析、设计工作,会使以后的系统实施顺利高效 的进行从而达到事半功倍的效果, 这也是我的一点心得体会吧。对于系统的可扩 展性,在设计前也做了充分的考虑,在设计时预留了一些余地,以便本系统在C语言语法不变的情况下一直都能使用, 而不需要再重新开发。同时在设计上使用 的是模块化的设计,更为系统以后的扩展提供了良好的条件。 同时系统也存在的 问题与改进方向,由于本人第一次开发编程语言编译程序,经验不足,所以存在 着许多不足之处。由于时间紧,开发任务重,系统有些功能尚未健全。能够做到这些,也要感谢编译老师和课设指导老师的帮助, 但我们有一点小小的 建议希望老师们采纳,那就是希望老师们能再多提一点后端的实现内容对前端的 要求,毕竟,没有后端,前端的实现上会有很多种模式和方法, 但一旦考虑后端, 有些数据结构或者实现算法就会露出弊端。以上就我们组的小结。在今后的学习和实践中,我们也会牢记编译原理实验交给我们的诸多方法, 并切实应用到生活中,因为通过学习和实践,我们体会到编译原理的知识,确实 很具有普遍应用价值,这些知识,将会是我们终身受用的。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华中科技大学 编译原理 面向过程的C语言编译器设计 功能包括:词法分析和语法分析、语义分析、中间代码生成的 源码 题目:c--语言编译器设计实现(请为自己的编译器命名) 源语言定义:或采用教材中Decaf语言,或采用C语言(或C++语言或C#语言或JAVA语言)部分关键语法规则。源语言要求至少包含的语言成分如下: 数据类型至少包括char类型、int类型和float类型 基本运算至少包括算术运算、比较运算、自增自减运算和复合赋值运算 控制语句至少包括if语句和while语句 实验内容:完整可运行的自定义语言编译器 实验一:词法语法分析器的设计实现:建议使用词法语法生成工具如:LEX/FLEX ,YACC/BISON等专业工具完成。 实验二:符号表的设计与属性计算:设计符号表数据结构和关键管理功能。动态展现符号表变化过程。无论语法分析使用工具还是自己设计,都必须对符号表进行设计和管理,属性计算可以语义子程序实现。 实验三:语义分析和中间代码生成:生成抽象语法树,进行语义分析,实现类型检查和控制语句目标地址计算,生成中间代码。中间代码的形式可以采用不同形式,但实验中要求定义自己的中间形式。 实验四:目标代码生成:在前三个实验的基础上实现目标代码生成。也可以使用工具如LLVM来生成目标代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值