实验任务:
实现识别标识符的词法分析器
实验要求:
根据编译原理理论课教材中图2.3“标识符的转换图”,用C语言编写识别标识符的词法分析器,以文本文件为输入,控制台(或文件)输出识别出的每个标识符。
实验内容:
将txt文件里的内容作为输入的字符串,去除掉文本中的空格后,按照种别码进行识别判断,用自定义函数数字判断、字母判断和符号判断作为标识符和关键字的判断工具。
运行结果如图:
主要代码:
源代码
输入
intd+asd,j48494h>jkasinteia2main31012><-=07,0x16
输出
关键字:int
标识符:d
标识符:asd
标识符:j48494h
标识符:jkasinteia2main31012
标识符:x16
#include<stdio.h>
#include<string.h>
#include<stdlib.h>void main(){FILE *in,*out;char w;int flag;char str;char words[100][100]={'\0'};//最多存放长度为100的100个单词int i=0,j=0;char letter[10000];//存放文件取出的字符,最长10000 int length=0;//所有字符的长度int num=0;//当前所在位置if( (in=fopen("example.txt","r")) ==NULL ){printf("can't open file!\n");exit(0);}elseprintf("打开文件成功\n");if( (out=fopen("result.txt","w")) ==NULL ){printf("can't open file!\n");exit(0);}elseprintf("打开文件成功\n");while( !feof(in) ){w=fgetc(in);if(w!=' '){letter[length]=w;length++;} //去掉程序中的空格}flag=1;while(flag){for(j=0;num<length;num++,j++){str=letter[num];if( str>='a' && str<='z' || str>='A' && str<='Z' || str=='_' || (j!=0 && str>='0' && str<='9') ){words[i][j]=letter[num];if( !(strcmp(words[i],"main")&&strcmp(words[i],"int")&&strcmp(words[i],"if")&&strcmp(words[i],"else")&&strcmp(words[i],"while")&&strcmp(words[i],"do")&&strcmp(words[i],"then")) ){//若以此首字母开头 先组成了关键字 则先输出该关键字 fputs("关键字:",out);fputs(words[i],out);fputs("\n",out);i++;num++;break;}}elseif(words[i][0]=='\0'){num++;break;}else{fputs("标识符:",out);fputs(words[i],out);fputs("\n",out);num++;i++;break;}}if(num==length)flag=0;}fclose(in);//关闭文件 fclose(out);//关闭文件 printf("完成,请查看!\n");
}