河北工大《编译原理》实验指导书及参考程序

合集下载

编译原理实验指导书

编译原理实验指导书

编译原理实验指导书计算机学院实验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 #。

编译原理—实验指导书-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)

编译原理实验指导书

编译原理实验指导书

编译原理实验指导书计算机科学与技术系2007年6月目录实验目的和任务 (1)实验一:词法分析器 (1)实验二:语法分析器1 (5)实验三:语法分析器2 (9)实验四:语义分析和中间代码生成器 (11)实验目的和任务编译原理是一门实践性很强的课程,只有通过实践,才能真正理解其理论的深层内涵,切实掌握编译器的生成技术。

实际的编译程序是十分复杂的,有时多达十几万条指令组成,实现起来难度很大。

在编译原理的实验中,简化了真实程序设计语言要面临的许多问题,选用了具有一定表现能力的实用语言的子集。

实验主要涉及最关键的3个环节──词法分析、语法分析和中间代码生成,每个环节既独立又相互关联,前后衔接,可合为一体,能较清楚地展现编译器前端的工作状况。

编程语言要求:C、C++或JAVA。

实验一:词法分析器一、实验目的通过编写词法分析程序,了解词法分析的过程。

二、实验内容编写能识别给定的程序设计语言的词法规则,输出单词流的识别程序。

三、实验设备及工具1.硬件:PC机Pentium100以上。

2.软件:Win2000或WinXP、BC++、VC++或JA V A开发环境。

四、实验说明以下所给文法是进行词法分析和语法分析的依据,并将该文法中涉及到的单词信息提取到了单词符号与种别对照表中。

本次实验要求编写符合该文法构词规则的词法分析器。

1. 文法G(<程序>)<程序>→BEGIN <语句表> END.<语句表>→<语句>|<语句>;<语句表><语句>→<赋值语句>︱<条件语句>︱<WHILE语句>︱<复合语句><赋值语句>→<变量>=<算术表达式><条件语句>→IF <关系表达式> THEN <语句> ELSE <语句><WHILE语句>→WHILE <关系表达式> DO <语句><复合语句>→BEGIN <语句表> END<算术表达式>→<项>|<算术表达式>+<项>|<算术表达式>-<项><项>→<变量>|<整数><关系表达式>→<算术表达式><关系运算符><算术表达式><关系运算符>→<︱= =︱><变量>→<标识符><标识符>→<标识符><字母>|<标识符><数字>|<字母><整数>→<数字>|<数字><整数><字母>→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<数字>→0|1|2|3|4|5|6|7|8|9注意阴影部分,其中<整数>和<标识符>被看作最小词法单位。

《编译原理》实验指导书(吴元斌)

《编译原理》实验指导书(吴元斌)

《编译原理》实验指导书“编译原理”课程是计算机本科专业的必选课程,上机实验是该课程的重要环节,实验学时数为8学时。

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

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

实验一、词法分析(2学时)一、实验目的熟悉正规文法、正规式和有穷自动机,了解词法分析的主要任务,掌握词法分析是如何根据正规文法规则逐一分析词法得到属性字的,即掌握了词法分析过程。

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

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

(遇到错误时可显示“Error”,然后跳过错误部分继续显示)。

三、实验原理词法分析是编译过程的第一步,要想做好该实验,必须熟悉正规文法、正规式和有穷自动机的概念和原理,实验前须先定义语言的正规文法或正规式,构造确定的有穷自动机,然后根椐有穷自动机设计程序模块,源程序的输入。

1四、实验步骤(一)准备:1.阅读课本有关章节,花二天时间明确语言的语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。

刘军_编译原理实验指导书_09软件1-2班

刘军_编译原理实验指导书_09软件1-2班

《编译原理》课程实验指导书一、使用说明《编译原理》课程实验指导书(以下简称:指导书)是针对计算机学院所开设的对应课程的上机实验而编写的教学文件,供学生上机实验时使用。

上机的工作环境要求:Windows 2000或以上操作系统、C++ 6.0或者其它高级程序设计语言。

学生应按指导教师的要求独立完成实验,并按要求撰写实验报告。

