第一篇:(黑龙江大学)编译原理读书工程
黑龙江大学
“编译原理课程设计”读书报告
学院 年级 专业 学号 姓名 报告日期 成绩
计算机科学与技术学院 2011级
计算机科学技术专业 20114872 李军 2013.07.05
黑龙江大学计算机科学技术学院
一、开发环境简介
“编译原理”课程是计算机专业中一门重要的专业理论课,是一门理论性和实践性都很强的课程。为配合《编译原理》课程的教学,培养学生的实际工作能力,加深对课堂教学内容的理解,通过设计一个小型编译器,更深刻地领会其基本概念、基本工作原理和实现方法,从而具有初步开发系统软件和应用软件的实际能力,特开设此课程设计。
通过小型编译器的设计与实现,使学生系统地掌握编译程序的总体结构以及词法分析程序、语法分析程序、语义分析程序、代码生成程序;掌握结构化设计方法;了解大型软件的设计技术。开发环境:visual c++6.0 开发语言:c语言 开发人:李军
指导教师:付立平老师
二、基本理论阐述、当前理论或实践应用现状
编译器: 高级计算机语言便于人编写,阅读,维护。低阶机器语言是计算机能直接解读、运行的。编译器将源程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。源代码一般为高级语言(High-level language),如Pascal、C、C++、C#、Java等,而目标语言则是汇编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。
工作原理: 编译是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器语言)的翻译过程。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。
典型的编译器输出是由包含入口点的名字和地址,以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的EXE, 所以我们电脑上的文件都是经过编译后的文件。高级语言程序处理过程:
三、小型编译器系统架构
它是一个编译器的架构.通俗的来说,它实现了一个库,在这个库上,可以很容易的实现不同的编译相关的程序,当然,编译器自然是其中最重要的一个.当然其他像编译时间的代码分析也是很容易实现的。构造识别符号串的自动机、词法分析程序的构造、语法分析程序的构造、中间语言的生成程序、编译程序的代码生成。
四、小型编译器主要功能模块与实现
(1)功能介绍 用户提供源代码,使用编译器进行编译,先用词法分析程序构造出符号表,然后利用语法分析程序分析橘子的语法,接着根据文法分析程序分法,在语法制导翻译和中间代码生成中,采用逆波兰式生成四元式再转化为汇编代码。词法分析:
定义:
词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等(1)关键字 是由程序语言定义的具有固定意义的标识符。例如,Pascal 中的begin,end,if,while都是保留字。这些字通常不用作一般标识符。(2)标识符 用来表示各种名字,如变量名,数组名,过程名等等。(3)常数 常数的类型一般有整型、实型、布尔型、文字型等。(4)运算符 如+、-、*、/等等。(5)界符 如逗号、分号、括号、等等。输出:
词法分析器所输出单词符号常常表示成如下的二元式:(单词种别,单词符号的属性值)单词种别通常用整数编码。标识符一般统归为一种。常数则宜按类型(整、实、布尔等)分种。关键字可将其全体视为一种。运算符可采用一符一种的方法。界符一般用一符一种的方法。对于每个单词符号,除了给出了种别编码之外,还应给出有关单词符号的属性信息。单词符号的属性是指单词符号的特性或特征。示例:
比如如下的代码段: while(i>=j)i--经词法分析器处理后,它将被转为如下的单词符号序列:
词法分析分析器作为一个独立子程序
词法分析是编译过程中的一个阶段,在语法分析前进行。词法分析作为一遍,可以简化设计,改进编译效率,增加编译系统的可移植性。也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。
语法分析:
对任何输入串w试图从文法的开始符号出发,按与最左推导对应的顺序,构造w的语法分析树
如果构造成功,则w为相应文法的一个句子;否则w就不是文法句子
文法分析:
(3)算法描述 ①词法分析:
根据输入的句子从头开始扫描,独到一个字符后,判断它的类型,并更改相应的状态,下一次读入时,根据当前的状态和输入的字符的类型进行状态的转换和对次的添加。状态机在一定程度上反映了此法的一些规则,如不能一数字开头命名变量。
全局变量:
ch---字符变量:存放当前读进的源程序字符 token---字符数组:存放构成单词符号的字符串 调用函数
getch()---读字符函数:每调用一次从输入缓冲区中读进源程序的下一个字符放在ch中,并把读字符指针指向下一个字符
getbc()---读空白字符:每次调用时,检查ch中的字符是否为空白字符;若是空白字符,则反复调用getbc(),直至ch中进入一个非空白字符为止 concat()---字符串连接函数:把当前ch中的字符与token中的字符串连接。letter(ch)---字母字符判定函数:判定 ch 中的字符是否为字母,并返回true 或 false。
degit(ch)---数字字符判定函数:判定 ch 中的字符是否为数字,返回true 或 false。
reserve()---关键字判断函数:对token中的字符串查关键字表;若它是一个关键字, 则回送它的编码;否则,回送标识符的种别码。
语法分析:
算符优先文法的描述: 只规定算符之间的优先关系,也就是说只考虑终结符之间的优先关系。由于算富有先分析不考虑非终结符之间的优先关系,在规约过程中只要找到最左素短语就可以规约。
如给定一个文法G[S]:
S->#E# E->E+T E->T T->T*F T->F F->P/F F->P P->(E)P->i
利用算符优先文法分析过程处理如下:
1)计算给定文法中任意两个终结符对(a,b)之间的优先关系,首先计算两个集合FIRSTVT(B)={b|B->b„或B->Cb„} LASTVT(B)={a|B->„a或B->„aC}
语法制导翻译和中间代码生成: 定义语义函数和语义变量 语义函数emit 格式:emit(T=arg1 OP arg2)功能:生成一个三地址语句,并送到输出文件中 语义函数newtemp 格式:newtemp()
功能:产生一个新的临时变量名字,如T1、T2等,并回送新的临时变量名的整数码
注意:对临时变量有两种不同的处理方法(1)送到符号表(2)不进符号表,临时变量单词值部分用整数码表示 语义过程Lookup 格式:Lookup(i.name)功能:审查i.name是否出现在符号表。如在,则返回其指针;否则,返回NULL 语义变量:E.place 存放非终结符E值的变量名在符号表中的入口地址或临时变量名的整数码(4)程序流程图 词法分析:
语法分析: ‘#’’S’入栈,当前终结符送a上托栈顶符号放入X若产生式为X->x1x2x3..xn,按逆序入栈YNX inVT?YYX=a?读入下一符号M[X,a]是产生式吗NX=’#’?YN出错出错X=a?Y结束
预测分析程序框图
文法分析:
语法制导翻译和中间代码生成: 开始读入字符输入表达式进行扫描分词判断是字母还是数字还是运算符判断语句是否合法运算符,判断运算符的种类若为双目运算符则入符号栈,单目则出栈,修改状态位,若为(直接入栈,为)则一直出栈直到(为止根据变量在符号表中的位置来判断它的属性和值如果当前字符为 0-9的数字,则将其添加到结果(后缀表达式)串中。再次扫描输入串如果当前我字符为 +,-,*,/中的任何一个,如果当前字符的优先级高于栈顶运算符的优先级,则直接 将其压入栈中。当前字符的优先级小于等于栈顶运算符的优先级,则将栈中所有优先级大于等于 当前运算符的运算符弹栈,并添加到结果串中,然后将当前运算符压入栈中.结束(5)测试用例与实验结果 02
0
311 04
0
5五、读书工程心得总结
这是我这学期收获最大的一门课,在付老师的带领下,我完整地了解了编译器的整个流程和架构!通过老师的帮助和自身的努力,以上便是我对这门课的答卷,我深知,自己能力有限,不可能达到完美!但至少我知道,我努力的方向,并且为此不懈奋斗者!希望这段程序,能成为我大学最美好的回忆!
六、参考文献
1.张素琴,吕映芝等.编译原理(第二版)[M].清华大学出版社,2012,11: 2.Kenneth C.Louden 著,冯博琴 冯岚等译。编译原理及实践[M].机械工业出版社。2009,04.
第二篇:《编译原理课程设计》读书工程方案
“编译原理课程设计”读书工程环节方案
一、目的与要求
“编译原理”是计算机科学技术专业与软件工程专业的必修课程,是一门理论性和实践性都很强的课程。为了配合《编译原理》课程的教学更全面的理解理论知识,提高实践能力,计算机科学与技术专业以及软件工程专业开设了实践类必修课程-“编译原理课程设计”。通过设计一个小型编译器,更深刻地领会编译程序的基本概念、基本原理和实现方法,培养学生的实际工作能力,加深对课堂教学内容的理解,从而具有初步开发系统软件和应用软件的实际能力。将读书环节融入教学内容的设计中,做好理论教学、实践教学、读书环节三者有机结合,可使学生进一步了解课程理论知识,拓宽视野,加深对本专业相关课程的理解。在读书工程环节,学生可以通过阅读相关的参考书目,对课程设计的五个主要部分:构造识别符号串的自动机、词法分析程序的构造、语法分析程序的构造、中间语言的生成程序、编译程序的代码生成程序中的任意一个题目进行深入的分析探讨和总结,并提交相应的读书工程报告。
二、考核方式
通过提交读书报告进行考核,该部分成绩要占课程总成绩的15%。字数不少于5000字。
三、参考书目
书目名称:编译原理(第2版)作 者:张素琴 吕映芝 出 版 社:清华大学出版社 出版时间:2005年02月
内容提要:本书介绍编译系统的一般构造原理、基本实现技术和一些自动构造工具。主要由语言基础知识、词法分析、语法分析、中间代码生成、代码优化、目标代码生成、符号表的构造和运行时存储空间的组织等部分组成。
书中在介绍编译程序构造基本原理的同时引入“PL/0语言的编译程序”结构及文本,还引入了LEX、YACC使用方法与实例。
本书是高等院校计算机科学与技术专业的本科生教材,也可作为教师、研究生软件工程技术人员的参考书。书目名称:编译原理(第2版)原书名: Compilers:Principles,Techniques,and Tools 原出版社: Pearson Education 作者: [美]Alfred V.Aho,Ravi Sethi,Jeffrey D.Ullman 译者: 李建中 姜守旭 出版社:机械工业出版社 出版日期:2003 年9月
内容提要:本书深入讨论了编译器设计的重要主题,包括词法分析、语法分析、语法制导分析、类型检查、运行环境、中间代码生成、代码生成、代码优化等,并在最后两章中讨论了实现编译器的一些编程问题和几个编译器实例,每章都提供了大量的练习和参考文献。本书从介绍编译的原理性概念开始,然后通过构建一个简单的一遍编译器来逐一解释这些概念。本书是编译原理课程的经典教材,作者曾多次使用本书的内容在贝尔实验室、哥伦比亚大学、普林斯顿大学和斯坦福大学向本科生和研究生讲授初等及高等编译课程。本书作者alfred v.aho、ravi sethi和jeffrey d.ullman是世界著名的计算机 科学家,他们在计算机科学理论、数据库等很多领域都做出了杰出贡献。本书 是编译领域无可替代的经典著作,被广大计算机专业人士誉为“龙书”。本书一 直被世界各地的著名高等院校和科研机构(如贝尔实验室、哥伦比亚大学、普 林斯顿大学和斯坦福大学等)广泛用作本科生和研究生编译原理与技术课程的 教材,本书对我国计算机教育界也具有重大影响。书中深入讨论了编译器设计的重要主题,包括词法分析、语法分析、语法制 导分析、类型检查、运行环境、中间代码生成、代码生成、代码优化等,并在 最后两章中讨论了实现编译器的一些编程问题和几个编译器实例,而且每章都 提供了大量的练习和参考文献。书目名称:编译原理及实践
作者:(美)Kenneth C.Louden著,冯博琴,冯岚等译 出版社:机械工业出版社 版次:2000年3月第1版
内容提要:本书结合对现代编译器设计理论的详细研究,完整描述了一个可运行的小规模语言编译器(包括源代码)。本书反映了作者的这样一些观点:不掌握理论就不会理解实际的编译器设计;而对大学生来说,看不到理论在实际中的应用就不会真正地理解理论。把本书讨论的概念统一起来,就是一个完整的可运行的编译器,它使用每一章所讨论的技术进行开发,用C语言写成。每章最后有大量的练习,使学生的注意力集中在编程问题上。书目名称:编译程序构造原理和实现技术 作者:金成植
出版社:高等教育出版社
出版时间:2000年7月第1版 2004年4月第6次印刷
内容提要:本书经教育部高等学校计算机教学指导委员会推荐,列入“九五”国家级重点教材建设项目和“面向21世纪课程教材”。
本书是作者在其编著的《编译原理与实现》基础上编写的,结合了多年的教学经验,是一本比较成功的教材。它主要以Pascal类语言为模型,介绍过程式语言的编译程序构造原理和实现技术。本书共分十章,主要包括词法分析和语法分析的理论与技术,语义分析原理与技术,运行时的存储分配原则,动作文法和属性文法技术,中间代码生成、中间代码优化和目标代码生成的原理与技术等。本书的特点是概念清晰,层次分明,循序渐进,整体性强,便于教学,并反映当前的实用技术。
书目名称:编译原理(第2版)作者:(美)阿霍等著,赵建华等译 出版社:机械工业出版社 出版时间:2009-1-1 内容提要:本书是编译领域无可替代的经典著作,被广大计算机专业人士誉为“龙书”。本书上一版自1986年出版以来,被世界各地的著名高等院校和研究机构(包括美国哥伦比亚大学、斯坦福大学、哈佛大学、普林斯顿大学、贝尔实验室)作为本科生和研究生的编译原理课程的教材。该书对我国高等计算机教育领域也产生了重大影响。第2版对每一章都进行了全面的修订,以反映自上一版出版20多年来软件工程。程序设计语言和计算机体系结构方面的发展对编译技术的影响。本书全面介绍了编译器的设计,深入地探讨了编译器设计方面的重要主题,包括词法分析、语法分析、语法制导定义和语法制导翻译、运行时刻环境、目标代码生成、代码优化技术、并行性检测以及过程间分析技术,并强调编译技术在软件设计和开发中的广泛应用。每章中都包含大量的习题和丰富的参考文献。并在相关章节中给出大量的实例。书目名称:编译原理课程设计 作 者: 王雷、刘志成、周晶 出 版 社: 机械工业出版社 出版时间: 2005-3-1 内容提要:编译理论和技术作为计算机科学研究和工程应用的基础,受到了广泛的重视。编译原理也是大学计算机专业的必修课程。本书使用优秀的开源java编译器gjc作为编译教学的基础平台,通过分析一个真正实用的现代编译系统,把编译理论应用到实际的工程实践中。全书不仅包括对编译器源代码的分析、对实例的讲解,还在最后给出3个具体的课程设计实验,介绍如何用书本上的编译理论实现一个真正的编译器。使用优秀的开源编译器作为教学平台,系统规模不大,且源程序有着很好的注释。通过详尽的源代码剖析和实例讲解,循序渐进地启发学生完成课程设计。结合实际应用的要求,使课程设计既覆盖知识点,又接近工程实践需要。是一本注重应用的实验教程,因此可以和讲授编译理论的教材配合使用。编译原理是大学计算机专业的必修课程。本书使用优秀的开源java编译器gjc作为编译教学的基础平台,通过分析一个真正实用的现代编译系统,把编译理论应用到实际的工程实践中。全书不仅包括对编译器源代码的分析、对实例的讲解,还在最后给出3个具体的课程设计实验,介绍如何用书本上的编译理论实现一个真正的编译器。本书适合作为大专院校编译原理课程设计的指导用书,相关的从业人员和研究人员也可以从中获得有益的参考。
书目名称:《现代编译程序实现—Java语言》(第二版,英文影印版)原书名: Modern Compiler Implementation in Java,Second Edition 原出版社: Cambridge University Press 作 者:(美)A A.W.Appel等 出 版 社:电子工业出版社 出版时间:2004 年9月 内容提要:,本书是一本编译技术的教程,其特点是注重实现。从学习编译器的结构来掌握理论,并通过编程技术将编译理论融合于实践中。本书介绍了编译器的各个方面,包括词法分析,语法分析,抽象语法,语义行为,中间表示,通过树匹配选择指令,数据流分析,用色图法实现寄存器分配,运行时间系统。本书还讲述了通用的编译器实现技术,包括代码生成、寄存器分配以及大多数书籍未涉及的函数式编程语言和面向对象语言,并用实际的Java类详细说明了编译器各模块间的接口。本书的第一部分——编译器基础,适合作为第一学期编译器设计的入门课程。本书的第二部分ˉ一高级课题,包括面向对象语言和函数式语言的编译技术,无用信息收集,循环优化,静态单赋值表,指令调度以及高速缓冲存储器的分级优化,则适合作为第二学期的课程。本书第二版新增了关于Java和面向对象编程等概念,例如访问模型。本书的一大特色是利用Java子集重新实现了一个编译器项目。该项目包括前端和后端阶段,因此学生可以在一个学期内实现一个完整的编译器。
本书可作为高等院校编译技术课程的教材、教师参考书以及编译技术研究人员的参考资料。
书目名称:《程序设计语言编译原理》(第3版)作 者: 陈火旺 刘春林 谭庆平赵克佳 刘越 出 版 社:国防工业出版社 出版时间:2000年02月
内容提要:本书是在陈火旺、钱家骅、孙永强三位教授编写的《程序设计语言编译原理》的基础上,结合编译技术的最新研究成果和作者多年的教学经验编写而成的。
本书比较全面、系统地介绍了编译程序构造的一般原理和基本实现方法,内容包括词法分析、语法分析、属性文法与语法制导翻译、语义分析与中间代码产生、符号表与运行时存储空间组织、优化与目标代码生成、并行编译技术。与原教材相比,本书将编译技术的最新发展,例如属性文法、面向对象语言的编译技术、并行编译技术、编译程序自动构造工具等内容系统地融合到教材中;在语言背景方面,以C,Pascal替代原教材中的FORTRAN和Algol;并在一些重要的章节中增加了必要的例题,以帮助读者理解和自学。本书可作为高等(理、工)院校计算机科学(或工程)专业的教材,或作为教师、研究生、高年级学生或软件工程技术人员的参考书。书目名称:编译原理 技术与工具(第二版)(英文版)原书名: Compilers: Principles, Techniques, and Tools(2nd Edition)原出版社: Addison Wesley 作 者:(美)Alfred V.Aho Monica S.Lam Ravi Sethi Jeffrey D.Ullman 出 版 社:人民邮电出版社 出版时间:2008 年2月
内容提要:作为编译器设计的教程,本书重点主要放在解决设计语言翻泽器过程中普遍需要面对的一些问题上,而并不考虑源语言或者目标机器。本书共 12章。第一章是一些关于学习动机的资料,同时也给出了一些关于计算机体系结构和程序设计语言原理的背景知识。第二章开发了一个缩微的编译器,并介绍了很多重要的概念,这些概念将在后面的各个章节中深入介绍。这个编译器本身在附录中给出。第三章讨论了词法分析、正则表达式、有穷状态自动机和词法分析器的生成工具,这些内容是各种正文处理的基础。第四章讨论了主流的语法分析方法,包括自顶向下方法(递归下降法,ll技术)和自底向上方法(lr技术和它的变体)。第五章介绍了语法制导定义和语法制导翻译的基本思想。第六章介绍了如何使用第五章中的理论为一个典型的程序设计语言生成中间代码。第七章讨论了运行时刻环境,主要是运行时刻栈的管理和垃圾收集机制。第八章介绍了关于目标代码生成的内容,主要讨论了基本块的构造,从表达式和基本块生成代码的方法,以及寄存器分配技术。第九章介绍了代码优化技术,包括流图、数据流分析框架以及求解这些框架的迭代算法。第十章讨论了指令级优化。该章的重点是从小段指令代码中抽取并行性,并在那些可以同时做多件事情的单处理器上调度这些指令。第十一章讲的是大规模并行的检测和利用。这章的重点是数值计算代码,这些代码具有对多维数组进行遍历的紧致循环。第十二章介绍的是关于过程间分析技术的内容,讨论了指针分析、别名和数据流分析,这些分析中都考虑了到达代码中某个给定点时的过程调用序列。
本书可作为高校计算机专业本科和研究生编译原理的教科书,也可供从事计算机软件开发的人员参考。
四、读书报告范例
黑龙江大学
“编译原理课程设计”读书报告
学院 年级 专业 学号 姓名 报告日期 成绩
黑龙江大学计算机科学技术学院
黑龙江大学软件学院
一、开发环境简介
二、基本理论阐述、当前理论或实践应用现状
三、小型编译器系统架构
四、小型编译器主要功能模块与实现(1)功能介绍(2)相关理论(3)算法描述(4)程序流程图
(5)测试用例与实验结果
五、读书工程心得总结
六、参考文献
1.秦明,李波.计算机操作系统实验与实践:基于Windows与Linux[M].中国电力出版社,2004,4:第13-15页,第36-54页 2.
第三篇:编译原理 学习心得
国际学院 0802 杨良燕 200819100227
《编译原理》课程学习心得
《编译原理》是计算机专业的一门重要课程,正如教材
第一章的引论所述,“编译程序是现代计算机系统的基本组成部分之一”。“一个编译程序就是一个语言翻译程序,语言翻译程序把一种语言(源语言)书写的程序翻译成另一种语言(目标语言)的等价程序”。
通过这一学期的学习,我觉得编译原理是一门理论性很强的课程,从文法和语言的概念到LL(1)文法和LR(0)文法的分析,几乎都是对具体问题的抽象。因而,我们需要更多的时间来理解、掌握相关的知识,当然在这一过程中也存在很多问题,比如我们后期学习具体文法的分析方法时,对于文法的概念不够清晰,影响了上课的效率,知道老师再次给我们讲解了文法等基础的知识点,我们才慢慢掌握后面所学的LL(1)文法等,也发现了知识点之间的关联。此外,这门课程的课时被安排得很少,一周只有一次,这样很不利于我们对这门重要课程的理解和掌握。但是我觉得我们很幸运,因为老师在有限的课程中尽量将知识点以比较容易接受的方式给我们讲解,教我们用简单的方法理解记忆不同的知识,对于我们提出的问题,无论课上或是课外,老师一直是不厌其烦,甚至利用课余时间为我们讲解重要的难题。
编译原理这门课程不仅仅在于其本身的理论价值,更在于为我们解决问题提供的思维方式和方法。从LL(1)到LR(0),问题不断被解决的同时,又有一个个新的问题提了出来。对计算机语言世界的知识积累,像滚雪球一样越滚越大。这个逐渐递进,逐渐解决问题的过程对我来说是收获很大的。整个过程好像踏着前人研究编译理论的路线,不断感觉他们遇到的问题,更重要的是他们解决问题的思路。编译原理的课程带给我的不只是如何去编译程序这样的理论知识,相信更重要的是一种如何“自动计算”的思路。通过对相关编译问题的具体分析,让我体会最深的是一种“自动计算”的思想,同时完成编译试验后,更是感到了一种“自动计算”的快乐。”然而我明白自己虽然对编译有了一定的了解,我懂得了文法的分析,学会了构造确定和非确定有限自动机,学会了LL(1)文法和LR(0)文法等,但是并没有完全掌握,对于这些知识点的实质性和其他方面,更是认识不深。作为一名学习计算机科学与技术的学生,我明白编译原理是软件工程的基础,课程的结束并不意味着学习的结束,只有通过以后的学习,才能更深入地了解编译原理。
第四篇:编译原理实验报告
编译原理实验报告
报告完成日期 2018.5.30
一. 组内分工与贡献介绍
二. 系统功能概述;
我们使用了自动生成系统来完成我们的实验内容。我们设计的系统在完成了实验基本要求的前提下,进行了一部分的扩展。增加了声明变量类型、类型赋值判定和声明的变量被引用时作用域的判断。从而使得我们的实验结果呈现的更加清晰和易懂。
三. 分系统报告;
一、词法分析子系统
词法的正规式:
标识符
<字母>(<字母>|<数字字符>)* 十进制整数
0 |(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* 八进制整数 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和分隔符 +| * | / | > | < | = |(|)| <=|>=|==; 对于标识符和关键字: A5—〉 B5C5 B5—〉a | b |⋯⋯| y | z C5—〉(a | b |⋯⋯| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε 综上正规文法为: S—〉I1|I2|I3|A4|A5 I1—〉0|A1 A1—〉B1C1|ε C1—〉E1D1|ε D1—〉E1C1|ε
E1—〉0|1|2|3|4|5|6|7|8|9 B1—〉1|2|3|4|5|6|7|8|9 I2—〉0A2 A2—〉0|B2 B2—〉C2D2 D2—〉F2E2|ε E2—〉F2D2|ε
C2—〉1|2|3|4|5|6|7 F2—〉0|1|2|3|4|5|6|7 I3—〉0xA3 A3—〉B3C3 B3—〉0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f C3—〉(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)|C3|ε
A4—〉+ |-| * | / | > | < | = |(|)| <=|>=|==; A5—〉 B5C5 B5—〉a | b |⋯⋯| y | z C5—〉(a | b |⋯⋯| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε
状态图
流程图:
词法分析程序的主要数据结构与算法
考虑到报告的整洁性和整体观感,此处我们仅展示主要的程序代码和算法,具体的全部代码将在整体的压缩包中一并呈现
另外我们考虑到后续实验中,如果在bison语法树生成的时候推不出目标的产生式时,我们设计了报错提示,在这个词的位置出现错误提示,将记录切割出来的词在code.txt中保存,并记录他们的位置。
以下是我们的主要代码:
进制的识别:
结果展示:
二、语法分析子系统
根据选择的语法分析方法进行描述
我们使用了递归子程序发,并且对原有的产生式进行了改写,改写后的结果如下: P→LP1|L L→S
S→id=E|{P}|if C then S | if C then S
1else S2 | while C do S1 C→E1C’
C’→>E2| E→int8E’| int10E’| int16E’| idE’|T E’→+T|-T||+TE’|-TE’ T→int8T’| int10T’| int16T’| idT’|F T’→*F|/F|*FT’|/FT’ F→(E)|int8|int10|int16|id 简化的语法图: S的语法图: C的语法图: E的语法图: T的语法图: F的语法图: 流程图: 语法分析子系统的主要数据结构与算法 我们采用了自动生成技术,同样在这里也是展示主要的核心功能代码,全部的代码展示在压缩包中: 我们在设计时,实现了产生式对应的字符串同时标识产生式定义的int值 辅助程序: 生成语法树的程序: 1.树节点: 2.创建新节点 3.创建实数类型新节点 4.创建标识符类型新节点 5.输出语法树 三、三地址码生成器 算法的基本思想: 我们增加了声明变量类型、类型赋值判定和声明的变量被引用时作用域的判断。从而使得我们的实验结果呈现的更加清晰和易懂。 在报错的时候,我们会呈现类型、作用域和赋值三种的问题的报错信息。 流程图: 算法展示: 四、实验体会 这次实验其实总的来说是让我们更加清晰的理解到了我们所学的内容。有时候我们上课听讲,课下复习写作业的时候,其实看似掌握了所学内容,但实际上并没有亲身体会的操作很难让我们深刻的理解其中的相关意义。通过这次实验,我们能够从根源处了解到了我们所学的内容,并且基于我们理解之后的输出。比如词法分析不能采用空格来区分单词,因为存在加减乘除等运算符和分隔符,使用空格来区分可能会造成错误的分解。又比如我们再在程序设计中,常常体会到效率的重要性。影响词法分析的效率的主要因素是各个状态的分支如何规划。如果每个进来的单词都能在最短的时间和最少的匹配次数内找到其入口,则效率将得到很大程度上的提高。所以由此我们产生了声明变量类型、赋值和作用域的想法,将其放在最后来进行判断,这样可以提高整体的执行效率。 另外,这次小组成员彼此不在一个班级,这样从某一方面来说,也加强了我们互相快速熟识并团结协作的能力,有了这种体验,我想我们在今后的生活中,面对这种情况的时候,将会变得更加有经验。 五、源程序 词法分析器: 输入结果: 输出结果: 语义分析结果: 输入: 第二组数据的输入: 输出: 三地址码的输入: 第二组数据的输入: 输出: 课 程 设 计 报 告 设计题目:一个简单文法的编译器前端的设计与实现 班 级: 计算机1206 组长学号:201239 组长姓名:闫智宣 指导教师:李晓华 设计时间:2014年12月 [在此处键入] 设计分工 组长学号及姓名: 20123974 闫智宣 分工: 语法分析,四元式生成,目标代码优化及生成 组员1学号及姓名:20123977 廖峭 分工: 词法分析,错误处理 组员2学号及姓名:20123959 郭天龙 分工: 符号表生成,语义动作插入,操作界面[在此处键入] 摘要 编译原理课程设计是通过C语言编译器相关子系统的设计,进一步加深对编译器构造的理解;第一部分词法分析,设计各单词的状态转换图,并为不同的单词设计种别码,制作扫描器识别一个个单词,返回值为识别码的序号,返回Token序列。将词法分析器设计成供语法分析器调用的子程序。词法分析器具备预处理功能。将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;第二部分,语法分析,用递归下降法,实现对表达式、各种说明语句、控制语句进行语法分析。若语法正确,则用语法制导翻译法进行语义翻译;生成并打印出语法树;若语法错误,要求指出出错性质和出错位置(行号)。 我们还做了附加功能,即编译后端,有中间代码优化,生成目标代码汇编语言。通过此次课程设计,提高了我们的独立分析问题、解决问题的能力,以及系统软件设计的能力; 提高程序设计能力、程序调试能力,团结协作能力 关键词:词法分析,语法分析,四元式生成,错误处理,符号表生成,语义动作插入,中间代码优化,生成目标代码 [在此处键入] 目录 摘要 1.概述 2.课程设计任务及要求 2.1 设计任务 2.2 设计要求 3.算法及数据结构 3.1算法的总体思想(流程) 3.2 词法分析模块 3.2.1 功能 3.2.2 数据结构 3.2.3 算法 3.3 语法分析模块 3.3.1功能 3.3.2 数据结构 3.3.3算法 3.4 符号表模块 3.4.1功能 3.4.2 数据结构 3.4.3算法 3.5 四元式模块 3.5.1功能 [在此处键入] 3.5.2 数据结构 3.5.3算法 3.6 语义动作分析模块 3.6.1功能 3.6.2 数据结构 3.6.3算法 3.7 错误处理模块 3.7.1功能 3.7.2 数据结构 3.7.3算法 3.8 目标代码模块 3.8.1功能 3.8.2 数据结构 3.8.3算法 4.程序设计与实现 4.1 程序流程图 4.2 程序说明 4.3 实验结果 5.结论 6.参考文献。7.收获、体会和建议。 [在此处键入] 1.概述 编译器是将C语言翻译为汇编语言代码的计算机程序。编译器将源程序(source language)编写的程序作为输入,翻译产生目标语言(target language)机器代码的等价程序。通常地,源程序为高级语言(high-level language),C语言程序,而目标则是 机器语言的目标代码(object code),也就是可以在计算机硬件中运行的机器代码软件程序。这一过程可以表示为: 源程序→编译器 →目标机器代码程序 2.课程设计任务及要求 2.1设计任务 学生在学习《编译原理》课程过程中,结合各章节的构造编译程序的基本理论,要求用C#语言描述及上机调试,实现一个 C编译程序(包括词法分析,语法分析等重要子程序),使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。 2.2设计要求 要求: (1)设计词法分析器 设计各单词的状态转换图,并为不同的单词设计种别码。将词法分析器设计成供语法分析器调用的子程序。功能包括: a.具备预处理功能。将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序; b.能够拼出语言中的各个单词; [在此处键入] c.返回(种别码,属性值,行号)。 (2)语法分析 要求用学习过的自底向上或自顶向下的分析方法等,实现对表达式、各种说明语句、控制语句进行语法分析。若语法正确,则用语法制导翻译法进行语义翻译;生成并打印出语法树;若语法错误,要求指出出错性质和出错位置(行号)。 3.算法及数据结构 3.1算法的总体思想(流程) 本节主要分析程序的代码结构和代码工程文件的划分。(程序由几个类组成: Token类和Variable类SymbolTable类ObjectCode类Lexical类Grammar类Four_Yuan类Action类ErrorItem类,分别为词法分析和语法分析类。工程分为几个文件:Form1.cs,Token.cs,Variable.cs,SymbolTable.cs,ObjectCode.cs,Lexical.cs,Grammar.cs,Four_Yuan,cs,Action.cs,ErrorItem.cs分别对应Token类和Variable类SymbolTable类ObjectCode类Lexical类Grammar类Four_Yuan类Action类ErrorItem类的声明和实现文件)。本程序采用C#语言以面向对象的思想编写,程序分为几部分:词法分析(Lexical),语法分析(Grammer),目标代码生成(ObjectCode)。Lexical类主要的工作是词法分析获取Token。Grammer类的主要工作是根据Lexical类词法分析之后的Token进行语法分析,生成语法树,最后并输出语法树。在处理过程中,Token类的对象作为Lexical类的一个成员变量,配合Grammer类进行语法分析。 工程文件总体上是按照九个类的格局分为十个文件,分别是九个类的声明文件和实现文件。十个文件为Form1.cs,Token.cs,Variable.cs,SymbolTable.cs,ObjectCode.cs,Lexical.cs,Grammar.cs,Four_Yuan,cs,Action.cs,ErrorItem.cs,他们分别是Lexical类声明文件、Lexical类实现文件、Grammer类声明文件、Grammer类实现文件。[在此处键入] 程序流程 在程序中,Lexical类的对象(Token)作为Grammer类中的一个成员变量,配合Grammer类进行语法分析。它们的关系是这样的:Grammer类的一个成员变量temp首先对源程序删除注释,然后进行词法分析获取所有Token,并将获取的Token存储在Token对象的tokenList(List类型)中。然后Grammer类的语法分析程序就根据tokenList中的Token进行语法分析,生成语法树,最后打印语法树。同时,这也是程序的流程。[在此处键入] 3.2 词法分析模块 3.2.1功能 Lexical类主要的工作是词法分析获取Token序列。 3.2.2数据结构 词法分析阶段的代码被封装成一个类——Lexical,Token中主要是Lexical类的声明代码,Lexical.cs中主要是Lexical类的实现代码。Lexical类对外提供的函数主要有: static public int RecogId(string str, int i),static public int RecogDig(string str,int i),static public int RecogOperator(string str, int i),static public int RecogBound(string str, int i),以上几个函数构成了词法分析的骨架,在Lexical类中还有其他成员变量和函数,主要作为这三个函数处理过程的中间步骤,为这三个函数服务。Lexical类的代码结构和主要的成员变量和函数及其含义如下图所示: 3.2.3算法 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是[在此处键入] 根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 主程序示意图: 主程序示意图如图3-1所示。 ⑴ 关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。 (2)程序中需要用到的主要变量为type和number 扫描子程序的算法思想: 首先设置3个变量: [在此处键入] ①token用来存放构成单词符号的字符串; ②number用来整型单词; ③type用来存放单词符号的种别码。 Token定义 Token定义: Token类型(TokenType): 3.3 语法分析模块 3.3.1功能 语法分析是编译过程的一个逻辑阶段。语法分析的功能是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.3.3.2 数据结构 下图为实现语法分析的类Grammar,属性与方法的作用都已说明 在此处键入] 3.3.3算法 1.文法 下面终结符与非终结符意义 B程序开始 Z 数据类型,如int,char,float等 V 标识符 S 语句 P 语句块 E 加减算术表达式 D 逗号表达式 T 乘除算术表达式 C 关系表达式 L 逻辑表达式 Q 标识符或圆括号 e 表示空 i 表示标识符 a)函数文法 B----ZV()S [ [在此处键入] b)语句块文法 P----SP|e S----{P} c)语句文法 表达式语句文法 S----V=E goto语句文法 S----i:S S----goto i if语句文法 S----if(E)S[else S] while语句文法 S----while(E)S 声明语句文法 S----ZVD D----,VD|=ED|e d)表达式文法 E----T|E+T|E-T T----F|T*F|T/F C----C|C L----Q|L&&Q|L||Q Q----i|(E)|!Q 2.递归下降程序流程图 对应于每个文法编写如下递归下降子程序 主程序(B)[在此处键入] [在此处键入] 3.4 符号表模块 3.4.1功能 进行符号表的储存,添加,更新,查找,保存标识符活跃信息以及输出。3.4.2 数据结构 在此处键入] 3.4.3算法 3.5 四元式模块 3.5.1功能 四元式为中间代码,编译程序进行完语义分析后,先生成中间代码作为过渡,此时中间代码与目标代码已经比较相似 3.5.2 数据结构 [ 在此处键入] 3.5.3算法 3.6语义动作分析模块 3.6.1功能 在语法分析中嵌入相应的语义动作,生成四元式 3.6.2 数据结构 [ [在此处键入] 3.6.3算法 GEQ(+)(-)(*)(/) (+,i1,i2,t)PUSH(i)ASSI(=) (=,t,_,POP)LABER(i) (lb,_,_,i)GOTO(i) (gt,_,_,i)IF(if) (if,a,_,_)EL(el) (el,_,_,_)IE(ie) (ie,_,_,_)WH() (wh,_,_,_)DO() (do,a,_,_)WE(we) (we,_,_,_) 3.7 错误处理模块 3.7.1功能 保存运行时发现的错误,储存行号已经详细信息并输出。 3.7.2 数据结构 3.7.3算法 [在此处键入] public static void AddErrorMessage(int lineno,string content)函数用作在发现错误时保存错误信息以及行号。 public static string PrintErrorList()把所有发现的错误格式化后统一输出。 错误信息在语法分析,语义分析,符号表检错中添加。3.8 目标代码模块 3.8.1功能 目标代码生成把优化后的中间代码变换成目标代码,此处的目标代码为汇编代码,采用单寄存器生成目标代码 3.8.2 数据结构[在此处键入] 3.8.3算法 对于一个基本块有如下流程图 W:操作符,B:第一操作数,C:第二操作数,R:寄存器 5.结论 网上找一段话抄上 [在此处键入] 6.测试 测试打开文件 测试保存文件 如果没打开文件,直接敲代码,点保存时会弹出另存为窗口[在此处键入] 测试错误检测,程序缺少main函数的类型,错误列表中显示第一行函数缺少错误类型。 测试错误检测,程序缺少分号,错误列表中显示该行缺少语句结束标志';' 单击错误列表,会自动选定错误行 编译成功,生成并显示token串、符号表、四元式与目标代码 [在此处键入] 测试if与while语句,而且while嵌套在if当中 测试goto语句,结果正确。[在此处键入] 测试优化,输入课件中的代码,结果与课件一样 6.参考文献。 1、陈火旺.《程序设计语言编译原理》(第3版).北京:国防工业出版社.2000.2、美 Alfred V.Aho Ravi Sethi Jeffrey D.Ullman著.李建中,姜守旭译.《编译原理》.24 [在此处键入] 北京:机械工业出版社.2003.3、美 Kenneth C.Louden著.冯博琴等译.《编译原理及实践》.北京:机械工业出版社.2002.4、金成植著.《编译程序构造原理和实现技术》.北京:高等教育出版社.2002.7.收获、体会和建议。 直接拷贝好歹也检查一下错误 对于编译原理的这次课程设计,自己经历了从刚开始的不懂明白任务的要求和内容理论知识的了解开始着手写代码完成基本功能根据DFA及自顶向下等理论修改完善代码等这些过程。 自己着手写词法分析的时候还不清楚词法分析的任务内容,还不知道词法分析的结果是什么,词法分析出错的情况和类型有哪些,也总是将词法分析和语法分析混在一起,不明白哪些错误在词法分析中报,哪些错误在语法分析中判断,后来经过查书、网上资料、请教同学等途径逐步清晰了词法分析的工作内容是从源代码文件中获取出Token,供语法分析使用。在充分了解了语法分析需要哪些信息时,我才真正了解了词法分析的工作内容和目标,才知道词法分析需要完成哪些任务获取到哪些信息。充分了解了词法分析的任务之后,就开始理论知识的学习。经过揣摩书上的例子,自己理解和掌握了怎么设计过滤注释和分析程序中Token的DFA,于是开始根据设计好的DFA进行编码,最后经过调试已经可以正确地完成词法阶段的任务了。这只是词法分析的原始代码,在之后还进行了两次彻底的改动。虽然之前写的词法分析的代码已经完成了词法分析的需求,也是根据DFA的原理编写的,但是在代码结构上却难以体现,在对书上的根据已知DFA写代码的例子进行了详细的研究之后,发现自己的代码并没有像书上那样完全按照所依据的DFA各状态转移的关系进行编写,所以对代码进行了重写,像书上一样严格按照状态之间转移的方式进行编写,将状态划分成11个状态,状态分别按1~11进行标注,程序也按照DFA来编写,也实现了词法分析的功能。再后来写报告的时候,发现分析出Token的那个DFA并不是最简的,有很多多余的状态,完全可以用一个flag标志来标识,从而简化代码结构,于是又重写了一次词法分析函数scan()的代码,将状态缩减为5个,且不再用1-5来表示,而是像书上那样分别取了名字(START、INNUM、INID、INDBSYM、DONE),同时为了简化代码将输出Token到文件的部分从scan()中剥离开来,而在Lexical类中加了一个printToken()的函数,使scan()函数逻辑更加清晰,使读者能够容易地将代码与DFA进行查看比照。 在写语法分析的时候,已经对编译器的语法分析的内容有了一定的了解,所以直接进行了理论的学习。首先自己对递归向下分析法进行了学习,将书上的几个递归向下分析的伪代码看过之后,自己对递归向下的分析方法的原理有了初步的认识,大概知道了根据文法怎么分析,但是对于如何编写代码却还在此处键入] 是难以下手,于是就对照TINY语言的文法看了几遍书后面的TINY语言的递归向下分析的语法分析程序,这样就基本知道了C-语言的语法分析程序怎么写。由于C-语言给出的文法有左递归存在,于是自己将存在左递归的文法改写成EBNF的形式,并据此进行代码编写。由于在编写代码的过程中需要确定分析是否正确或选择多个文法中的某一个文法进行分析,有时必须探测需要的或下一个Token的类型,在这种情况下需要求First集合,在推导中若存在empty,又需要求Follow集合,所以这样又需要我了解First集合和Follow集合,自己在程序中也根据求出的First集合和Follow集合进行判断,以确定程序的走向。在编写过程中,还有一类问题,就是存在公共左因子,如文法expression→ var = expression | simple-expression,左因子为ID,在分析过程中,由于已经取出了一个ID的Token,且生成了一个IdK的节点,但是在当前状态无法确定是哪一个推导,然而IdK节点已经生成,又无法回退,并且是使用自顶向下的分析方法,已经生成的IdK在程序上方无法使用,自己通过查阅资料等途径的学习确定了在这种情形下的处理方式:将已经生成的IdK节点传到下方的处理程序,所以TreeNode * simple_expression(TreeNode * k)、TreeNode * additive_expression(TreeNode * k)等函数都被设计成有节点类型参数的函数,目的就是将已经生成的节点传到下面的分析函数中去。 通过这次的编译原理课程的学习和实践,自己获益良多。首先最基本的成果是完成了课程设计的任务,实现了编译器的词法分析和语法分析阶段的功能,词法分析主要能过滤注释、分析出语法分析阶段需要的Token并满足语法阶段的所有要求,能够判别词法分析阶段是否出错和出错类型和位置。语法分析主要能根据递归向下的分析思想和C-文法对词法分析获取的Token进行语法分析,能够构造出语法树,能够判别语法分析过程中是否出错以及出错位置和错误类型。 由于在编写程序过程中,涉及到了正则表达式、DFA、提取公共左因子、消除左递归、EBNF、求First集合和Follow集合、递归向下分析方法以及编程语言方面的知识,所以,通过本次的课程设计的实践,使得自己对编译原理这门课的许多知识点有了更加深刻和具体的理解,而不再只限制于做题。此外,对以前那些已掌握的知识有了温习和动手锻炼的机会。如:以前在编译原理课上虽然知道First集合和Follow集合怎么求的,却不知道First集合和Follow集合到底是干什么的,通过编写程序自己明白了他们的实际作用,使得自己不仅知其然还知其所以然,从而使得自己加深了对知识点的理解和掌握。由于以前编写代码都是使用JAVA语言,所以C/C++很多内容都忘记了,通过本次的实践,自己又重新拾起了以前的知识。此外,由于在做报告的时候,需要描绘DFA和程序流程图,使得自己初步掌握了使用visio和word画图的能力。此外,对于文档的编写和美化自己也获得了许多有用的经验。[第五篇:编译原理课程设计