#include<stdio.h>
#include<iostream.h>
#include<ctype.h>
#include<string.h>
#define keywordsum 8
char *keyword[keywordsum]={"if","else","for","while","do","int","char","float"};//关键字表
char singleword[20]="+-*(){};,:";//单分界符号
char doubleword[10]="><=";//双分界符
FILE *fin,*fout;//文件指针
int Sort(char);
void main()
{
char Scanin[300],Scanout[500];//输入文件和输出文件
char ch;
int i=1;//词法分析是否正确的标志
cout<<"请输入源代码所在的文件名:"<<endl;
cin>>Scanin;
if((fin=fopen(Scanin,"r"))==NULL)
{
cout<<"不能打开源文件,error!~!,系统将退出..."<<endl;
return;
}
cout<<"请输入存放词法分析结果的文件名:"<<endl;
cin>>Scanout;
if((fout=fopen(Scanout,"w"))==NULL)
{
cout<<"不能打开该文件失败返回!~!"<<endl;
return;
}
ch=getc(fin);
while(ch!=EOF)
i=Sort(ch);
if(i)
cout<<"编译成功!~!"<<endl;
else
cout<<"编译失败!~!"<<endl;
fclose(fin);
fclose(fout);
}
int Sort(char ch)
{
char token[20];//存放token序列的数组
int i,j,n;
while(ch==' '||ch=='\t'||ch=='\n')
ch=getc(fin);//
if(isalpha(ch)) //标志符或关键字处理
{
token[0]=ch;
j=1;
ch=getc(fin);
while(isalnum(ch))//判断ch是否为字母或数字
{ //组合关键字或标志符
token[j++]=ch;
ch=getc(fin);
}
token[j]='\0';//标志符或关键字组合结束
n=0;
while(n<keywordsum&&strcmp(token,keyword[n])) 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;
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]='=';//组合双分界符
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);
while((ch!='*'||ch1!='*')&&ch1!=EOF)//读下一字符直到遇到注释符或文件结束
{
ch=ch1;//注释符处理
ch1=getc(fin);
}
ch=getc(fin);//处理下个单词
}
else
{
token[0]=ch;//'/'为单分界符
token[1]='\0';
ch=getc(fin);
fprintf(fout,"%s\t%s\n",token,token);
}//else
}//if
else //处理不正常情况
{
token[0]=ch;//ch为非法字符
token[1]='\0';
ch=getc(fin);
i=0;
fprintf(fout,"%s\t%s\n","ERROR",token);//输出错误信息
}
return i;
}
我这个程序是个词法分析器,输入的文件分别存放源程序代码,输出的文件存放token序列,在C语言中我这种文件该用什么后缀呀,我在执行的时候CPU和内存占用非常高,哪位高手试试,帮我查找一下原因...
不胜感激!~!希望大家共同进步
----------------解决方案--------------------------------------------------------