每一个实验,编程上机调试并且提交电子文档实验报告,以学号姓名作为文件名上传。

报告内容至少包含如下内容:1、学生基本情况:专业班级、学号、姓名2、实验题目、实验内容3、设计分析4、源程序代码5、测试用例(尽量覆盖所有分支)6、实验总结二、实验说明1、实验一:词法分析器设计实验类别:基础性实验实验学时:4分组人数:1人/组1、实验目的:(1)掌握词法分析器的构造过程以及基本方法。

(2)理解正规式、NFA、DFA及最小化DFA的转换过程和方法。

2、实验内容给定一个正规式R=XY*|YX*Y|XYX,请先在练习本上将此正规式转变为NFA、DFA、最小化DFA;对你所完成的最小化DFA进行编程,完成词法分析器工作。

2、实验二:算术表达式递归下降分析程序设计实验类别:设计性实验实验学时:4分组人数:1人/组1、实验目的:(1)掌握自上而下语法分析的要求与特点。

(2)掌握递归下降语法分析的基本原理和方法。

(3)掌握相应数据结构的设计方法。

2、实验内容:编程实现给定算术表达式的递归下降分析器。

算术表达式文法如下:E→E+T | TT→T*F | FF→(E) | i3、设计说明:首先改写文法为LL(1)文法;然后为每一个非终结符,构造相应的递归过程,过程的名字表示规则左部的非终结符;过程体按规则右部符号串的顺序编写。

编写者签字:刘军审阅者签字:张俊分管实验教学领导签字:王海晖。

编译原理实验指导书

编译原理实验指导书

编译原理实验指导书第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节词法分析本节进行词法分析程序的编程与调试。

编译原理综合实验指导书

编译原理综合实验指导书

编译原理综合实验指导书序言《编译原理综合实验》作为《编译原理》课程的延伸,其目的是让同学动手设计和实现一个简单语言的编译器和解释器。

通过上机实践,来设计这个相对完整的编译器设计,一方面可以使学生增加对编译程序的整体认识和了解——巩固《编译原理》课程所学知识,另一方面,通过上机练习,学生也可以学到很多程序调试技巧和设计大型程序一般的原则,如模块接口的协调,数据结构的合理选择等等。

一、上机实践要求(1)综合实验的成绩占总成绩的30%;(2)本次实验的所有代码都需要自行编码实现,不能用lex、yacc、JavaCC 等软件自动生成;(3)本次实验要求单人独立完成,综合实验提交的截止日期是2016-6-20;(4)本次综合实验须经授课教师当面验收考核后才予评分,否则以缺交处理;(5)实验结束后提交:源代码和实验报告。

实验报告的格式参见“实验报告模板”。

注:实验报告中不要贴代码。

二、实验内容:(一)词法分析程序的设计与实现:20分要求:设计一个词法分析程序,每调用一次就从源程序文件中顺序识别出一个单词符号。

单词种类与识别规则○1标识符:首字符为字母或’#’,其后由字母、数字或’#’组成;○2整数:由一个或多个数字组成、带正负号的数字串,首位数字不能为0;○3小数:[+|-] 正整数1 ·正整数2[+|-]:表示可选的+或-注意:正整数1不能为空,正整数2可以为空,例如:23.○4字符串:由一对双引号括起来的文本注意:字符串不需要支持多行,即假定任意一串字符串都不能超过一行;字符串不需要支持转义符。

○5保留字:class、if、then、else、call、while、do、string、integer、float、○6单目运算符:+-* / = < >○7双目运算符:<= >= <> ==⑧布尔运算符:&& ||⑨界符:( ) { } ,;此外,该词法分析程序还要能支持单行注释和多行注释(注释语法同C语言)。

《编译原理》实验说明书2012

《编译原理》实验说明书2012

《编译原理》实验指导书执笔人:王一宾2012年2月实验一词法分析器的设计一、实验目的和要求加深对状态转换图的实现及词法分析器的理解。

熟悉词法分析器设计的主要算法及实现过程。

要求学生掌握词法分析器的设计过程,并实现词法分析。

