《编译原理词法分析实验报告(共15页).doc》由会员分享,可在线阅读,更多相关《编译原理词法分析实验报告(共15页).doc(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上词法分析实验报告 学院:计算机科学与技术 班级:软件工程1203班 学号:1 2 0 8 0 1 0 3 0 3 姓名: 王 青 枝词法分析实验报告一、 题目 词法分析二、实验目的1) 加深对词法分析器的工作过程的理解;2) 加强对词法分析方法的掌握;3) 能够采用一种编程语言实现简单的词法分析程序;4) 能够使用自己编写的分析程序对简单的程序段进行词法分析。二、 单词 保留字 运算符 界符(表格)1) 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。2) 依次输出各个单词的内部单词种别及单词符号自
2、身值。3) 单词的文法表示:=;:=|;:=+|-:=*|/:=|#|=:=a|b|X|Y|Z:=0|1|2|8|94) 要求:保留字: 单词种别码为1。包括if、int、for、while、do、return、break、continue;标识符: 单词种别码为2。常 数: 单词种别码为3。(常数为无符号整形数)运算符: 单词种别码为4。包括+、-、*、/、=、=、=、!= ;分隔符: 单词种别码为5。包括,、;、(、);四、实验要求1实验环境要求 在C或C+运行环境中执行2. 对单词的构词规则有明确的定义;3. 编写的分析程序能够正确识别源程序中的单词符号;4. 识别出的单词以的形式保存在
3、符号表中;5. 对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;五、词法分析总体架构 大的流程图 在词法分析中,先以只读方式读取一个文件,自文件头开始扫描文本,滤去开头的空格、回车符、换行符等!读取的字符送入缓冲区。扫描第一个字符,看匹配的类型,并进行相应的类型分析,满足判断类型时,输出其种别码和值。判断时要注意保留字和识别符之间的不同,单目运算符和双目运算符之间的不同。因此可用指针进行处理。还必须熟悉字符串函数的使用。并要对非法字符作出错误提示。文本扫描结束要判断词法分析是否成功。最后是关闭文件,释放指针。其中:常量、变量、数据结构的定义
4、: 本程序中用keyword数组来定义保留字if、int、for、while、do、return、break、continue;用yunsuan数组来定义运算符+、-、*、/、=、 、=、=、!=;用fenge数组来定义分隔符包括:,、;、(、)1- 表示保留字 2-表示标识符 3-表示常数 4-表示运算符 5-表示分隔符Output是输出函数。函数使用:字符函数:int isalpha(int ch)若ch是字母(A-Z,a-z)返回非0值,否则返回0int isalnum(int ch) 若ch是字母(A-Z,a-z)或数字(0-9)返回非0值,否则返回0int isdigit(int c
5、h) 若ch是数字(0-9)返回非0值,否则返回0字符串函数:strcmp(const char *s1,const char *s2)比较字符串s1与s2的大小,并返回s1-s2strchr(const char *string, int c)函数就是在字符串中搜索指定字符。第一个形参就是要搜索的字符串,第二个是被搜索的字符。如果找到了该字符就返回该字符第一次出现的内存地址。如果没有找到就返回NULL(也就是0)。fseek(文件类型指针,位移量,起始点);起始点指文件开头处,文件当前位置,文件尾,分别用0,1,2来表示 fwrite()读取字符:读出单词的每一个字符,组成单词,分析类型。读
6、取单词前后的多余空白要滤去。程序大的流程图如下图:六、 细化流程图:七、调试过程 抓图,输入,输出,结果(1)程序无错误,正确运行时如下图:(2)调试的时候需要在文件位置建一个文本文档wqz.txt文件,内容如下:#include void main () int value = 0; while (value !;#define fenge 8char fenfenge=.;();char ch;int i,k;char buff20;void output(int ,char*);void scan(FILE *fp) int j; ch=fgetc(fp); while(ch= |ch=
7、n|ch=t) ch=fgetc(fp); if(isalpha(ch) /*输入的是字母,进行 标识符处理*/ buff0=ch; i=1; ch=fgetc(fp); while(isalnum(ch) /*如果是字母数字则组合,否则结束*/ buffi=ch; i+; ch=fgetc(fp); buffi=0; /*查找保留字*/ fseek(fp,-1,1); j=0; while(j=keyword) output(2,buff); else output(1,buff); else if(isdigit(ch) buff0=ch; ch=fgetc(fp); i=1; while
8、(isdigit(ch) /*如果是数字则整合数字*/ buffi=ch; i+; ch=fgetc(fp); buffi=0; /*整数整合结束*/ fseek(fp,-1,1); output(3,buff); else if(strchr(fen,ch)0) /*判断分隔符*/ buff0=ch; ch=fgetc(fp); buff1=0; fseek(fp,-1,1); output(5,buff);else if(strchr(yun,ch)0) /*判断运算符*/ buff0=ch; if(ch=) /*双运算符*/ ch=fgetc(fp); if(ch=) output(4,
9、=); else fseek(fp,-1,1); output(4,=); else if(ch=) ch=fgetc(fp); if(ch=) output(4,=); else fseek(fp,-1,1); output(4,); else if(ch=) ch=fgetc(fp); if(ch=) output(4,=); else fseek(fp,-1,1); output(4,); else if(ch=!) ch=fgetc(fp); if(ch=) output(4,!=); else fseek(fp,-1,1); output(0,error!); else ch=fge
10、tc(fp); buff1=0; fseek(fp,-1,1); output(4,buff);else /*无法识别的字符*/ buff0=ch; buff1=0; ch=fgetc(fp); fseek(fp,-1,1); printf(t非法字符%sn,buff);void save()FILE *out; out=fopen(out.txt,w+); while (gets(buff) fprintf(out,%sn,ch); fclose(out);void output(int n,char *m) /*输出格式*/ printf(n,n,m);void main()FILE *f
11、p; char filename20;printf(数据类型定义规则:n); printf(保留字-1 标识符-2 常数-3 运算符-4 分隔符-5n); printf(please input the file name which you want to open: ); scanf(%s,&filename); fp=fopen(filename,r); /*以只读方式打开指定文件*/ if(fp=fopen(filename,r)=NULL) /*文件不存在输出错误*/ printf(File does not exist!check it again); else printf(n); while(ch!=EOF) scan(fp); printf(The analysis is over.n); printf(Thanks for using this software,have a good time!n); save(); fclose(fp); getchar();专心-专注-专业
限制150内