当前位置:首页>> >>


一门自定义编程语言的设计及其编译器的实现.rar

收藏

资源目录
    文档预览:
    编号:20180913143533182    类型:共享资源    大小:1.74MB    格式:RAR    上传时间:2018-09-13
    尺寸:148x200像素    分辨率:72dpi   颜色:RGB    工具:   
    40
    金币
    关 键 词:
    自定义 编程 语言 设计 及其 编译器 实现
    资源描述:
    太 原 理 工 大 学 毕 业 设 计 (论 文 )用 纸i一门自定义编程语言的设计及其编译器的实现摘 要编译程序是现代计算机必不可少的组成部分,它完成了将源程序转换为目标程序的全部过程。在我这次的毕业设计当中,定义和设计了一个类 C 的编程语言。由于我自身能力、时间和所学知识有限,设计出的这门语言十分简单,并没能提出一个准确有效的对现有编程语言的改进方案。当然,这个课题毕竟是一个很前沿的问题,作为大学毕业生的我只是对这个前沿问题进行了一些实践性的尝试。当然,我的毕业设计中最重要的部分就是实现了这门编程语言的编译器,它的主要功能包括了词法分析、语法分析、语义分析、中间代码生成(中间代码采用了四元式的结构) ,以及目标代码生成(目标代码采用了汇编语言) ,可以将符合语法的程序成功执行,并显示结果。由于技术所限,编译器没有进行进行代码优化和对错误的处理。但总体而言,这个编译器项目的功能性还是十分完备的。关键词: 编译器;程序设计语言;词法分析;语法分析太 原 理 工 大 学 毕 业 设 计 (论 文 )用 纸iiA Design of Custom Programming Language and the Realization of its CompilerAbstractThe compiler is an essential part of the modern computer , it completed the source to the target program the whole process.In my current graduation designs, I definited and designed a similar C programming language . Because of my own ability , limited time and the knowledge , the language is very simple , and I did not able to present an accurate and effective for improvement program existing programming languages. Of course , this subject is after all a very cutting-edge issues , as university graduates on the cutting-edge issues , I just made some practical attempt.In addition , the most important part of my project is to realize this programming language compiler, its main features include lexical analysis , parsing, semantic analysis and code generation ( intermediate code using a quaternion type of structure ) , and target code generation ( object code using assembly language ) , in line with the syntax of the program can be executed successfully , and displays the results . Due to technical limitations, no compiler for code optimization and error handling . Overall, however, the functionality of this compiler project is still very completed.Keywords: complier;Programing Language; lexical analyzers; Syntax analysis太 原 理 工 大 学 毕 业 设 计 (论 文 )用 纸1目录摘 要 ....................................................................iAbstract.................................................................ii第一章 绪论 ..............................................................1一 论文主要内容 ......................................................1(一) 程序设计语言的设计 ..........................................1(二) 编译器的实现 ................................................1(三) 在线编译思路的尝试 ..........................................1二 文献综述 ..........................................................1(一) 前言 ........................................................1(二) 研究概述 ....................................................2三 研究编程语言的目的和意义 ..........................................3四 研究编译器的目的和意义 ............................................3第二章 自定义语言的设计 ..................................................4一 程序设计语言概述 ..................................................4(一) 程序设计语言概念 ............................................4(二) 程序设计语言分类 ............................................4(三) 程序设计语言的实现 ..........................................4二 程序设计语言发展现状 ..............................................4三 程序设计语言的发展趋势 ............................................5四 自定义语言的设计 ..................................................5(一) 词法的设计 ..................................................5(二) 语法的设计 ..................................................6(三) 中间代码的选择 ..............................................6第三章 编译器概述 ........................................................7一 编译器的基本概念 ..................................................7(一) 编译器概述 ..................................................7(二) 编译过程概述 ................................................7二 研发编译器的意义 ..................................................8三 编译器的发展趋势 ..................................................8四 尝试在线编译器的意义 ..............................................8五 编译器的概要设计 ..................................................9(一) 系统总体结构 ................................................9(二) 代码分析模块结构 ............................................9(三) 类结构的设计 ...............................................10第四章 词法分析 .........................................................12一 词法分析概述 .....................................................12(一) 词法分析概念 ...............................................12(二) 常用的 LEX 程序 .............................................12二 词法分析器设计 ...................................................12太 原 理 工 大 学 毕 业 设 计 (论 文 )用 纸2(一) 词法的设计步骤 .............................................12(二) 正规式和 DFA ...............................................13(三) 利用有限自动机的词法分析 ...................................13三 词法分析器的实现 .................................................14(一) 数据结构定义 ...............................................14(二) 实现细则 ...................................................14第五章 语法分析 .........................................................16一 语法分析概述 .....................................................16二 语法分析器设计 ...................................................16三 语法分析器实现 ...................................................17(一) 上下文无关文法 .............................................17(二) LR 分析方法 ................................................17第六章 语义分析及中间代码生成 ...........................................20一 语义分析及中间代码生成的概念 .....................................20二 语义分析设计 .....................................................20三 中间代码的选取 ...................................................21第七章 目标代码生成 .....................................................22一 目标代码定义 .....................................................22(一) 简介 .......................................................22(二) 目标代码格式 ...............................................22二 目标代码生成概述 .................................................23三 实现过程 .........................................................23第八章 系统的在线化尝试 .................................................25一 为什么要进行编译器在线化 .........................................25(一) 现有系统的局限性 ...........................................25(二) 编译器在线化的优势 .........................................26(三) 在线编译器的发展现状 .......................................26二 在线化的设计思路 .................................................26(一) 开发技术概述 ...............................................26(二) 正则表达式 .................................................27(三)在线编译器功能的确立 ........................................27(四)类与方法的建立 ..............................................27三 在线化的具体实现 .................................................28(一) 基础页面部分 ...............................................28(二) 逻辑部分 ...................................................29第九章 系统测试 .........................................................31一 测试方法概述 .....................................................31(一) 测试方法综述 ...............................................31(二) 本次选取的测试方法 .........................................32二 在线版本测试用例及结果 ...........................................32(一) 基本运算 ...................................................32(二) 输出字符串 .................................................33(三) 错误处理 ...................................................34太 原 理 工 大 学 毕 业 设 计 (论 文 )用 纸3三 本地版本测试用例 .................................................34(一) 基本运算 ...................................................34(二) 输出字符串 .................................................35(三) if 语句 ....................................................36(四) for 循环 ...................................................36四 测试结果 .........................................................37结论 .....................................................................38致谢 .....................................................................40外文原文 .................................................................41中文翻译 .................................................................68太 原 理 工 大 学 毕 业 设 计 (论 文 )用 纸1第一章 绪论一 论文主要内容(一) 程序设计语言的设计在这次的毕业设计中,为了更好的完成自己的编译器,我设计了一门自定义的编程语言,这门编程语言的设计初衷并非为了改善现有编程语言的不足或者是为了对编程语言进行某种探讨,而仅仅是为了更好的配合我的编译器的实现。不过,在设计过程中,我接触到了一些新的,有趣的知识,并在我的设计中进行了融合,并进行了一些小的尝试。之后我会用单独一章的篇幅来论述我的程序设计语言的理解和认识。(二) 编译器的实现编译器的实现是我的毕业设计的主要内容,因而本篇论文的大部分章节会按照软件工程的开发流程来详细论述我的开发历程以及对编译器本身的理解。在语言选择上,我放弃了灵活的 C 而选择了我更为熟练的 Java,这个决定使得我的程序在生成四元式再转为汇编的过程中遇到了一定程度的麻烦,或者说一定程度上影响了我毕业设计的质量,当然,直到开发尾声我才意识到这个问题。底层实现上,我借助了一些网上大牛写好的代码段,并配合一定量自定义的批处理,反复利用 cmd 来生成一个 exe 文件,最终在执行这个 exe 文件得到程序的运行结果。(三) 在线编译思路的尝试将编译器转为在线编译器是我从做编译器一开始就有的想法,并且在整个过程中都在不断的尝试。然而,由于我的实现方式所限,最终也没能捕获执行结果,以至于我的编译器虽然拥有 B/S 的执行方式,但却只能在服务器端执行,唯一可行的方式是将执行结果打包,在用户执行完程序后为其提供下载服务。但是这无疑会影响用户体验。二 文献综述(一) 前言随机计算机技术的不断发展与进步,如今从事于软件开发行业的人越来越多。而太 原 理 工 大 学 毕 业 设 计 (论 文 )用 纸2既然选择了从事软件开发行业,就自然会与程序设计语言以及编译器结下不解之缘。但不论是谁来开发软件,都一定离不开程序设计语言,也一定离不开编译器,因为它们是一切程序之源。既然想要开发软件就必须有编程语言和编译器,那么,编程语言和编译器本身又是如何产生的呢?本篇论文正是在探讨这个问题,在此之前,先需要介绍一些基本概念。程序设计语言,其实就是一组记号以及一些规则,跟句这些几号和规则组成的总体就称作计算机设计语言,它可以用来书写计算机程序。通常来讲,程序设计语言有三个要素,即语法、语义和语用。编译器,是一种基础的程序,它可以将用某种语言写成的源程序翻译成另一种编程语言,它可以将易于人类编写的高级语言翻译成复杂的低级语言,这种转换可以极大的提高人们编写程序的效率,降低程序编写的难度,所以从某种意义上说,编译程序的产生是一种历史的必然。由于编译技术历史较为久远,再加上编译器技术所涉及的技术内容十分宽泛,所以本篇论文所引用的参考文献内容也较为繁杂。论文所选用的文献涵盖了编译器技术的发展历程,各种编译器的开发背景,以及各种编程语言产生的目的和意义。同时,还有不少文献包涵了编译器的前端设计的简要介绍,同时阐述了编译所应该具有的功能以及其当前的发展现状,以及实现编译器所使用的工具甚至是参考资料。(二) 研究概述上个世纪 50 年代,IBM 的 John Backus 带领着一个研究小组对 FORTRAN 语言及其编译器进行了开发工作。但是因为当时人们对编译理论了解很少,使得开发工作变得既复杂又艰苦。与此同时,Noam Chomsk 带着他的团队开始了他对自然语言结构的研究工作。他的发现最终使得后来的编译器的结构变得异常简单,甚至还带有了一些自动化的属性。Chomsky 的研究成果导致了根据语言文法的难易程度以及识别它们所需要的算法来对语言进行分类。正如现如今所称的 Chomsky 架构(Chomsky Hierarchy) ,它包含了文法的四个层次:0 型文法、1 型文法、2 型文法和 3 型文法,而且其中每一个都是其前者的特殊情况。2 型文法(上下文无关文法)被证明是程序设计语言中最为有用的,而且今天它已开始代表着程序设计语言结构的标准方式。分析问题(parsing problem,用于上下文无关文法识别的有效算法)的研究是在 60 年代和 70年代,它相当完善的解决了这个困难的问题。现在,它已是编译原理中的一个必备的标准部分。有限状态自动机(Finite Automaton)以及正则表达式(Regular Expression)同上下文无关文法十分紧密相关,它们与 Chomsky 的 3 型文法所对应。对它们的研究与 Chomsky 的研究几乎是同时开始的,并且还引出了表示程序设计语言的单词的符号表达方式。人们接着又去深化了生成有效的目标代码的方法,这就是最初的,最原始的编译器,它们被一直使用,直至今天。人们通常将把它称为优化技术(Optimization Technique) ,但因为它从来没有真正地得到过被优化了的目标代码,而仅仅是改进了它的有效性,因此实际上它应被称作代码改进技术(Code Improvement Technique) 。直到现代的新编译器,大量的项目都贯注于编译器其它部分的实现生成自动化,太 原 理 工 大 学 毕 业 设 计 (论 文 )用 纸3这其中就包括了代码的生成。这些尝试并没能取得什么成果,这大概是因为操作太过复杂而人们又对其不甚了解的原因。三 研究编程语言的目的和意义程序设计语言是一切软件开发活动的基础,程序设计语言的优劣直接决定了软件开发人员的开发效率,从而间接的影响到了软件的质量,因而程序设计语言的研究有着十分重要的意义。同时研究程序设计语言对于从事软件开发的人来说,也具有身份深远的意义,因为当软件开发人员开始研究和分析程序设计语言时,他就会进入一个更深层次的分析过程,这个过程将十分有利于他思考程序设计语言本身。这样的过程不仅仅可以软件开发人员更加了解程序设计语言,而且还可以使得新的程序开发软件更加的合理与高效。同时,软件开发的需求本来就是一直在进步的,程序设计语言一定会跟随着需求的变化而变化,所以,为了能更好的应对时代的需求,对编程语言的研究当然是无法避免的。四 研究编译器的目的和意义编译器的设计涉及到了编译程序构造的一般原理、主要实现技术、基本设计方法和一些自动构造的工具。尽管“编译程序”是特指将高级程序设计语言翻译成低级语言的程序或者代码段,但编译程序构造的基本原理和相关技术也同样广泛应用于一般的设计和实现过程中,因此,这是一门对实践性要求较高的学问。目前,世界上有着数千种编程语言,既有 Fortran 和 Pascal 这样老牌的传统程序设计语言,也有各个计算机应用领域中新出现的专用语言。目标语言的种类也同样广泛,目标语言可以是另一种程序设计语言,也可以是从微处理机到计算机的任何种类的计算机的机器语言。不同的语言需要不同的编译器。根据编译器的构造方法的不同,或者它们要实现的功能的不同,编译器通常被分为一遍编译器、多遍编译器、装入并执行编译器、调试编译器、优化编译器等等多种类别。从表面上来看,编译器的种类似乎千变万化,多种多样,不可琢磨,实质上,任何编译器所要完成的基本任务其实都是相同的。通过理解这些编译任务,我们可以利用同样的基本技术和基本方法为各种各样的源语言和目标机器构建编译器。这将很有益处。太 原 理 工 大 学 毕 业 设 计 (论 文 )用 纸4第二章 自定义语言的设计一 程序设计语言概述(一)程序设计语言概念程序设计语言通常是被设计成专门使用在计算机上的语言,但其实,它们也可以用来定义一些算法或者数据结构。正是因如此,程序员们才会试图通过改进使得程序代码更容易阅读。程序设计语言往往使程序员能够比使用机器语言更加准确的表达他们所想要表达的目的。对于那些从事计算机科学技术的人来说,懂得程序设计语言本身是十分重要的,因为,当今所有的计算都需要使用程序设计语言才能完成。(二)程序设计语言分类当今,有许多用于特殊用途的编程语言,它们只在特殊情况下使用。例如,PHP专门用来编辑网站服务器;而 Perl 则更适合文本处理;C 语言却被广泛应用于操作系统和编译器等底层系统的开发。高级语言的出现使得现代的编程语言不再过度的倚赖某种特定的机器或者环境。这是因为高级语言在不同的平台上都会被编译成特定的机器语言,而不是直接就被机器执行。最早出现的编程语言之一 FORTRAN 的一个主要目标就是实现了平台的独立。(三)程序设计语言的实现虽然大多数的语言可以既可被编译又可被解释,但是,大多数语言仅在一种情况下能够良好的运行。在一些编译系统中,程序一般要经过几个阶段的编译,后阶段的编译往往更加接近机器语言。这种常用的使用技巧是编译程序先去编译一个叫做“0代码”的转换程序,然后再使用虚拟器,将程序转换到可以运行于机器上的底层代码。这种技巧后来又用于 Pascal 和 P-code,以及 Smalltalk 和二进制码,在很多时候,中间过渡的代码往往是解释,而不是编译的。如果所使用的翻译机制是将所要翻译的程序代码作为一个整体去翻译,并且在之后运行内部的格式,那么这个翻译过程就被称为编译。因此,一个编译器是把一个人可阅读的程序文本作为输入的数据,然后输出可执行文件。所输出的可执行文件是机器语言,由计算机的中央处理器直接运行,也可以是某种模拟器的二进制代码。太 原 理 工 大 学 毕 业 设 计 (论 文 )用 纸5二 程序设计语言发展现状目前通用的编程语言有两种形式:低级语言和高级语言。低级语言直接对硬件操作,其中汇编语言的指令采用了英文缩写的标识符,更容易识别和记忆。用汇编语言能完成的操作不是一般高级语言所能直接实现的,而且其源程序经汇编生成的可执行文件不仅体积比较小,而且执行速度非常快。而高级语言则是目前大多数编程者的选择。和汇编语言相比,它不但是将许多相关的机器指令合成为单条的指令,而且去掉了与具体操作有关但是与完成工作无关的细节,例如,使用堆栈、寄存器等等,这样就大大的简化了程序中使用的指令。于此同时,由于省略了很多细节,编程者也就不需要有太多的硬件知识。目前主流的高级语言有 java、c、phython、javascript 等等,这些语言的语法、命令格式都各不相同,但它们所编制的程序都不能直接被计算机识别,必须经过转换才能被执行,因而,制作一个编译器才显得尤为重要。三 程序设计语言的发展趋势程序设计语言是软件的重要方面。它的发展趋势是模块化、简明性和形式化。一、模块化。不仅语言具有模块成分,程序由模块组成,而且语言本身的结构也是模块化的。二、简明性。涉及的基本概念不多,成分简单,结构清晰,易学易用。三、形式化。发展合适的形式体系,以描述语言的语法、语义、语用。四 自定义语言的设计(一)词法的设计1 保留字表首先,需要定义全部的保留字,所以需要定义一个保留字表,如表 2-1 所示。表 2-1 保留字表保留字 用途null 空for 类 c 的 for 循环myprint 输出语句br 换行语句if 条件语句break 跳出循环while while 循环int 定义整型double 定义浮点型main 程序入口
    展开阅读全文
    1
      金牌文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    0条评论

    还可以输入200字符

    暂无评论,赶快抢占沙发吧。

    关于本文
    本文标题:一门自定义编程语言的设计及其编译器的实现.rar
    链接地址:http://www.gold-doc.com/p-116504.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服客服 - 联系我们
    copyright@ 2014-2018 金牌文库网站版权所有
    经营许可证编号:浙ICP备15046084号-3
    收起
    展开