二、实验基本内容给出一个简单语言的词法规则,画出状态转换图,并依据状态转换图编制出词法分析程序,词法规则如下:单词符号种别码内码break 1char 2continue 3do 4double 5else 6extern 7float 8for 9int 10if 11long 12short 13static 14switch 15void 16while 17<30<=31<>32>33>=34=35(36)37** 38* 39:= 40+41-42?43,44;45标识符70常数80 二进制形式三、问题描述及基本算法提示1.状态转换图的实现让每个结点对应一小段程序。

需引进一组全局变量和过程(1)ch 字符变量,存放最新读进的源程序字符。

(2)strToken 字符数组,存放构成单词符号的字符串。

(3)GetChar 子程序过程,将下一输入字符读到ch中,搜索指示器前移一字符位置。

(4)GetBC 子程序过程,检查ch中字符是否为空白。

若是,则调用GetChar直至ch中进入一个非空白字符。

(5)Concat 子程序过程,将ch中的字符连接到strToken之后。

例如,假定strToken 原来的值为“AB”,而ch中存放着’C’,经调用Concat后,strToken的值就变为”ABC”。

(6)IsLetter和IsDigit 布尔函数过程,它们分别判断ch中的字符是否为字母和数字。

(7)Reserve 整型函数过程,对strToken中的字符找保留字表,若它是一个保留字,则返回它的编码,否则返回0值。

(8)Retract 子程序过程,将搜索指示器回调一个字符位置,将ch置为空白字符。

编译原理实验大纲

编译原理实验大纲

编译原理实验大纲1.实验简介-介绍编译原理实验的目的和意义。

-解释编译原理实验的基本原理和流程。

2.实验环境搭建-说明实验所需的软件工具和开发环境。

-指导学生安装和设置实验环境。

3.实验一:词法分析器设计-介绍词法分析器的作用和原理。

-分析需求,设计词法分析器的数据结构和算法。

-实现基于所设计算法的词法分析器。

-编写测试用例,验证词法分析器的功能和正确性。

4.实验二:语法分析器设计-介绍语法分析器的作用和原理。

-分析需求,设计语法分析器的数据结构和算法。

-实现基于所设计算法的语法分析器。

-编写测试用例,验证语法分析器的功能和正确性。

5.实验三:语义分析器设计-介绍语义分析器的作用和原理。

-分析需求,设计语义分析器的数据结构和算法。

-实现基于所设计算法的语义分析器。

-编写测试用例,验证语义分析器的功能和正确性。

6.实验四:中间代码生成-介绍中间代码生成的作用和原理。

-分析需求,设计中间代码生成的数据结构和算法。

-实现基于所设计算法的中间代码生成器。

-编写测试用例,验证中间代码生成器的功能和正确性。

7.实验五:目标代码生成-介绍目标代码生成的作用和原理。

-分析需求,设计目标代码生成的数据结构和算法。

-实现基于所设计算法的目标代码生成器。

-编写测试用例,验证目标代码生成器的功能和正确性。

8.实验六:优化与调试-介绍编译优化和调试的基本概念。

-分析已实现的编译器的性能和问题。

-提出优化方案,并实现相应的优化功能。

-进行性能测试和调试,验证优化效果和解决问题。

9.实验七:实验报告撰写-分析实验过程和结果,总结经验和收获。

-撰写实验报告,包括实验目的、原理、实现过程、结果分析等内容。

-提交实验报告并进行评分评比。

10.总结与展望-对实验进行总结,回顾实验目标和实现情况。

-展望未来的发展方向和对编译原理的深入研究。

以上为编译原理实验的大纲,通过完成这些实验,学生可以深入理解编译原理的基本原理和算法,并掌握编译器的设计与实现方法。

《编译原理》实验教学大纲

《编译原理》实验教学大纲

《编译原理》实验教学大纲一、实验目的和任务编译原理是计算机科学与技术专业的一门重要课程,它主要研究的是将高级语言程序翻译成机器语言程序的方法和技术。

通过本实验课程的学习,旨在使学生掌握编译原理的基本原理和方法,培养学生对编译器结构与构造技术的专门知识和技能,为学生今后进行编译器设计与实现打下基础。

