编译原理实验指导书

合集下载

编译原理实验指导书

编译原理实验指导书

编译原理实验指导书计算机学院实验1 词法分析程序一、实验目的构造simple语言的词法分析程序,程序要求能对输入的字符串流进行词法分析。

在实验的过程中,学会应用单词分析的方法——NFA(非确定有穷自动机)和DFA(确定有穷自动机),加深对词法分析原理的理解。

二、实验内容编写为任一正则文法(见实验参考(一)simple惯用的词法)构造非确定有穷自动机NFA并转换成确定有穷自动机DFA,并对任给的一个输入串(见实验参考(二)测试用输入串)进行词法分析的程序,程序的输出为单词的序列(见实验参考(三)程序输出形式)。

三、实验参考(一)simple 惯用的词法1. 下面是语言的关键字:Begin if then while do end所有的关键字都是保留字,并且必须是小写。

2. 下面是专用符号::= + * / < <= <> > >= = ; ( ) #3. 其他单词是标识符(ID)和整型常数(NUM),通过下列正规式定义:ID = letter(letter| digit)*NUM = digit digit*letter = a |…| z | A |…| Zdigit = 0 |…| 9小写和大写字母是有区别的。

思考:构造实数的正规表达式,力争实现对实数的识别及表示。

4. 空格由空白、换行符和制表符组成。

空格一般用来分隔ID、NUM、运算符和关键字,词法分析阶段通常被忽略。

5. 各种单词符号对应的种别码如下表所示:(二)词法分析程序的功能1. 输入为所给文法的源程序字符串。

2. 程序的输出形式为单词串的输出形式。

所输出的每一单词,均按形如(syn,token和sum)的二元式编码。

其中,syn 为单词种别码;token为存放的单词自身字符串;sum为整型常数。

3.测试源程序片断:begin x:=9; if x>0 then x:=2*x+1/3;end #。

编译原理实验指导书

编译原理实验指导书

陕西理工学院数学与计算机科学学院《编译原理》实验指导班级网络10级指导教师曹阳计算机工程教研室2012年8月25日编译原理实验指导书一、实验的目的《编译原理》是针对计算机专业的学生开设的一门专业基础课程,对引导学生进行科学思维和提高学生解决实际问题的能力有重要的作用。

开设“编译原理实验”的主要目的是让学生加深理解编译原理的基本理论、方法、词法分析、语法分析、中间代码的生成直到最后的代码生成,了解编译器原理,从而提高学生分析问、题解决问题的能力。

通过实验实现以下基本目标:1.深化已学的知识,完成从理论到实践的转化通过实验,进一步加深对编译原理基本思想、原理的了解。

2. 提高分析和解决实际问题的能力实验不仅是编译原理的一次模拟训练,同时通过实验,积累经验,提高分析和解决问题的能力。

3.培养“开拓创新”能力大力提倡和鼓励在程序中使用新方法,新技术。

激发学生实践的积极性与创造性,开拓思路,设计新算法,进行新创意,培养创造性能力。

二、参加实验的学生应具备的条件参加实验的学生应当具备计算机程序设计的一些基础的知识。

即学生应当熟练掌握和使用一种计算机操作系统(windows操作系统等)、一种程序设计语言(vb、vc、c、delphi等)。

三、实验要求实验的要求体现于整个工作的各个阶段中,可根据所选课题的特点而有所侧重,但应达到如下的基本要求:(1) 根据课题任务制定合理、可行的工作计划任务;(2) 制定适当的技术方案;(3) 学生在老师的指导下独立完成设计过程;(4) 撰写实验报告(包括实验内容中各个阶段所要求的文字材料);(5) 通过实验检查评定;四、实验项目与内容提要五、实验课程考核办法1、该实验课程考核成绩按百分制计算,满分为100分,60分为及格,60分以上者可获取该学分。

2、该实验课考核由三部分组成:实验课前预习(20%),实验操作(60%),实验报告(20%)。

