资源描述:
《编译原理(词法分析器设计).doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、武汉工程大学计算机科学与工程学院《编译原理》实验报告[1]专业班级实验时间2010年11月12日学生学号实验地点403学生姓名指导教师实验项目词法分析器设计实验类别设计性实验学时4实验目的及要求实验目的:用C语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。成绩评定表类别评分标准分值得分合计上机表现按时出勤、遵守纪律认真完成各项实验内容30分报告质量程序代码规范、功能正确填写内容完整、体现收获70分说明:评阅教师:日期:2010年月日实验内容实验要求:1.1待分析
2、的简单语言的词法(1)关键字:Beginifthenwhiledoend(所有关键字都是小写)(2)运算符和界符::=+-*/<<=<>>>==;()#(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter
3、digit)*NUM=digitdigit*(4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字、词法分析阶段通常被忽略。1.2各种单词符号对应的种别码单词符号种别码单词符号种别码begin1:17if2:=18then3<20w
4、hile4<>21do5<=22end6>23letter(letter
5、digit)*10>=24digitdigit*11=25+13;26-14(27*15)28/16#01.3词法分析程序的功能输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。例如:对源程序beginx:=9;ifx>0thenx:=2*x+1/3;end#的源文件,经词法分析后输出如下序列:(1,begin)(10,x)(18,:=
6、)(11,9)(26,;)(2,if)……1.4词法分析程序的算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到的单词符号的第一个字符的种类,拼出相应的单词符号。1.主程序示意图主程序示意图如图1-1所示。其中初值包括如下两个方面:(1)关键字表的初值关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:char*rwtab[
7、6]={“begin”,”if”,”then”,”while”,”do”,”end”};置初值调用扫描子程序输出单词二元组是结束输入串结束?否图1-1词法分析主程序示意图(2)程序中需要用到的主要变量为syn,token和sum。2.扫描子程序的算法思想首先设置3个变量:token用来存放构成单词符号的字符串;sum用来存放整型单词;syn用来存放单词符号的种别码。扫描子程序主要部分流程如图1-2所示。报错Syn=10数字变量初始化忽略空格syn=11对不同符号给出相应的syn值是返回否拼数是否文件结束?字母否是拼字符
8、串是否关键字?syn为对应关键字的单词种别码返回其它符号图1-2词法分析程序流程词法分析程序的C语言程序#include"stdio.h"/*定义I/O库所用的某些宏和变量*/#include"string.h"/*定义字符串库函数*/#include"conio.h"/*提供有关屏幕窗口操作函数*/#include"ctype.h"/*分类函数*/charprog[80]={' '},token[8];/*存放构成单词符号的字符串*/charch;intsyn,/*存放单词字符的种别码*/n,sum,/*存放整数型
9、单词*/m,p;/*p是缓冲区prog的指针,m是token的指针*/char*rwtab[6]={"begin","if","then","while","do","end"};voidscaner(){m=0;sum=0;for(n=0;n<8;n++)token[n]=' ';ch=prog[p++];while(ch=='')ch=prog[p++];if(isalpha(ch))/*ch为字母字符*/{while(isalpha(ch)
10、
11、isdigit(ch))/*ch为字母字符或者数字字符*/{toke
12、n[m++]=ch;ch=prog[p++];}token[m++]=' ';ch=prog[p--];syn=10;for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0)/*字符串的比较*/{syn=n+1;break;}}elseif(isdigit(ch))/*ch是数字字符*/{whi