二、实验设备和工具1.计算机和相关硬件设备2. 编程语言的开发环境,如C/C++或Java三、实验内容1.实验一:词法分析器设计与实现a)实验目的:学习词法分析器的原理和设计方法,掌握正则表达式、DFA和NFA的转换方法。

b)实验任务:i.设计并实现一个词法分析器的原型,能够正确地识别出给定的程序中的词法单元。

ii. 使用给定的正则表达式设计并实现识别给定程序中的关键字、标识符、常量等的词法分析器。

2.实验二:语法分析器设计与实现a)实验目的:学习语法分析器的原理和设计方法,掌握上下文无关文法和LR分析表的构造方法。

b)实验任务:i.学习并理解上下文无关文法和LR分析表的构造方法。

ii. 设计并实现一个简单的递归下降语法分析器。

3.实验三:语义分析器设计与实现a)实验目的:学习语义分析器的原理和设计方法,掌握语义动作的定义和处理方法。

b)实验任务:i.学习并理解语义分析器的原理和设计方法。

ii. 设计并实现一个简单的语义分析器,能够对给定的程序进行语义分析和语义动作的处理。

4.实验四:中间代码生成器设计与实现a)实验目的:学习中间代码生成器的原理和设计方法,掌握中间代码的生成和优化方法。

b)实验任务:i.学习并理解中间代码生成器的原理和设计方法。

ii. 设计并实现一个简单的中间代码生成器,能够将给定的程序翻译成中间代码。

5.实验五:目标代码生成器设计与实现a)实验目的:学习目标代码生成器的原理和设计方法,掌握目标代码的生成和优化方法。

b)实验任务:i.学习并理解目标代码生成器的原理和设计方法。

ii. 设计并实现一个简单的目标代码生成器,能够将中间代码翻译成目标代码。

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

编译原理实验指导书(-).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 实验简介 (3)2 TINY+语言介绍 (4)2.1 TINY+语言的词法定义 (4)2.2 TINY+的语法定义 (5)2.3 TINY+的语义定义 (7)2.4 用TINY+语言编写的示例程序 (7)3 实验1:实现TINY+语言的词法分析器 (9)3.1 实验目的 (9)3.2 实验要求 (10)3.3 TINY+的测试程序及词法分析器的输出 (10)4 实验2:实现TINY+的语法分析器、语义分析器以及中间代码生成器 (13)4.1 实验目的 (13)4.2 实验要求 (14)4.3 TINY+示例程序及其输出 (14)附录:和TINY+文法规则对应的生成三地址中间代码的属性文法 (16)1 实验简介学生在实验中,构造一个将TINY+高级程序设计语言转换为TINY+虚拟机上的中间代码的编译器。

整个实验包括两个部分:实验一完成TINY+编译器的词法分析器部分;实验二完成TINY+编译器的语法分析器部分、语义分析器部分及中间代码生成器部分。

每个同学必须独立完成自己的实验,与其他同学的讨论或合作是允许的,但必须是有限度的,可以互相交流想法和方法,但不能抄袭。

学术不端将导致成绩为零。

TINY+的编译器必须用C语言或C++语言实现(推荐使用Microsoft Visual Studio)。

2 TINY+语言介绍实验定义了一种叫TINY+的高级程序设计语言,该语言是对TINY 语言的一个扩充,TINY+比TINY增加了程序的声明部分,while语句,字符串类型定义等等,在本节的描述中,用蓝色字体标识的是TINY语言原有的词法及语法规定,而用红色字体标识的是TINY+语言扩充的词法及语法规定。

本节主要是对TINY+语言的介绍,具体包括:1)TINY+语言的词法定义,包括对TINY+语言的单词(token)的描述;2)TINY+语言语法结构的EBNF描述;3)TINY+语言主要的语义描述;4)TINY+的实例程序2.1 TINY+语言的词法定义1.TINY+语言的关键字(keyword)包括:or and int bool char while doif then else end repeat until read write所有的关键字是程序设计语言保留使用的,并且用小写字母表示,用户自己定义的标识符不能和关键字重复。

《编译原理》科学实验指导说明书

《编译原理》科学实验指导说明书

