(黑龙江大学)编译原理读书工程_编译原理读书工程
(黑龙江大学)编译原理读书工程由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“编译原理读书工程”。
黑龙江大学
“编译原理课程设计”读书报告
学院 年级 专业 学号 姓名 报告日期 成绩
计算机科学与技术学院 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.