3、各部分成绩由实验指导教师在每个实验项目完成后分别给出,在学期结束后或完成全部实验项目后综合给出该门实验课的成绩。

学生用-编译原理实验指导书

学生用-编译原理实验指导书

实验一无符号数的有穷自动机的实现(一)实验目的无符号数的有穷自动机的实现目的是使学生掌握文法的形式描述,穷自动机的概念。

将文法转换成有穷自动机的方法,理解出错处理程序思想,如何用状态矩阵实现一个穷自动机的机内表示。

(二)实验内容1.无符号数的BNF描述(0)<无符号数> → d <余留无符号数> | . <十进制数> | e <指数部分>(1)<余留无符号数>→d <余留无符号数> | . <十进制数> | e <指数部分>|ε(2)<十进制小数> → d <余留十进制小数>(3)<余留十进制小数> e <指数部分> | d <余留十进制小数> | ε(4)<指数部分> → d <余留整指数> | + <整指数> | - <整指数>(5)<整指数> → d <余留整指数>(6)<余留整指数> → d <余留整指数> | ε2.将G[<无符号数>]文法转换成有穷自动机。

3.构造状态矩阵;将有穷自动机的状S1 S2 ……Sn及输入的字a1 a2 ……am 构成一个n*m的矩阵。

4.用状态矩阵设计出一个词法分析程序。

5.扫描无符号数,根据文法给出无符号数出错的位置。

(三)实验要求1.学生课前要认真阅读实验指导,理解实验内容与相关理论知识的关系,并完成预习报告2.用C语言或其它高级语言编写程序3.写出实验报告实验二语法制导把表达式翻译成逆波兰式(一)实验目的进一步掌握语法制导翻译的概念,理解中间语言,设计出错处理程序方法,掌握把表达式翻译成中间语言的算法。

(二)实验内容1.从左到右扫描中缀表达式,经语法分析找出中缀表达式出现的错误并给出错误的具体位置和类型。

编译原理—实验指导书-1

