1、实验报告模版南华大学 计算机科学与技术学院实 验 报 告 ( 2010 2011 学年度第 一 学期 )课程名称程序设计语言与编译实验名称编制C语言子集的词法分析程序姓名张顺华 学号20084440228专业计算机科学与技术班级082班地点八栋专业实验室教师肖建田老师1.实验目的及要求 题目 使用直接分析法编制C语言子集的词法分析程序目的 通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法要求 根据具体情况,由同学们自己选取C 语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都
2、兼顾到);在实习前一定要制出相应的表 2.实验步骤 分析语言特点在C语言中,对于单词符号我们将其分成四类:保留字、标识符、常数和符号表S,每类单词符号均可使用一张表格表示在词法分析过程中,保留字和界符这两个表格的内容是固定不变的(由语言确定),源程序字符串只能从其中选取,而标识符、常数这两表是在分析过程中不断形成的对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是、或中之一,那么就以单词的二元式形式输出每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串各类单词的二元式表述均具有相同的结构与长度,形式如下:(单词种
3、别,单词自身的值)是单词种别,而单词种别共分为、四类且每类对应一张表格因此,实际上就是一个指向这四类中某一类对应表格的指针则为指向该类表格中一个特定项目的指针所以整个的词法分析过程就是从源程序中获得一个个的单词符号,将这些符号分别填入四张类表中,并且有一个二元式序列构成一个索引,这个索引为以后的语法分析提供处理上的方便为了减少实习量,可以适量地选取,中的一个子集来进行 创建表格表1保留字表内部地址 1234567保 留 字 intifelsewhilefor read write表2符号S表内部地址 12345678910 符号 +-*/=!=内部地址1112131415符号=(),;保留字表
4、包括7个有代表性的保留字,符号包括关系运算符6种(4,5,6,8,9,10,11),算术运算符(1,2,3,4),分隔符三种(14,15),一对圆括号,加上赋值号共15种这两表的内容表明C语言的条件语句,赋值语句,WHILE型循环语句,复合语句,过程及变量说明均可作为源程序例子输入给词法分析程序,标识符表中的每一项包含一个标识符,常数表中的每一项包含一个整常数,后两表的内容都是在词法分析过程中产生的如何从源程序中识别出一个个的单词符号呢?图1中的流图清晰地反映出这一过程图1中,双圆圈的状态表示终态,即能到达终态就代表识别出一个单词符号,而带有号的终态是指处理时应回退一字符.图1扫描程序的状态转
5、换图 算法词法分析器在扫描过程中,依次从源程序中取出源字符,根据图的扫描过程状态转换图,当碰到终态时,即双圆圈的状态时就得到一个单词符号,此时可以根据第一个字符判断单词属于,中哪一类,从而确定单词的单词种别和单词自身的值整个词法分析的算法流程如图三、实现环境 硬件:安装AMD 双核处理器和2G内存的PC机;软件:在Windows XP 操作系统下,并且安装有MC visual c+ 6.0。3. 实验内容 源代码:#include #include #include #include #define START -1#define MAXSIZE 20FILE *fp;FILE *fp1 =
6、fopen(PL词法分析结果.txt,w);char *keyWord = int,if,else,while,for,read,write;char *Operators = +,-,*,/;char *compareOperators = ,=,!=,=;char *endOperators = , , ; , ( , ) ;bool Compare(char SearchStr,int type) switch (type) case 1: for(int i = 0;i = 13;i+) if (strcmp(keyWordi,SearchStr) = 0) return true;
7、break; case 2: for(int i = 0;i = 3;i+) if(strcmp(Operatorsi,SearchStr) = 0) return true; break; case 3: for(int i = 0;i = 5;i+) if(strcmp(compareOperatorsi,SearchStr)=0) return true; break; case 4: for( int i = 0;i = 7;i+) if(strcmp(endOperatorsi,SearchStr) = 0) return true; break; default: break; r
8、eturn false;char LetterProcess (char ch) int i = START; char letterMAXSIZE; while (isalnum(ch)!=0) letter+i = ch; ch = fgetc(fp); ; letteri+1 = 0; if (Compare(letter,1) printf(基本字: %sn,letter); fprintf(fp1,基本字:tt%sn,letter); else printf(标识符: %sn,letter); fprintf(fp1,标识符:tt %sn,letter); return ch;cha
9、r NumberProcess(char ch) int i = START; char numberMAXSIZE; while (isdigit(ch)!=0) number+i = ch; ch = fgetc(fp); if(isalpha(ch)!=0) while(isspace(ch) = 0) number+i = ch; ch = fgetc(fp); numberi+1 = 0; printf(非法标识符:%sn,number); fprintf(fp1,非法标识符:t %sn,number); return ch; numberi+1=0; printf(数字: %sn,
10、number); fprintf(fp1,数字:tt %sn,number); return ch;char OtherProcess(char ch) int i = START; char otherCharMAXSIZE; if (isspace(ch)!=0) ch = fgetc(fp); return ch; while (isspace(ch) = 0) & ( isalnum(ch) = 0) otherChar+i = ch; ch = fgetc(fp); otherChari+1=0; if (Compare(otherChar,2) printf(运算符: %sn,ot
11、herChar); fprintf(fp1,运算符:tt %sn,otherChar); else if (Compare(otherChar,3) printf(比较符: %sn,otherChar); fprintf(fp1,比较符:tt %sn,otherChar); else if (Compare(otherChar,4) printf(界符:%sn,otherChar); fprintf(fp1,界符:tt%sn,otherChar); else printf(非法标示符:%sn,otherChar); fprintf(fp1,非法标识符:tt%sn,otherChar); ret
12、urn ch;int main() char str; printf(词法分析结果如下:nn); if (fp = fopen(PL源程序.txt,r) = NULL) printf(can not open the file!n); exit(0); else str = fgetc(fp); while (str!=EOF) if (isalpha(str) != 0) str = LetterProcess(str); else if (isdigit(str) != 0) str = NumberProcess(str); else str = OtherProcess(str); printf(词法分析结束n); printf(词法分析结果已写入文件n); fclose(fp); fclose(fp1); getchar(); return 0;4.实验结果5. 实验总结分析 通过这次实验是我对程序编译这块有了基本的了解,体会到了程序内部编译时的原理及运行过程,清楚了在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法,也认识到了语言设计的一些基本知识,同时也使我复习了以前的c+编程知识,感觉收获很大