《编译原理》实验指导书实验一词法分析器的设计一、实验目的和要求加深对状态转换图的实现及词法分析器的理解。

熟悉词法分析器的主要算法及实现过程。

要求学生掌握词法分析器的设计过程,并实现词法分析。

二、实验基本内容给出一个简单语言的词法规则,画出状态转换图,并依据状态转换图编制出词法分析程序,能从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。

并依次输出各个单Error”,然后跳过错误部分继续显示)词法规则如下:三、实验时间:上机三次。

第一次按照自己的思路设计一个程序。

第二、三次在理论课学习后修改程序,使得程序结构更加合理。

四、实验过程和指导:(一)准备:1.阅读课本有关章节(c/c++,数据结构),花一周时间明确语言的语法,写出基本算法以及采用的数据结构和要测试的程序例。

2.初步编制好程序。

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

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

(三)程序要求:程序输入/输出示例:输入如下一段:main(){/*一个简单的c++程序*/int a,b; //定义变量a = 10;b = a + 20;}要求输出如右图。

要求:(1) 剔除注解符(2) 常数为无符号整数(可增加实型数,字符型数等)(四)练习该实验的目的和思路:程序开始变得复杂起来,可能是大家以前编过的程序中最复杂的,但相对于以后的程序来说还是简单的。

因此要认真把握这个过渡期的练习。

程序规模大概为200行及以上。

通过练习,掌握对字符进行灵活处理的方法。

(五)为了能设计好程序,注意以下事情:1.模块设计:将程序分成合理的多个模块(函数/类),每个模块(类)做具体的同一事情。

2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。

3.编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。

4.程序设计语言不限,建议使用面向对象技术及可视化编程语言,如C++,VC,JA V A,VJ++等。

编译原理实验指导

编译原理实验指导

编译原理实验指导目录实验1:文法的读入和输出 (3)实验2:词法分析程序的设计 (5)实验3:LL(1)文法构造 (7)实验4:语法分析程序的设计(1) (9)实验5:语法分析程序的设计(2) (11)实验6:逆波兰式的翻译和计算 (15)实验7:语法制导的三地址代码生成 (17)实验1 文法的读入和输出一、实验目的熟悉文法的结构,了解文法在计算机内的表示方法。

二、实验内容1、设计一个表示文法的数据结构;2、从文本文件中读入文法,利用定义的数据结构存放文法,并输出;3、本实验结果还将用于实验3。

三、实验要求1、了解文法定义的4个部分:G(Vn, Vt, S, P)Vn 文法的非终结符号集合,在实验中用大写的英文字母表示;Vt 文法的终结符号集合,在实验中用小写的英文字母表示;S 开始符号,在实验中是Vn集合中的一个元素;P 产生式,分左部和右部,左部为非终结符号中的一个,右部为终结符号或非终结符号组成的字符串,如S->ab|c2、根据文法各个部分的性质,设计一个合理的数据结构用来表示文法,1)若使用C语言编写,则文法可以设计成结构体形式,结构体中应包含上述的4部分,2)若使用C++语言编写,则文法可以设计成文法类形式,类中至少含有4个数据成员,分别表示上述4个部分文法数据结构的具体设计由学生根据自己想法完成,并使用C或C++语言实现设计的数据结构。

3、利用完成的数据结构完成以下功能:1)从文本文件中读入文法(文法事先应写入文本文件);2)根据文法产生式的结构,分析出文法的4个部分,分别写入定义好的文法数据结构的相应部分;3)整理文法的结构;4)在计算机屏幕或者文本框中输出文法,文法输出按照一个非终结符号一行,开始符号引出的产生式写在第一行,同一个非终结符号的候选式用“|”分隔的方式输出。

四、实验环境PC微机DOS操作系统或Windows 操作系统Turbo C 程序集成环境或Visual C++ 程序集成环境五、实验步骤1、根据文法定义,设计出文法数据结构2、用学生选择的语言,实现文法的数据结构3、编写调试文法读入和输出程序,4、测试程序运行效果:从文本文件中读入一个文法,在屏幕上输出,检查输出结果。

实验指导书(编译原理)-2012-2013-1

