1、编译原理实验报告1编译原理实验报告 专业:计算机科学与技术 班级:08-01班姓名:朱小燕 学号:200807010156一、实验目的 通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。二、词法分析器的实现1、词法分析过程的考虑 词法分析器的任务是将程序源代码看做一个字符串,只需从中分离出一个个具有独立意义的单词(包括标识符,符号和常量)即可,而无需考虑其在上下文环境中的正确性。 基于此认识,词法分析的过程可如下描述: 本程序中用户源程序存储在文件“E:prog.txt”文件中,程序首先调用readFromFile()函数将源程序代码
2、从文件中读出,放到数组中暂存,然后主函数调用scaner()函数对其进行逐个扫描,分离出的每个独立单词进行分类判断,构成二元组形式,再将其输出的文件“E:result.txt”中进行保存。2、各种单词符号对应的种别码0 标识符21 ret42 +63 |1 整型常量22 sho43 -64 ?:2 auto23 sig44 -65 =3 brea24 siz45 *66 +=4 case25 sta46 &67 -=5 char26 str47 /68 *=6 cons27 swi48 %69 /=7 cont28 typ49 +70 %=8 defa29 uni50 -71 =9 do30
3、uns51 72 73 &=11 els32 vol53 74 =12 enu33 whi54 76 ,14 flo35 )56 =77 15 for36 57 =78 ;16 got37 58 !=79 :17 if38 -59 &80 18 int39 .60 81 19 lon40 !61 |82 /20 reg41 62 &3、关键数据结构的描述 计数器count:将二元组写入文件时通过count判断是否是首次写入,若是则清空文件,否则追加写入; 字符串常量endStr:其值为“end”,在分析判断每一单词的种类时,该字符串作为rwtab表的结束标志; 数组prog200:暂存从文件中
4、读取的源程序代码,该词法分析器约定源代码长度不超过199; 数组token20:暂存每次分离出的单个具有独立意义的单词,该词法分析器约定每个单词的长度不超过19; 结构体result:存放一个单词的种别码和单词本身的值,在写入文件时以结构体中的元素为单位依次写入;4、程序结构的描述本程序采用结构化设计方法,共有两个文件,六个模块,分别介绍如下:rwtab.h文件包含一个模块,即各种单词符号对应的种别码,作为外部文件被main.cpp文件引用。main.cpp文件包含以下五个平行模块:1) main()函数:程序入口,控制整个程序的执行流程;2) scanner()函数:词法扫描程序;3) pr
5、int()函数:由main()函数调用,判别每一个已识别单词的种类,并将其以结构体形式标准化;4) readFromFile()函数:由main()函数调用,将源程序代码读出,并暂存至数组prog200中;5) writeToFile()函数:由main()函数调用,把标准的二元组写入文件中。三、程序运行截屏四、源代码 #include#include#include ctype.h #include string.h/*判断字符区域*开始*/int characters_exist=0; /*用来判断是否是纯数字*/int countoffinal=0; /*finalresult函数执行的
6、次数*/int word( char ch) /*判断是否为字母*/ int ch_exist=0; if(isalpha(ch) ch_exist=1; characters_exist=1; return(ch_exist);int digit(char ch) /*判断是否为数字*/ int dig_exist=0; if(isdigit(ch) dig_exist=1; return (dig_exist);int delimiter(char ch) /*判断是否是分界符*/ int del_exist=0; int i; char delimiters13=+,-,*,/,;,(,
7、),=, ,:,#; for(i=0;i13;i+) if(ch=delimitersi) del_exist=1; break; return(del_exist);int keywordcompare(char key,char keyword) /*比较关键字*/ int m=0; int equal=1; while(keywordm!=#) if(keym=keywordm) m+; else equal=0; break; return(equal); int keyword(char key) /*判断是否是关键字 */ char ifkeyword3=i,f,#; char e
8、lsekeyword5=e,l,s,e,#; char thenkeyword5=t,h,e,n,#; char forkeyword4=f,o,r,#; char whilekeyword6=w,h,i,l,e,#; char dokeyword3=d,o,#; char andkeyword4=a,n,d,#; char notkeyword4=n,o,t,#; char orkeyword3=o,r,#; int keyword_exist=0; if (keywordcompare(key,ifkeyword)|keywordcompare(key,elsekeyword)|keywo
9、rdcompare(key,thenkeyword)|keywordcompare(key,forkeyword)|keywordcompare(key,whilekeyword)|keywordcompare(key,dokeyword)|keywordcompare(key,andkeyword)|keywordcompare(key,notkeyword)|keywordcompare(key,orkeyword) keyword_exist=1; return(keyword_exist); /*判断字符区域*结束*/*写入文件区域*开始*/void writetofile(char
10、cha) /*将数组cha写入文件Dualistic_formula*/ int i=0; int numberofspace=0; /*用来实现写入文件时跳过过多的空格*/ FILE * fpa; if(fpa=fopen(Dualistic_formula,a)=NULL) printf(cannot open file Dualistic_formulan); exit(0); while(chai!=#&numberofspace=1) /*数组不结束且连续空格数最多为2时满足循环条件*/ if(chai= ) numberofspace+; else numberofspace=0;
11、 fputc(chai,fpa); i+; fclose(fpa); void keywordtofile(char cha) /*将关键字写入文件keyword*/ int i=0; int numberofspace=0; /*用来实现写入文件时跳过过多的空格*/ FILE * fpa; if(fpa=fopen(keyword,a)=NULL) printf(cannot open file keywordn); exit(0); while(chai!=#&numberofspace=1) /*数组不结束且连续空格数最多为2时满足循环条件*/ if(chai= ) numberofsp
12、ace+; else numberofspace=0; fputc(chai,fpa); i+; fclose(fpa); void wordstofile(char cha) /*将标识符写入文件words*/ int i=0; int numberofspace=0; /*用来实现写入文件时跳过过多的空格*/ FILE * fpa; if(fpa=fopen(words,a)=NULL) printf(cannot open file wordsn); exit(0); while(chai!=#&numberofspace=1) /*数组不结束且连续空格数最多为2时满足循环条件*/ if(chai= ) numberofspace+; else numberofspace=0; fputc(chai,fpa); i+; fclose(fpa); void digittofile(char cha) /*将数字写入文件digit*/
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1