#include
#include
/*下面定义保留字表,为简化程序,使用字符指针数组保存所有保留字*/
/*如果想增加保留字,可继续添加,并修改保留字树目keywordSum*/
#define keywordSum 8
char *keyword[keywordSum]={"if","else","for","while","do","int","read","write"};
/*下面定义纯单分界符,如需要可添加*/
char singleword[50]="+-*(){};,:";
/*下面定义双分界符的首字符*/
char doubleword[10]="><=!";
extern char Scanin[300],Scanout[300];
/*用于接收输入输出文件名,在test_main.c中定义*/
extern FILE *fin,*fout;/*用于指向输入输出文件的指针,在test_main.c中定义*/
int TESTscan()/*词法分析函数*/
{
char ch,token[40];/*ch为每次读入的字符,token用于保存识别出的单词*/
int es=0,j,n;/*es错误代码,0表示没有错误*/
/*j,n为临时变量,控制组合单词时的下标等*/
printf("qing shu ru yuan cheng xu wen jian ming(bao kuo lu jing):");/*请输入源程序文件名(包括路径)*/
scanf("%s",Scanin);
printf("qing shu ru ci fa fen xi shu chu wen jian ming(bao kuo lu jing):");/*请输入词法分析输出文件名(包括路径)*/
scanf("%s",Scanout);
if((fin=fopen(Scanin,"r"))==NULL)/*判断输入文件名是否正确*/
{
printf("\nda kai ci fa fen xi shu ru fen xi wen jian chu cuo!\n");/*打开词法分析输入分析文件出错*/
return(1);/*输入文件出错返回错误代码1*/
}
if((fout=fopen(Scanout,"w"))==NULL)/*判断输出文件名是否正确*/
{
printf("\nchuang jian ci fa fen xi shu chu wwen jian chu cuo!\n");/*创建词法分析输出文件出错*/
return(2);/*输出文件出错返回错误代码2*/
}
ch=getc(fin);
while(ch!=EOF)
{
while(ch==' '||ch=='\n'||ch=='\t') ch=getc(fin);
if(isalpha(ch))/*如果是字母,则进行标识符处理*/
{
token[0]=ch;j=1;
ch=getc(fin);
while(isalnum(ch))/*如果是字母数字则组合标识符*/
/*如果不是则标识符组合结束*/
{
token[j++]=ch;/*组合的标识符保存在token中*/
ch=getc(fin);/*读下一个字符*/
}
token[j]='\0';/*标识符组合结束*/
/*查保留字*/
n=0;
while((n if(n>=keywordSum)/*不是保留字,输出标识符*/
fprintf(fout,"%s\t%s\n","ID",token);/*输出标识符符号*/
else/*是保留字,输出保留字*/
fprintf(fout,"%s\t%s\n",token,token);/*输出保留字符号*/
}
else if(isdigit(ch))/*数字处理*/
{
token[0]=ch;j=1;
ch=getc(fin);/*读下一个字符*/
while(isdigit(ch))/*如果是数字则组合整数;如果不是则整数组合结束*/
{
token[j++]=ch;/*组合整数保存在token中*/
ch=getc(fin);/*读下一个字符*/
}
token[j]='\0';/*整数组合结束*/
fprintf(fout,"%s\t%s\n","NUM",token);/*输出整数符号*/
}else if(strchr(singleword,ch)>0)/*单分界符处理*/
{
token[0]=ch;token[1]='\0';
ch=getc(fin);/*读下一个符号以便识别下一个单词*/
fprintf(fout,"%s\t%s\n",token,token);/*输出单分界符符号*/
}else if(strchr(doubleword,ch)>0)/*双分界符处理*/
{
token[0]=ch;
ch=getc(fin);/*读下一个字符判断是否为双分界符*/
if(ch=='=')/*如果是=,组合双分界符*/
{
token[1]=ch;token[2]='\0';/*组合双分界符结束*/
ch=getc(fin);/*读下一个符号以便识别下一个单词*/
}else/*不是=则为单分界符*/
token[1]='\0';
fprintf(fout,"%s\t%s\n",token,token);/*输出单或双分界符符号*/
}else if(ch=='/')/*注释处理*/
{
ch=getc(fin);/*读下一个字符*/
if(ch=='*')/*如果是*,则开始处理注释*/
{
char ch1;
ch1=getc(fin);/*读下一个字符*/
do
{
ch=ch1;ch1=getc(fin);/*删除注释*/
}
while ((ch!='*'||ch1!='/')&&ch1!=EOF);/*直到遇到注释结束符* /或文件尾*/
ch=getc(fin);/*读下一个符号以便识别下一个单词*/
}else/*不是*则处理单分界符*/
{
token[0]='/';token[1]='\0';
fprintf(fout,"%s\t%s\n",token,token);/*输出单分界符*/
}
}else/*错误处理*/
{
token[0]=ch;token[1]='\0';
ch=getc(fin);/*读下一个符号以便识别下一个单词*/
es=3;/*设置错误代码*/
fprintf(fout,"%s\t%s\n","ERROR",token);/*输出错误符号*/
}
}
fclose(fin);/*关闭输入输出文件*/
fclose(fout);
return(es);/*返回主程序*/
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12993749/viewspace-353262/
,如需转载,请注明出处,否则将追究法律责任。