实验指导书(编译原理)-2012-2013-1

《编译原理》实验指导书主讲教师:王艳秋枣庄学院信息科学与工程学院目录实验一词法分析器的设计 (1)实验二语法分析器的设计与实现 (3)实验三语义分析 (6)实验一词法分析器的设计与实现一、实验目的:加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。

二、实验内容:自定义一种程序设计语言,或者选择已有的一种高级语言(C语言),编制它的词法分析程序。

词法分析程序的实现可以采用任何一种编程工具。

三、实验要求:1. 对单词的构词规则有明确的定义;2. 编写的分析程序能够正确识别源程序中的单词符号;3. 识别出的单词以<种别码,值>的形式保存在符号表中;4. 词法分析中源程序的输入以.c格式,分析后的符号表保存在.txt文件中。

5. *对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;6. 实验报告要求用自动机或者文法的形式对词法定义做出详细说明,说明词法分析程序的工作过程,说明错误处理的实现*。

四、实验学时:4学时五、实验步骤:1. 定义目标语言的可用符号表和构词规则;2. 依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束;3. 对正确的单词,按照它的种别以<种别码,值>的形式保存在符号表中;4. *对不正确的单词,做出错误处理*。

六、选作实验学生可以根据自身的情况完善词法分析程序的错误处理功能(实验要求5&6),如对错误的单词给出准确的位置和错误类型提示。

七、作业提交时间第9周实验课结束后提交词法分析程序(uzz_scg@)。

八、提示1. char Scanin[100],Scanout[100]; //用于接收输入输出文件名FILE *fin,*fout; //用于指向输入输出文件的指针2. //下面定义保留,为简化程序,使用字符指针数组保存所有保留字。

《编译原理》实验说明书2012

《编译原理》实验说明书2012

《编译原理》实验指导书执笔人:王一宾2012年2月实验一词法分析器的设计一、实验目的和要求加深对状态转换图的实现及词法分析器的理解。

熟悉词法分析器设计的主要算法及实现过程。

要求学生掌握词法分析器的设计过程,并实现词法分析。

二、实验基本内容给出一个简单语言的词法规则,画出状态转换图,并依据状态转换图编制出词法分析程序,词法规则如下:单词符号种别码内码break 1char 2continue 3do 4double 5else 6extern 7float 8for 9int 10if 11long 12short 13static 14switch 15void 16while 17<30<=31<>32>33>=34=35(36)37** 38* 39:= 40+41-42?43,44;45标识符70常数80 二进制形式三、问题描述及基本算法提示1.状态转换图的实现让每个结点对应一小段程序。

需引进一组全局变量和过程(1)ch 字符变量,存放最新读进的源程序字符。

(2)strToken 字符数组,存放构成单词符号的字符串。

(3)GetChar 子程序过程,将下一输入字符读到ch中,搜索指示器前移一字符位置。

(4)GetBC 子程序过程,检查ch中字符是否为空白。

若是,则调用GetChar直至ch中进入一个非空白字符。

(5)Concat 子程序过程,将ch中的字符连接到strToken之后。

例如,假定strToken 原来的值为“AB”,而ch中存放着’C’,经调用Concat后,strToken的值就变为”ABC”。

(6)IsLetter和IsDigit 布尔函数过程,它们分别判断ch中的字符是否为字母和数字。

(7)Reserve 整型函数过程,对strToken中的字符找保留字表,若它是一个保留字,则返回它的编码,否则返回0值。

(8)Retract 子程序过程,将搜索指示器回调一个字符位置,将ch置为空白字符。

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

《编译原理》实验指导书适用实验课时:30适用对象:计算机科学与软件学院实验目的和内容编译原理实验的目的是使学生将编译理论运用到实际当中,实现一个简单语言集的词法分析程序、语法分析程序和简单语义处理程序,验证实际编译系统的实现方法,并加深对编译理论的认识。

基本实验分为三个部分,实验一词法分析器设计实现、实验二LR语法分析器设计实现,实验三语义处理程序实现,总的实验学时为30课时。

要求每个学生独立完成所有实验要求。

每部分基本实验还包括若干扩展实验,供编程能力较强的学生自愿进行。

