#include<iostream>
#include<fstream>
#include<string>
using namespace std;
//关键字描述
string key[9]={"float","int","if","for","while","do","return","break","continue"};
//运算符描述
string optr[12]={"+","-","*","/","!","=",">","<",">=","<=","==","!="};
//分界符描述
string separator[6]={",",";","{","}","(",")"};
char ch;
//判断是否为保留字
bool IsKey(string ss)
{
int i;
for(i=0;i<9;i++)
{
if(key[i].compare(ss) == 0)
return true;
}
return false;
}//判断是否字母
bool IsLetter(char c)
{
if(((c>='a')&&(c<='z'))||((c>='A')&&(c<='Z')))
return true;
else
return false;
}
//判断是否为数字
bool IsDigit(char c)
{
if(c>='0'&&c<='9')
return true;
else
return false;
}
//判断是否为运算符
bool IsOptr(string ss)
{
int i;
for(i=0;i<12;i++)
{if(optr[i].compare(ss) == 0)
return true;
}
return false;
}
//判断是否为分界符
bool IsSeparator(string ss)
{
int i;
for(i=0;i<6;i++)
{
if((separator[i].compare(ss) == 0)
)
return true;
}
return false;
}
//词法分析函数
void analyse(ifstream in,ofstream out)
{
string st="";
//char ch;
while((ch=in.get())!=EOF)
{
st="";
if((ch==' ')||(ch=='\t')||(ch=='\n'))//空格,tab健,换行,处理
{}
else if(IsLetter(ch)) //保留字、标识符的处理
{
while(IsLetter(ch)||IsDigit(ch))
{
st+=ch;
ch=in.get();
}
in.seekg(-1,ios::cur);//文件指针(光标)后退一个字节
if(IsKey(st)) //为保留字
out<<st<<"\t\t\t"<<"保留字"<<endl;
else //为标识符
out<<st<<"\t\t\t"<<"标识符"<<endl;
}
else if(IsDigit(ch)) //无符号整数处理
{
if(IsDigit(ch))
{int m=0;int n=0;int z=1;
st+=ch;
while((ch!=' ')&&(ch!='\t')&&(ch!='\n'))
{ch=in.get();z++;
if(ch==';'||ch==','||ch=='}'||ch=='*')break;
if((ch!=' ')&&(ch!='\t')&&(ch!='\n')){
st+=ch;}
if (IsLetter(ch)){n++;}
else if(ch=='.')
{
m++;
}
}
if(m>1||n>=1)
{
out<<st<<"\t\t\t"<<"无法识别"<<endl;
in.seekg(-1,ios::cur);
}
else if(m==1&&n==0)
{
if(st[z-2]=='.')
{ out<<st<<"\t\t\t"<<"无法识别"<<endl;
in.seekg(-1,ios::cur);
}
else
{
out<<st<<"\t\t\t"<<"无符小数"<<endl;
in.seekg(-1,ios::cur); }
}
else if(m==0&&n==0){
out<<st<<"\t\t\t"<<"无符号整数"<<endl;
in.seekg(-1,ios::cur); }
}
}
else
{
st+=ch;
if(IsOptr(st)) //运算符处理
{
ch=in.get();
if(ch=='=')//对可能是“>=,<=,==,!=”的情况(1)的处理
{
string sr(st);
sr+=ch;
if(IsOptr(sr))//是情况(1)
out<<sr<<"\t\t\t"<<"运算符"<<endl;}
else//不是情况(1)
{
out<<st<<"\t\t\t"<<"运算符"<<endl;
in.seekg(-1,ios::cur);
}
}
else if(IsSeparator(st))//分隔符处理
{
out<<st<<"\t\t\t"<<"分隔符"<<endl;
}
else {out<<st<<"\t\t\t"<<"无法识别"<<endl;}
}
}
}
void main()
{
ifstream in;ofstream out;
in.open("test.txt");out.open("result.txt");
if(!in)
{
return;
}
if(!out)
{
return;
}
analyse(in,out);
out<<endl;
in.close();out.close();
}