实验任务:
实现识别标识符的词法分析器
实验要求:
根据编译原理理论课教材中图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);
}
else
printf("打开文件成功\n");
if( (out=fopen("result.txt","w")) ==NULL ){
printf("can't open file!\n");
exit(0);
}
else
printf("打开文件成功\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;
}
}
else
if(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");
}