实验一词法分析程序实现一、实验目的与要求通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。

二、实验内容根据教学要求并结合学生自己的兴趣和具体情况,从具有代表性的高级程序设计语言的各类典型单词中,选取一个适当大小的子集。

例如,可以完成无符号常数这一类典型单词的识别后,再完成一个尽可能兼顾到各种常数、关键字、标识符和各种运算符的扫描器的设计和实现。

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

输出:把单词的字符形式表示翻译成编译器的内部表示,确定单词串的输出形式,并将其结果放到某个文件中。

要求所输出的每一单词均按形如(CLASS,V ALUE)的二元式编码。

对于变量和常数,CLASS字段为相应的类别码;V ALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。

对于关键字和运算符,采用一词一类的编码形式;由于采用一词一类的编码方式,所以仅需在二元式的CLASS 字段上放置相应的单词的类别码,V ALUE字段则为“空”。

不过,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上放置单词类别的助记符。

三、实现方法与环境词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。

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

一般地,可以根据文法或状态转换图构造相应的状态矩阵,该状态矩阵连同控制程序一起便组成了编译器的词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。

构造词法分析程序的另外一种途径是所谓的词法分析程序的自动生成,即首先用正规式对语言中的各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程序所应进行的语义处理工作,然后由一个所谓词法分析程序的构造程序对上述信息进行加工。

如美国BELL实验室研制的LEX就是一个被广泛使用的词法分析程序的自动生成工具。

总的来说,开发一种新语言时,由于它的单词符号在不停地修改,采用LEX等工具生成的词法分析程序比较易于修改和维护。

一旦一种语言确定了,则采用手工编写词法分析程序效率更高。

四、基本实验题目题目1:试用手工编码方式构造识别以下给定单词的某一语言的词法分析程序。

语言中具有的单词包括五个有代表性的关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。

参考实现方法简述如下。

单词的分类:构造上述语言中的各类单词符号及其分类码表。

表I 语言中的各类单词符号及其分类码表处理过程:在一个程序设计语言中,一般都含有若干类单词符号,为此可首先为每类单词建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,即得到了一个有限自动机,再进行必要的确定化和状态数最小化处理,最后据此构造词法分析程序。

在此为了使词法分析程序结构比较清晰,且尽量避免某些枝节问题的纠缠,假定要编译的语言中,全部关键字都是保留字,程序员不得将它们作为源程序中的标识符;在源程序的输入文本中,关键字、标识符、整常数之间,若未出现关系和算术运算符以及赋值符,则至少须用一个空白字符加以分隔。

作了这些限制以后,就可以把关键字和标识符的识别统一进行处理。

即每当开始识别一个单词时,若扫视到的第一个字符为字母,则把后续输入的字母或数字字符依次进行拼接,直至扫视到非字母、数字字符为止,以期获得一个尽可能长的字母数字字符串,然后以此字符串查所谓保留字表(此保留字表已事先造好),若查到此字符串,则取出相应的类别码;反之,则表明该字符串应为一标识符。

采用上述策略后,针对表I中部分单词可以构造一个如图1所示的有限自动机(以状态转换图表示)。

在图1中添加了当进行状态转移时,词法分析程序应执行的语义动作。

根据图1,可用C语言编写出符合以上几项要求的一个相应的扫描器程序,如程序一所示。

图1 识别表I所列语言中的部分单词的DFA及相关的语义过程图1及程序一中所出现的语义变量及语义函数的含义和功能说明如下:函数GETCHAR:每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。

字符数组TOKEN:用来依次存放一个单词词文中的各个字符。

函数CAT:每调用一次,就把当前ch中的字符拼接于TOKEN中所存字符串的右边。

函数LOOKUP:每调用一次,就以TOKEN中的字符串查保留字表,若查到,就将相应关键字的类别码赋给整型变量c;否则将c置为零。

函数RETRACT:每调用一次,就把扫描指示器回退一个字符位置(即退回多读的那个字符)。

函数OUT:一般仅在进入终态时调用此函数,调用的形式为OUT(c,VAL)。

