资源预览内容
第1页 / 共40页
第2页 / 共40页
第3页 / 共40页
第4页 / 共40页
第5页 / 共40页
第6页 / 共40页
第7页 / 共40页
第8页 / 共40页
第9页 / 共40页
第10页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
实验指导书 前 言编译原理是计算机科学与技术、软件工程等专业的主干课和必修课,由于这门课程相对抽象且内容较复杂,一直是比较难学的一门课程。在编译原理的学习过程中,实验非常重要,只有通过上机实验,才能使学生对比较抽象的课程内容产生一个具体的感性认识。但是,目前国内市场上很少有较详细且比较适合我院实际的实验指导书,为此,我们特编了这份指导书,希望能对我院的编译原理教学工作有所帮助。本书实验环境主要为C环境(由于兼容性问题,建议使用Turboc2.0)及一个词法分析器自动生成工具FLEX和一个语法分析器自动生成工具BISON。书中给出的参考源程序也是C源程序,但由于实验者熟悉精通的语言工具不尽相同,因而强求采用统一的编程语言编程是不现实的。实验者在掌握了编译程序各个阶段的功能和原理之后,不难借助使用其他自己熟悉的语言实现相关功能。实验者在实验过程中应该侧重写出自己在算法分析、设计思路、实现功能或程序代码等方面的特色,写出设计和实现过程中遭遇到的难点和解决办法,可以不拘泥于实验指导给出的参考性设计思路,尽可能在深度和广度上加以拓展。只有这种各具特色的实验报告,才将更有利于体现实验者在创新思维和动手能力上的差异。通过这些实验,能使学生对这些部份的工作机理有一个详细的了解,达到“知其然,且知其所以然”的目的。并可在C环境下对自动生成工具生成的词法、语法分析器进行编译调试。由于手工生成词法和语法分析器的工作量太大,在实际中常用自动生成工具来完成之。这些工具中最著名的当属贝尔实验室的词法分析器生成工具LEX和语法分析器生成工具YACC。它们现已成为UNIX的标准应用程序同UNIX一起发行。与此同时GNU推出与LEX完全兼容的FLEX,与YACC完全兼容的BISON。这两个程序都在Internet上以源代码的形式免费发行,所以很容易在其它操作系统下重新编译安装。我们实验采用的就是for dos的FLEX和BISON。本书有关的编译工具及其源程序例子,可到BISON的网站上下载。关于FLEX和BISON的用法简介,参见附录,如需更详细的介绍,请参阅编译工具中帮助文件。关于实验学时和安排,任课教师可根据实际情况,选做其中的一部份。由于这门课实验难度较大,所以希望任课教师在实验前安排好学生的预习工作。在上机前要求学生写好实验预习报告。本书中c程序均在Turboc2.0下调试通过.LEX和YACC源程序均在FLEX和BISON下调试通过.由于编者水平有限,本书中必然存在着不少缺点,在此恳请大家给予批评和指正,我们将尽力纠正。在此特对关心支持编写本书的院系领导表示感谢。本书中关于LEX和YACC的部份大量参考引用了何炎祥老师主编,华中理工大学出版社出版的编译原理一书,在此表示衷心的感谢。 周鹏杨亚会 梅琴 赵榕2006年8月目 录实验一词法分析器设计1实验二熟悉FLEX使用方法10实验三用FLEX自动生成PL/0词法分析器11实验四用递归下降法进行表达式分析18实验五用算符优先法进行表达式分析20实验六利用BISON生成逆波兰表示计算器24实验七利用BISON生成中缀表示计算器25附录一 词法分析器生成工具FLEX简介26附录二 语法分析器生成工具YACC简介3338实验指导书 实验一词法分析器设计【实验目的】1 掌握生成词法分析器的方法,加深对词法分析原理的理解。2 掌握设计、编制并调试词法分析程序的思想和方法。3 本实验是高级语言程序设计、数据结构和编译原理中词法分析原理等知识的综合。【实验内容及要求】1 选择一种熟悉的高级语言(如C语言,C+,VB或VC等),设计、编写、调试一个词法分析子程序。2 待分析的源程序为一个简单的C语言程序,如下所示: main() int x,a,b; float y,c,d; x = a + b; y=c / d; if(xy) x = 10; else y=100;将该源程序的源文件经词法分析后输出以二元组形式表示的单词符号序列。3 编写的程序具有一定的查错能力。提交的实验报告中要有实验名称、实验目的、实验内容、实验程序清单、调试过程和运行结果,程序的主要部分作出功能说明,并有实验收获体会或改进意见等内容。4 实验前请仔细阅读实验预习提示,提示中程序仅供参考。5 本实验建议学时数为4学时。【实验预习提示】1.词法分析器的功能和输出格式词法分析器的功能是输入以字符串表示的源程序,输出单词符号或单词符号序列。词法分析器的单词符号常常表示成以下的二元组(单词的种别码,单词符号的属性值)。本实验中,采用的是一符一种种别码的方式。2.调试程序文法的EBNF(扩展巴科斯范式)表示如下:= main():= ;:= |:= =:= ifthen:= while:= := +|:= *|/:= |:= := := |:= |=|=|=|!=:= A|B|C|Z|a|b|c|z (要求不区分大小写):= 0|1|2|3|4|5|6|7|8|93.“超前搜索”方法词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a+”,当前字符为,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。于是分析器读入下一个字符+,这时可知应将解释为大于运算符。但此时,超前读了一个字符+,所以要回退一个字符,词法分析器才能正常运行。在分析标识符,无符号整数等时也有类似情况。4.词法分析程序主程序的算法思想 算法的基本思想是根据扫描到单词符号的第一个字符的种类,拼写出相应的单词符号,其实现的基本任务是从字符串表示的源程序中识别出相应的具有独立意义的单词符号。主程序示意图如图1.1所示。初始化并设置初始值调用扫描子程序输出单词二元组输入串结束了吗?YN结束 图1.1 词法分析主程序示意图其中设置初始值包括两个方面:(1)关键字表的初值关键字作为特殊标识符处理,把它们预先安排在一张表中,称这张表为关键字表,当扫描程序识别出标识符时,查关键字表,若能查找到匹配的单词,则该单词是关键字,否则为一般标识符。关键字表为一个字符串数组,其描述为:char *KEY_WORDS8=“main”,”int”, ”char”,”if”,”else”,”while”,”for”;(2)程序中需要用到的主要变量为syn,token和sum。5.参考部分源程序1 globals.h /*本头文件定义分析器需要的一些数据结构和宏等*/#ifndef _GLOBALS_H#define _GLOBALS_H #include#include#include#define _SYN_MAIN 1#define _SYN_INT 2#define _SYN_CHAR 3#define _SYN_IF 4#define _SYN_ELSE 5#define _SYN_FOR 6#define _SYN_WHILE 7/*以上为关键字的单词种别码*/#define _SYN_ID 10 /*标识符的单词种别码*/#define _SYN_NUM 11 /*整数的单词种别码*/#define _SYN_PLUS 13 /* 算术运算符“+”的单词种别码 */#define _SYN_MINUS 14 /* 算术运算符“-”的单词种别码 */#define _SYN_TIMES 15 /* 算术运算符“*”的单词种别码 */#define _SYN_DIVIDE 16 /* 算术运算符“/”的单词种别码 */#define _SYN_ASSIGN 17 /* = */#define _SYN_SEMICOLON 18 /* ; */#define _SYN_LT 20 /* */#define _SYN_NE 21 /* != */#define _SYN_LE 22 /* */#define _SYN_ME 24 /* = */#define _SYN_EQ 25 /* = */#define _SYN_LPAREN 28 /* ( */#define _SYN_RPAREN 29 /* ) */#define _SYN_OVER 0 /* # 即源程序结束标志*/#define MAXLENGTH 255 /* 一行允许的字符个数 */union WORDCONTENT /*存放单词内容的联合*/ char T1MAXLENGTH; int T2; char T3;typedef struct WORD /*单词二元组*/ int syn; union WORDCONTENT value;WORD;#endif2scan.h /*本头文件定义词法分析器的接口*/#ifndef _SCAN_H#define _SCAN_H#define _TAB_LEGNTH 4 /*一个TAB占用的空格数*/#define _KEY_W
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号