当前位置:文档之家› 词法分析实验报告

词法分析实验报告

词法分析器一、实验目的:通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。

并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。

并依次输出各个单词的内部编码及单词符号自身值。

二、实验要求如源程序为C语言。

输入如下一段:Array main(){int a,b;a = 10;b = a + 20;}#要求输出如右图。

要求:1、将单词分为五种识别关键字:main、if、int、for、while、do、return、break、continue;单词种别码为1。

标识符;单词种别码为2。

常数为无符号整形数;单词种别码为3。

运算符包括:+、-、*、/、=、>、<、>=、<=、!= ;单词种别码为4。

分隔符包括:,、;、{、}、(、);单词种别码为5。

2、使用一符一种的分法关键字、运算符和分界符可以每一个均为一种标识符和常数仍然一类一种三、实验内容1、功能描述改程序是一个实现词法分析的功能,能识别5种单词,其他单词报错。

2、程序结构描述int IsKey(char *Word)关键字匹配函数,查询是否为关键字,若是,返回值为1,否则为0。

int IsAlpha(char c) 查看是否为字母,若是,返回值为1,否则为0。

int IsNum(char c) 查看是否为数字,若是,返回值为1,否则为0。

void scanner(FILE *fp) 扫描函数,扫描程序中的字符串并调用上述三种函数检查是否是字母、数字,是否是关键字,并输出。

fseek(fp,-1,1)回退一个字符。

fgetc(fp)从数据流中区下一个字符。

fopen 文件打开函数,返回指向文件第一个字符的指针四、实验结果测试内容为main(){int a,b;a = 10;b = a + 20; }#结果测试代码为void main() {int a,b;if(a = 10;)b += 20; c=%;}#结果为测试代码main(){int a,b;if(a <= "10")b += 20; c=%@; return 0;}#结果五、实验过程记录1、因为用到回退函数fseek(),而以前没有用过这个函数,所以开始时很苦恼,不知道如何回退一个字符,后来问了同学,才明白原来有这么一个函数,顿时豁然开朗。

2、本次试验中word[20]保存字符串时,不能正确保存,总是出错,原因是while(IsNum(ch)||IsAlpha(ch)){Word[i]=ch;i++;ch=fgetc(fp);}中,i++与Word[i]=ch;次序不对,后来多次思索,发现问题。

六、实验总结本次实验花了将近一个下午才完成。

在纸上设计的时间大约40分钟,剩下的时间是录入和调试。

本次实验使我认识到,一段时间搁置,不编程序,水平会下降,好多有关c语言的知识会忘掉,所以以后我会经常写写程序。

另外,通过本次实验,我又进一步加深对词法分析原理的理解。

总的来说,获益匪浅!附录#include<>#include<>#include<>#include<>#include<>Char*Key[9]={"void","main","int","if","then","else","return","break","continue"}; char ch; // 存储识别出的单词流int IsAlpha(char c) { //判断是否为字母if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1;else return 0;}int IsNum(char c){ //判断是否为数字if(c>='0'&&c<='9') return 1;else return 0;}int IsKey(char *Word){ //识别关键字函数int m,i;for(i=0;i<8;i++){if((m=strcmp(Word,Key[i]))==0)return 1;}return 0;}void scanner(FILE *fp){ //扫描函数char Word[20]={'\0'};char ch;int i,c;ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符if(IsAlpha(ch)){ //判断该字符是否是字母Word[0]=ch;ch=fgetc(fp);i=1;while(IsNum(ch)||IsAlpha(ch)){ //判断该字符是否是字母或数字Word[i]=ch;i++;ch=fgetc(fp);}Word[i]='\0'; //'\0' 代表字符结束(空格)fseek(fp,-1,1); //回退一个字符c=IsKey(Word); //判断是否是关键字if(c==0) cout<<"(2,"<<Word<<')'<<endl;//不是关键字else cout<<"(1,"<<Word<<')'<<endl; //输出关键字}else //开始判断的字符不是字母if(IsNum(ch)){ //判断是否是数字Word[0]=ch;ch=fgetc(fp);i=1;while(IsNum(ch)){Word[i]=ch;i++;ch=fgetc(fp);}Word[i]='\0';fseek(fp,-1,1); //回退cout<<"(3,"<<Word<<')'<<endl;}else //开始判断的字符不是字母也不是数字{Word[0]=ch;switch(ch){case'[':case']':case'(':case')':case'{':case'}':case',':case'"':case';':cout<<"(5,"<<Word<<')'<<endl; break;case'+':ch=fgetc(fp);if(ch=='='||ch=='+'){Word[1]=ch;cout<<"(4,"<<Word<<')'<<endl;//运算符"+="或判断结果为"++"}else {fseek(fp,-1,1);cout<<"(4,"<<Word<<')'<<endl;//判断结果为"+"}break;case'-':ch=fgetc(fp);if(ch=='='||ch=='-'){Word[1]=ch;cout<<"(4,"<<Word<<')'<<endl; }else {fseek(fp,-1,1);cout<<"(4,"<<Word<<')'<<endl; //判断结果为"-"}break;case'*':case'/':case'!':case'=':ch=fgetc(fp);if(ch=='='){Word[1]=ch;cout<<"(4,"<<Word<<')'<<endl;}else {fseek(fp,-1,1);cout<<"(4,"<<Word<<')'<<endl;}break;case'<':ch=fgetc(fp);if(ch=='='||ch=='<'){Word[1]=ch;cout<<"(4,"<<Word<<')'<<endl;}else {fseek(fp,-1,1);cout<<"4\t"<<Word<<endl; //判断结果为"<"}break;case'>':ch=fgetc(fp);if(ch=='='||ch=='>'){Word[1]=ch;cout<<"(4,"<<Word<<')'<<endl;}else {fseek(fp,-1,1);cout<<"(4,"<<Word<<')'<<endl;}break;default:cout<<"(无法识别字符,"<<Word<<')'<<endl; break;}}}void main(){FILE *fp;fp=fopen("c:\\","r");if(fp==NULL) //读取文件内容,并返回文件指针,该指针指向文件的第一个字符{cout<<"读入文件错误!"<<endl;exit(0);}cout<<"******************* 词法分析结果如下*******************\n";while(ch!='#'){ch=fgetc(fp);if(ch=='#') break; //文件以#结尾,作为扫描结束条件else if(ch==' '||ch=='\t'||ch=='\n'){} //忽略空格,空白,和换行else{fseek(fp,-1,1); //回退一个字节开始识别单词流scanner(fp);}}}。

相关主题