编译原理—实验指导书-1
(13)end.#
4.词法分析器的功能和输出格式
词法分析器的功能是输入以字符串表示的源程序,从左向右扫描每行源程序的符号,拼成单词,换成统一的二元式(单词种别码,单词符号的属性值)表示。对给定的程序通过词法分析器识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示,本程序是通过对给定路径的文件的分析后以单词符号和文字提示显示),本实验中,采用单词种别码是一符一种种别码的方式。
(4)var
(5)a,b,c:integer;
(6)x:char;
(7)begin
(8)if(a+c*3>b)and(b>3)thenc:=3;
(9)x:=2+(3*a)-b*c*8;
(10)forx:=1+2to3dob:=100;
(11)whilea>bdoc:=5;
(12)repeata:=10;untila>b;
(124){
(125)printf("%s\t$运算符\n\n",Word);
(126)}
(127)else if(ch=='-')
(128){
(129)printf("%s\t$运算符\n\n",Word); //判断结果为“--”
(2)设计描述Sample语言各类单词结构的状态转换图(即有限自动机FA);
如标识符的状态转换图可以用下图表示
其相应代码科为
(1)recog_id(char ch)
(2){
(3)char state='0';
(4)while(state!='2')
(5){
(6)switch(state)

编译原理实验指导书

编译原理实验指导书

编译原理实验指导书第1节概述1、本课程实践的目的和任务编译原理是一门实践性很强的课程,只有通过实践,才能真正掌握。

实际的编译程序是十分复杂的,有时由多达十几万条指令组成。

为此,编译原理的实践教学,采用简化编译过程的办法,选择最关键的3个环节──词法分析、语法分析(包括语义处理、产生无优化的目标指令)、连接调试,进行编程和调试训练。

每个环节作为一个实践课题。

2、实践方法任何一个实用的高级语言,其语法都比较复杂,如选其作为源语言,很难实践全过程。

故本实践将定义一个简化的语言──PASCAL语言的一个子集作为源语言,也可以自行定义一个简单的C语言子集,在3个题目中选择两个题目,也可以自行选择与编译技术相关的实验题目,设计调试出它的编译程序。

前后贯穿这一条主线进行实践。

每次都可利用课余时间编程,利用上机时间进行输入和调试。

建议使用C或C++或JAVA语言。

3、实践报告的规范和要求每个课题完成后写出实践报告。

实践报告包括程序设计时考虑的算法和方法;调试过程中出现的问题和解决的措施;提交电子版的程序清单和调试时所用的源程序。

4、简化的PASCAL语言子集的定义〈PASCAL子集程序〉→〈变量说明〉〈分程序〉。

〈变量说明〉→〈空〉|VAR〈变量表〉:INTEGER;〈变量表〉→〈变量〉|〈变量〉,〈变量表〉〈变量〉→〈标识符〉〈分程序〉→BEGIN〈语句组〉END〈语句组〉→〈语句〉|〈语句〉;〈语句组〉〈语句〉→〈赋值语句〉|〈条件语句〉|〈WHILE语句〉|〈分程序〉〈赋值语句〉→〈变量〉:=〈算术表达式〉〈条件语句〉→IF〈布尔表达式〉THEN〈语句〉ELSE〈语句〉〈WHILE语句〉→WHILE〈布尔表达式〉DO〈语句〉〈算术表达式〉→〈项〉|〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉〈项〉→〈初等量〉|〈项〉*〈初等量〉|〈项〉/〈初等量〉〈初等量〉→〈无符号数〉|〈变量〉|(〈算术表达式〉)〈关系表达式〉→〈算术表达式〉〈关系运算符〉〈算术表达式〉〈标识符〉→〈字母〉|〈标识符〉〈字母〉|〈标识符〉〈数字〉〈无符号数〉→〈数字〉|〈无符号数〉〈数字〉〈关系运算符〉→〈|〈=| =| 〉=| 〉|〈〉〈字母〉→ A│B│C│D│E│F│G│H│I│J│K│L│M│N│O│P│Q│R│S│T││U│V│W│X│Y│Z〈数字〉→ 1│2│3│4│5│6│7│8│9│0第2节词法分析本节进行词法分析程序的编程与调试。

编译原理实验指导书

编译原理实验指导书

《编译原理》实验指导书别小川于枫编写适用专业:计算机科学与应用江苏科技大学电子信息学院2005年2月前言《编译原理》是计算机专业的一门核心课程,在计算机本科教学中占有十分重要的地位。

由于《编译原理》课程兼有很强的理论性和实践性,并且编译程序构造的算法比较复杂,因而让学生在学习时普遍感到内容抽象、不易理解,难易掌握。

但是掌握编译原理的基本理论和设计思想是非常重要的,尤其是将本课程的理论知识与计算机应用中的许多领域紧密联系与广泛应用结合。

将有利于学生提高专业素质和适应社会多方面需要的能力。

因此,通过理论授课和上机实践,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地加以运用。

通过实验逐步提高学生的编程能力和调试程序的能力以及解决实际问题的能力。

使学生培养出扎实的软件开发基本技能,并养成良好的编程风格,为进一步学习后续课程和将来从事应用软件开发奠定良好的基础。

实验课时具体内容安排如下:一、实验课的性质和目的(1)深刻理解程序语言编译系统的结构及各部分的功能。

(2)熟练掌握设计和构造程序语言编译系统的基本原理和技术。

(3)能独立编写清晰、工整、结论正确的编译原理的源程序。

(4)能学会上机进行正确调试,并进行程序修改。

即培养发现程序错误,排除错误的能力和经验。

二、实验课的基本要求:(1)掌握编译程序的功能和结构。

(2)掌握词法分析器的设计方法与实现步骤加深对讲授内容的理解,尤其是一些语法给定,通过上机实验帮助掌握。

(3)掌握语法分析器的设计方法与实现步骤。

(4)掌握符号表和存储空间的组织。

(5)掌握代码优化的作用与实现方法(6)掌握错误的诊断和校正方法。

三、主要实验教学方法实验前,由任课教师落实实验任务,每个学生必须事先独立完成好程序的设计的源程序编写工作。

实验课上对疑难点作集中辅导。

实验过程中随时针对不同的情况作个别启发式辅导。

实验后,学生撰写并提交实验报告。

最后,由实验教师根据每个学生的编程、上机调试能力、编程能力和实验结果及实验报告综合评定学生的实验成绩。

《编译原理》实验指导书

《编译原理》实验指导书目录编译原理一共开设了三个实验,它们是:1.词法分析程序,占2个学时2.语法分析程序,占2个学时3.扩充的PL/0分析程序(综合实验),占6个学时。

实验报告格式1.姓名班级学号2.实验名称3.实验目的4.实验要求5.实验内容(这个是实验报告的主要部分)6.实验总结(实验心得)7. 实验报告人报告时间实验一 PL/O语言的词法分析程序GETSYM过程GETSYM的说明:由于一个单词往往是由一个或几个字符组成,所以在词法分析过程GETSYM中又定义一个取字符过程GETCH,由词法分析需要取字符时调用。

实验目的:1.为了更好的配合《编译原理》有关词法分析章节的教学2.加深和巩固学生对于词法分析的了解和掌握3.让学生初步的认识PL/0语言的基础和简单的程序编写4.学生通过本实验能够初步的了解和掌握程序词法分析的整个过程5.提高学生的上机和编程过程中处理具体问题的能力实验要求:1.做本实验之前要先阅读完总体的预备知识以及本实验相关的基础知识2.实验要求自己独立的完成,不允许抄袭别人的实验结果3.编写和调试过程中出现的问题最好做一下记录4.实验程序调试完成后,用给定的PL0测试程序(test.pl0)进行测试,由老师检查测试结果,并给予相应的成绩5.实验完成后,要上交实验报告。

实验内容:1.阅读所给出的词法分析程序(pl0_lexical.c),搞懂程序中每一个变量的含义,以及每一个过程的作用,并在该过程中进行中文注释。

2.阅读完程序后,画出各过程的流程图。

3.给出的程序包含两处输入错误,利用所给的pl/0源程序(test.pl0)对程序进行调试,使其能正确对所给文件进行分析并能够解释运行。

4.在阅读懂所给出的词法分析程序后,将你对词法分析的理解写在实验报告上。

实验环境:1.操作系统为Windows 2000或Dos6.2以上2.应用软件为Pascal或C语言GETCH 所用单元说明:CH :存放当前读取的字符,初值为空,LINE:为一维数组,其数组元素是字符;界对为1:80。

《编译原理》实验指导书(程细柱)

前言“编译原理”课程是计算机本科专业的必选课程,上机实验是该课程的重要环节,应开实验数约为12学时。

一个编译程序把源程序翻译成等价的目标程序,一般应做词法分析、语法分析、语义分析、代码生成和代码优化等五个方面的工作,为了使学生对其有较深的理解,必须根据这五个方面设计实验。

本指导书正是根据课程的内容,将实验分为前期准备阶段、基本操作阶段和技术提高阶段三个阶段进行:①前期准备阶段的实验主要是为后续实验做好准备,应围绕编译原理课程进行设计,如:学生可根据教科书的内容,设计一个源程序的输入和扫描程序,并完成相应的设计报告;②基本操作阶段的实验是围绕着编译原理的五个方面的工作来进行,其内容主要是词法分析、语法分析、语义分析、代码生成和代码优化等,如:简单的词法分析程序、LL(1) 分析法算法、语义分析程序、中间代码和目标代码生成算法的实验,这些实验基本上包括了以上知识要点,学生可结合书本上有关的知识来完成;③技术提高阶段的实验是综合性课程设计实验,根据编译原理编制应用程序,不仅要求把书本上的内容掌握好,同时还需要自学一些相关的知识。

1目录第1章实验的一般知识 (3)1—1 软件实验室规则及安全守则 (3)1-2 实验条件 (3)1—3 实验的基本要求 (3)第2章实验技术及原理 (3)第3章实验项目 (4)实验一:源程序的输入和扫描(2学时) (4)实验二:词法分析算法(2学时) (6)实验三:LL(1) 分析算法(2学时) (8)实验四:语义分析算法(2学时) (11)实验五:中间代码生成算法(2学时) (14)实验六:目标代码生成算法(4学时) (14)实验七:“编译原理”课程设计(8学时) (14)附录:实验报告示例:有限自动机的运行实验 (16)参考文献:《编译原理》吕映芝、张素琴、蒋维杜等主编清华大学出版社《编译原理与实现》..金成植编高教出版社《编译程序设计原理》..杜淑敏王永宁编北大出版社2第1章实验的一般知识1—1 软件实验室规则及安全守则见《软件实验室规则及安全守则》)。

编译原理实验指导书(-).docx

编译原理实验指导书合肥学院计算编译原理实验指导书实验一词法分析一、实验目的:通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。

并掌握在对程序设计语言源程序进行扫描过程屮将其分解为各类单词的词法分析方法。

编制一个读单词过程,从输入的源程序中,识別出各个具有独立意义的单词, 即基木保留字、标识符、常数、运算符、分隔符五大类。

并依次输出各个单词的内部编码及单词符号自身值。

(遇到错误时可显示“Error”,然后跳过错误部分继续显示)二、实验预习提示1、词法分析器的功能和输出格式词法分析器的功能是输入源程序,输出单词符号。

词法分析器的单词符号常常农示成以下的二元式(单词种别码,单词符号的属性值)。

本实验中,采用的是一类符号一种别码的方式。

2、单词的BNF表示<标识符> -V字母〉v字母数字串〉V字母数字串一V字母〉V字母数字串>|v数字〉V字母数字串〉Iv下划线>v字母数字串I e<无符号整数一V数字〉v数字串〉V数字串〉一V数字〉V数字串〉v加法运算符>-+<减法运算符〉->・V大于关系运算符>->>V大于等于关系运算符>-> =3、“超前搜索”方法词法分析时,常常会用到超前搜索方法。

如当前待分析字符串为“”,当前字符为此时,分析器倒底是将其分析为犬于关系运算符还是犬于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。

超前读了一个字符所以要回退一个字符,词法分析器才能正常运行。

在分析标识符,无符号整数等时也有类似情况。

4、模块结构Y饗冲区扫播一个辛閒N ▼三、实验过程和指导:(-)准备:1・阅读课木有关章节,明确语言的语法,写出基木保留字、标识符、常'数、运算符、分隔符和程序例。

2 .初步编制好程序。

3•准备好多组测试数据。

(二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。

第二次上机调试通过。

(三)程序要求:程序输入/输出示例:如源程序为C语言。

输入如卜•一段:main(){int a,b;a = 1 0;b = a 4- 20;}要求输出如下图。

《编译原理》实验指导书

编译原理实验报告班级:计134班姓名:***学号:******实验一词法分析程序设计与实现一、实验目的通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符流形式的源程序转化为一个由各类单词序列的词法分析方法。

二、基本实验内容与要求假定一种高级程序设计语言中的单词主要包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法分析程序(各类单词的分类码可参见表1)。

输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。

输出:把所识别出的每一单词均按形如(CLASS,V ALUE)的二元式形式输出,并将结果放到某个文件中。

对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;V ALUE字段则是该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,V ALUE字段则为“空”。

表1 语言中的各类单词符号及其分类码表要求:1、上机前完成词法分析程序的程序流图,并选择好相应的数据结构。

2、用于测试扫描器的实例源文件中至少应包含两行以上的源代码。

3、对于输入的测试用例的源程序文件,词法正确的单词分析结果在输出文件中以二元式形式输出,错误的字符串给出错误提示信息。

例如,若输入文件中的内容为:“if myid>=1.5E−2+100 then x:=y”,则输出文件中的内容应为:(IF,)(ID,’myid’)(GE,)(UCON,0.015)(PL,)(UCON,100)(THEN,)(ID,’x’)(IS,)(ID,’y’)三、实现方法1、一般实现方法说明词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。

其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式(例如可用C语言)构造词法分析程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理实验指导书(第2版)敬茂华编著前言编写本书的主要目的是为计算机专业的学生学习编译原理课程的实验及课程设计等环节提供一本适用的实验指导手册。

编译原理和技术作为计算机科学研究和工程应用的基础,受到了广泛的重视。

特别是在当今计算机体系结构正处于从32位向64位跨越的时代,除了硬件本身的革命性设计之外,要想充分发挥64位硬件计算平台的效率并以此提高应用软件的性能,编译器作为现代计算机中最重要的系统软件之一,其本身的作用是非常重要并无可替代的。

因此,编译原理也是大学计算机专业的必修课程,编译器的原理与设计是计算机专业学生所必须学习和掌握的一门非常重要的专业基础课。

编译原理作为计算机专业的专业基础理论课程,是一门不但理论性非常强而且实践性也很强的课程。

课堂教学大多从形式语言、编译过程、相关理论方法等方面入手,理论性较强,相对来说比较抽象,学生不容易掌握。

所以,最好的学习方法是通过实践来理解、掌握和加深所学的内容。

在教学环节中开设编译原理实验及课程设计课程,能够使学生更加深入地理解和认识编译原理中所涉及到的众多算法的基本思想和基本实现思路,更好地掌握一些相关的理论知识,进一步培养系统地工程化的编程思想和程序设计方法,能够熟练地利用各种数据结构进行高级语言的程序设计,掌握使用有效的调试测试工具调试测试程序的技能和技巧,从而帮助学生有效地学好编译原理课程的同时更好地增强自己的专业技术知识。

而遗憾的是,在编译原理课程的教学过程中往往不得不偏重于理论介绍而忽视了实验环节,使得学生很难真正掌握这门学科的精髓。

本书弥补了这一缺陷,可以作为讲授编译理论的配套教材来使用。

本书在第1版的基础上,对内容的选取和组织进行了调整,更多地注意了实验内容的连贯性、整体性和独立性,以适合各种不同的教学和自学情况,同时还针对具体的题目给出了课时建议,使用者可以根据实际情况具体进行选择和安排。

本书可以作为编译原理课程的实验教程,同时也可以作为学生在课余时间进行编译原理相关实践的参考书。

本书的编写得到了作者家人以及同事的全力支持。

另外,高景生同学协助进行了文字上的修改和校对,在这里对他们为本书所作的工作表示由衷的感谢。

由于我们学识浅薄,编写时间仓促,肯定会有错误或不妥之处,请读者批评和指正。

编者2007年7月目录前言 (I)1 绪论 (1)1.1学习编译原理课程的意义和方法 (1)1.1.1 学习编译原理课程的意义 (1)1.1.2 学习编译原理课程的方法 (2)1.2学习编译原理实验课程的意义与方法 (5)1.3本文的组织结构 (7)2 基础知识 (8)2.1程序设计语言 (8)2.1.1 程序设计语言的发展 (8)2.1.2 翻译程序 (9)2.2编译程序逻辑模型 (10)2.3与编译器有关的程序 (13)2.4编译程序中常用的数据结构 (16)2.5编译原理与软件工程 (17)实验1:利用软件工程的思想书写软件文档 (19)3 词法分析程序 (20)3.1词法分析与语法分析的关系 (20)3.2词法分析程序的任务 (21)实验2:词法分析程序的设计与实现 (23)3.3LEX工具简介 (24)实验3:词法分析程序自动构造器LEX的使用 (26)4 语法分析程序 (27)4.1确定的自顶向下分析法 (27)4.1.1 递归子程序法 (28)实验4:递归子程序分析器的设计与实现 (29)4.1.2 LL(1)分析法 (30)实验5:LL(1)分析总控程序的设计与实现 (31)4.2自底向上分析法 (33)4.2.1 自底向上优先分析法 (33)实验6:简单优先分析程序的设计与实现 (34)实验7:算符优先分析程序的设计与实现 (35)4.2.2 LR类分析法 (36)实验8:LR(0)分析总控程序的设计与实现 (37)4.3语法分析程序自动构造工具Y ACC (38)实验9:语法分析程序的自动构造工具Yacc的了解和使用 (39)5 代码生成 (41)5.1中间代码形式及生成 (41)实验10:将算术表达式翻译成逆波兰表示形式的中间代码 (42)5.2目标代码形式及生成 (42)实验11:PL/0语言的目标代码生成程序的设计与实现 (44)附录 (45)附录A:PL/0语言的定义 (45)附录B:部分源代码 (53)1、词法分析 (53)2、递归向下分析 (60)3、LL(1)分析程序 (69)4、LL(2)分析程序 (75)5、逆波兰式 (81)6、LR(1) (85)参考文献 (90)1 绪论1.1 学习编译原理课程的意义和方法1.1.1 学习编译原理课程的意义编译原理这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边。

计算机科学与技术专业的很多同学甚至是已经走上工作岗位的毕业生都有这样的一个疑问:大学课程为什么要开设编译原理这门课程呢?编译原理这门课程中的内容似乎从来没有被直接用到过。

可是编译原理却一直作为大学本科的必修课程,同时也成为了绝大多数研究生入学考试的必考内容。

编译原理这门课程始终占有非常重要的地位是有其必然的道理的。

首先,编译器是计算机软件与硬件之间实现衔接的桥梁,计算机系统中正是由于有编译器的存在才让程序员能够不去或者是尽量少地去关心系统的硬件,而将时间和精力都用到算法设计和代码实现等工作上去。

事实上,编译器允许所有计算机用户忽略与机器相关的机器语言的细节,因此,使得程序和程序设计的专业技术成为与机器无关的,在计算机的数量和种类呈爆炸性增长的时代,这一点的意义尤其重要;其次,编译器本身的构造和性能直接影响着整个计算机系统的性能,特别是在计算机硬件技术不断发展的情况下,编译器的构造和性能对整个计算机系统的运行效率的影响更是如此;再者,编译程序的设计原理和构造是计算机体系结构研究人员、计算机科学家、软件工程技术人员所必备的专业基础知识,编译程序的设计涉及到程序设计语言、计算机体系结构、语言理论、算法设计、数据结构和软件工程等多方面的知识。

而对于计算机科学与技术专业的学生来说,尽管最终真正从事诸如编译器构造的这种繁杂而又艰巨的工程的人只是少数,但是,通过对编译器原理系统的学习,从而掌握其设计技巧以及与高级语言翻译成低级语言相关的知识,可以使学生对诸如程序设计语言、数据结构和算法设计与分析等众多计算机专业的基础课程有更加深入的理解和体会。

通过对编译器这个沟通软、硬件的“翻译”桥梁角色的理解和认识,还可以让学生对计算机软、硬件的相互依存、相互支持的关系有更进一步的领悟与洞察。

1.1.2 学习编译原理课程的方法由于编译系统的庞大和复杂,再加上编译原理的高度抽象性,使得学习编译原理这门课程是比较困难的。

计算机的出现促进了形式语言学的研究。

自从著名的语言学家Noam Chomsky 于1956年建立了形式语言的描述以来,形式语言学理论便以非常快的速度发展起来。

形式语言学理论对计算机科学有着非常深刻的影响,特别是对程序语言的设计和编译程序的构造有着重大的作用。

程序语言是形式化的语言。

计算机语言从机器语言、汇编语言到高级语言的发展相对于计算机硬件的发展来说,是相当缓慢的,但是相对于编译理论和编译器的发展来说,又是比较迅速的。

但是,从根本上说来,高级语言之所以得到今天的发展,是以编译理论的发展以及编译器的发展和完善为基础的。

Noam Chomsky的发现使得编译器的结构异常简单,甚至还带有了一些自动化。

他的研究导致了根据语言文法(即指定其结构的规则)的难易程度以及识别它们所需要的算法来为语言分类。

其中,上下文无关文法证明是程序设计语言中最有用的。

而且在今天它已经代表着程序设计语言结构的标准方式。

有穷自动机和正则表达式与上下文无关文法紧密相关。

它们与Noam Chomsky的3型文法相对应。

要想真正深入地掌握《编译原理》这门课程的所讲述的理论和知识,主要应从自动机原理着手。

自动机原理使得编译器的结构合理。

然后,通过系统地学习编译的各种原理和技术来达到一个比较全面深入的认识。

另外,大家还必须知道最基本的数据结构和离散数学以及机器结构和汇编语言的相关知识。

编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。

我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。

在20世纪50年代,编译器的编写一直被认为是十分困难的事情,Fortran的编译器据说花了18年的时间才完成。

在人们尝试编写编译器的同时,诞生了许多跟编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。

因此,学习编译原理其实也就是学习算法。

通常,我们都是将编译器的原理和构造分成词法分析,语法分析(LL算法,递归下降算法,LR算法),语义分析,运行时环境,中间代码,代码生成,代码优化等部分进行讨论。

一般来说,大学里面的本科教学是不可能把以上提到的所有部分都认真讲解完的,而是比较偏重于前面几个部分。

像代码优化那部分东西,就像个无底洞一样,如果要认真讲,就是单独开一个学期的课也不可能讲得清楚。

所以,一般对于本科生,对词法分析和语法分析掌握要求相对要高一点。

词法分析相对来说比较简单。

词法分析程序本身实现起来也很简单,很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。

不过编译原理在讲解词法分析的时候,重点把正则表达式和自动机原理加了进来,然后以一种十分标准的方式来讲解词法分析程序的产生。

这样的做法道理很明显,就是要让词法分析从程序上升到理论的地步。

语法分析部分就比较麻烦一点了。

现在一般有两种语法分析算法,LL自顶向下算法和LR自底向上算法。

相对来说,LL算法比较简单,而LR算法却非常困难,因此,对于LR算法的相关内容都是只要大家理解就可以了,不要求大家能真正用程序设计语言实现这些算法。

即使是在真正的编译器中,LR算法的语法分析器也都不是由人手工地来编写的,一般都是用工具Yacc来生成,因此,在学习过程中就更没有必要自己来实现这些算法了。

对于LL算法中特殊的递归下降算法,因为其实现十分简单,理所当然要求每个学生都能自己动手将其实现。

词法分析与语法分析的本质到底是什么呢?单从编译器的角度来讲,编译器的工作是把程序员写的源程序转换成一种方便处理的数据结构(抽象语法树或语法树),这个转换的过程就是通过词法分析和语法分析来完成的。

其实词法分析并非一开始就被列入编译器的必备部分,只是我们为了简化语法分析的过程,把词法分析这种相对比较简单但却会在编译器的工作过程中反复使用的工作单独提取出来,成了现在的词法分析部分。

除了编译器部分,在其它地方,词法分析和语法分析也是有用的。

比如我们在DOS、Unix、Linux下输入命令的时候,操作系统分析你输入的命令形式的本质就是词法分析,再有对电子邮件地址的识别,实际上也是词法分析中的理论部分——正则表达式的应用,这些虽然都是些简单的应用,但其思想是很明确的。

相关文档
最新文档