其中,实参c为相应单词的类别码或其助记符;当所识别的单词为标识符和整数时,实参V AL为TOKEN(即词文分别为字母数字串和数字串),对于其余种类的单词,V AL均为空串。

函数OUT的功能是,在送出一个单词的内部表示之后,返回到调用该词法分析程序的那个程序。

程序一根据图1编写的扫描器# include <stdio.h># include <ctype.h># include <string.h># define ID 6# define INT 7# define LT 8# define LE 9# define EQ 10# define NE 11# define GT 12# define GE 13char TOKEN[20];extern int lookup (char*);extern void out (int, char*);extern report_error (void);void scanner_example (FILE *fp){char ch; int i, c;ch=fgetc (fp);if (isalpha (ch)) /*it must be a identifer!*/{TOKEN[0]=ch; ch=fgetc (fp); i=1;while (isalnum (ch)){TOKEN[i]=ch; i++;ch=fgetc (fp);}TOKEN[i]= ′\0′fseek(fp,-1,1); /* retract*/c=lookup (TOKEN);if (c==0) out (ID,TOKEN); else out (c," ");}elseif(isdigit(ch)){TOKEN[0]=ch; ch=fgetc(fp); i=1;while(isdigit(ch)){TOKEN[i]=ch; i++;ch=fgetc(fp);}TOKEN[i]= ′\0′;fseek(fp,-1,1);out(INT,TOKEN);}elseswitch(ch){case ′<′: ch=fgetc(fp);if(ch==′=′)out(LE," ");else if(ch==′>′) out (NE," ");else{fseek (fp,-1,1);out (LT," ");}break;case ′=′: out(EQ, " "); break;case ′>′: ch=fgetc(fp);if(ch==′=′)out(GE," ");else{fseek(fp,-1,1);out(GT," ");}break;default: report_error( ); break;}return;}提示:扫描器所用的若干函数以及主程序有待于具体编写,并需事先建立好保留字表,以备查询。

例如:/* 建立保留字表*/#define MAX_KEY_NUMBER 20 /*关键字的数量*/#define KEY_WORD_END “waiting for your expanding”/*关键字结束标记*/char *KeyWordTable[MAX_KEY_NUMBER]={“begin”, “end”, “if”, “then”, “else”, KEY_WORD_END}; /* 查保留字表,判断是否为关键字*/int lookup (char *token){int i=0;while (strcmp(KeyWordTable[n], KEY_WORD_END)) /*strcmp比较两串是否相同,若相同返回0*/ {if (!strcmp(KeyWordTable[n], token)) /*比较token所指向的关键字和保留字表中哪个关键字相符*/ {return n+1; /*设置正确的关键字类别码,并返回此类别码的值*/break;}n++;}return 0; /*单词不是关键字,而是标识符*/}另外,在扫描源程序字符串时,一旦识别出关键字、标识符、整常数以及运算符中之一,即以二元式形式(类别编码,值)输出单词到指定文件中。

每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。

题目2:将表I单词集中的整常数改为无符号常数,修改题目1中已开发的扫描器。

无符号常数的单词分类码助记符:UCON;其值为无符号常数的机内二进制表示。

描述无符号数的正规文法和状态转换图:无符号数的右线性文法G[<无符号数>]如下:〈无符号数〉→d〈余留无符号数〉〈无符号数〉→·〈小数部分〉〈无符号数〉→ d〈余留无符号数〉→d〈余留无符号数〉〈余留无符号数〉→·〈十进小数〉〈余留无符号数〉→E〈指数部分〉〈余留无符号数〉→ d〈余留无符号数〉→·〈十进小数〉→E〈指数部分〉〈十进小数〉→d〈十进小数〉〈十进小数〉→ d〈小数部分〉→d〈十进小数〉〈小数部分〉→ d〈指数部分〉→d〈余留整指数〉〈指数部分〉→+〈整指数〉〈指数部分〉→-〈整指数〉〈指数部分〉→ d〈整指数〉→d〈余留整指数〉〈整指数〉→ d〈余留整指数〉→d〈余留整指数〉〈余留整指数〉→d图2所示为上述文法的状态转换图,其中编号0、1、2、…、6分别代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>。

相关文档
最新文档