words.cpp
来自「词法分析器真的很不错谢谢你若喜欢就下载吧要支持我啊」· C++ 代码 · 共 282 行
CPP
282 行
#include<iostream.h>
#include<string.h>
#include<fstream.h>
#include<stdlib.h>
void Scanner(); //识别单词
int iskeywords(char[]); //识别字母为关键字
int isidnumber(char[]); //识别字母
int isnum(char[]); //合法数字
char ischar(char,ifstream,ofstream); //识别保留字和标识符
char isnumber(char,ifstream,ofstream); //识别整数
char isanotation(char,ifstream,ofstream); //处理符号
char isother(char,ifstream,ofstream); //识别其他特殊字符
char *keywords[14]={"int","char","float","void","const","for","if","else",
"then","while","switch","break","begin","end"};
int sum=1,count=1;
void main()
{
cout<<"词法分析器:"<<endl;
Scanner();
}
void Scanner() //识别单词
{
char fileName[30];
ofstream outstuf;
cout<<"输入要分析的文件名:"<<endl;
cin>>fileName;
ifstream infile(fileName,ios::in);
ofstream outfile("out.txt",ios::out);
ofstream outid("id.txt",ios::out);
ofstream outnum("num.txt",ios::out);
outid.close();
outnum.close();
char s=infile.get();
while(s!=EOF)
{
if(s==' '||s=='\t')
{
s=infile.get();continue;
}
else if(s=='\n')
{
s=infile.get();sum++;continue;
}
else if((s>='a'&&s<='z')||(s>='A'&&s<='Z'))
{
s=ischar(s,infile,outfile);continue;
}
else if(s>='0'&&s<='9')
{
s=isnumber(s,infile,outfile);continue;
}
else if((s=='+')||(s=='-')||(s=='*')||(s=='%')||(s=='(')||(s==')')||(s=='[')
||(s==']')||(s=='<')||(s=='>')||(s=='=')||(s=='!')||(s=='%')||(s=='|')||(s=='&'))
{
s=isanotation(s,infile,outfile);continue;
}
else if(s=='/')
{
s=isother(s,infile,outfile);continue;
}
else
{
cout<<"第"<<sum<<"行有错误! "<<s<<"字符非法!"<<endl;
s=infile.get();continue;
}
}
}
int iskeywords(char temp[]) //识别字母为关键字
{
for(int i=0;i<14;i++)
{
if(strcmp(keywords[i],temp)==0)
{
return 1;
}
}
return 0;
}
int isidnumber(char temp[]) //识别字母
{
int i=0;
char str[20];
ifstream inid("id.txt",ios::in);
while(inid>>i>>str)
{
if(strcmp(str,temp)==0)
return i;
}
inid.close();
ofstream outid("id.txt",ios::app);
outid<<++i<<'\t'<<temp<<'\n';
outid.close();
return i;
}
char ischar(char s,ifstream infile,ofstream outfile) //识别保留字和标识符
{
int i=0;
char temp[30];
while((s>='a'&&s<='z')||(s>='A'&&s<='Z')||(s>='0'&&s<='9'))
{
temp[i]=s;
i++;
s=infile.get();
}
temp[i]='\0';//字符结束
if(iskeywords(temp)!=0)
{
outfile<<"("<<temp<<",_)"<<'\n';
return s;
}
else
{
outfile<<"(ID,"<<isidnumber(temp)<<")"<<'\n';
return s;
}
cout<<temp<<"错误!!"<<endl;
return s;
}
int isnum(char temp[]) //合法数字
{
int i=0;
char str[20];
ifstream innum("num.txt",ios::in);
while(innum>>i>>str)
{
if(strcmp(str,temp)==0)
return i;
}
innum.close();
ofstream outnum("num.txt",ios::app);
outnum<<++i<<'\t'<<temp<<'\n';
outnum.close();
return i;
}
char isnumber(char s,ifstream infile,ofstream outfile) //识别整数
{
int i=0,j=1,k=0;
char temp[30];
while(s>='0'&&s<='9')
{
temp[i]=s;
i++;
s=infile.get();
while((s>='a'&&s<='z')||(s>='A'&&s<='Z'))
{
cout<<"第"<<sum<<"行有"<<j<<"错误!"<<endl;
s=infile.get();
j++;
k=1;
}
}
temp[i]='\0';//字符结束
if(k==0)
outfile<<"(Num,"<<isnum(temp)<<")"<<'\n';
return s;
}
char isanotation(char s,ifstream infile,ofstream outfile) //处理符号
{
if((s=='+')||(s=='-')||(s=='*')||(s=='%')||(s=='(')||(s==')')||(s=='[')||(s==']'))
{
char t;
t=s;
s=infile.get();
if(s=='=')
{
outfile<<"("<<t<<"="<<","<<"_)"<<'\n';
s=infile.get();
return s;
}
else
{
outfile<<"("<<t<<","<<"_)"<<'\n';
return s;
}
}
else if((s=='<')||(s=='>')||(s=='='))
{
char t;
t=s;
s=infile.get();
if(s=='=')
{
outfile<<"("<<"rlop"<<","<<"="<<t<<"=)"<<'\n';
s=infile.get();
return s;
}
else
{
outfile<<"("<<"rlop"<<","<<t<<")"<<'\n';
return s;
}
}
else if(s=='|')
{
char t;
t=s;
if(s=='|')
{
outfile<<"("<<"or"<<","<<"_)"<<'\n';
s=infile.get();
return s;
}
else
{
cout<<"第"<<sum<<"行有错误!"<<t<<"字符非法!"<<endl;
s=infile.get();
return s;
}
}
else if(s=='&')
{
char t;
t=s;
if(s=='&')
{
outfile<<"("<<"and"<<","<<"_)"<<'\n';
s=infile.get();
return s;
}
else
{
cout<<"第"<<sum<<"行有错误!"<<t<<"字符非法!"<<endl;
s=infile.get();
return s;
}
}
else if(s=='!')
{
char t;
t=s;
if(s=='=')
{
outfile<<"("<<"rlop"<<","<<"!="<<")"<<'\n';
s=infile.get();
return s;
}
else
{
outfile<<"(<"<<"not"<<","<<"_)"<<'\n';
s=infile.get();
return s;
}
}
}
char isother(char s,ifstream infile,ofstream outfile) //识别其他特殊字符
{
int i=0;
s=infile.get();
if(s=='*')
{
s=infile.get();
while(s!=EOF)
{
if(s=='*')
{
s=infile.get();
if(s=='/')
{
s=infile.get();
return s;
}
}
s=infile.get();
if(s==EOF)
{
cout<<"第"<<sum<<"行错误!"<<endl;
break;
}
}
return s;
}
else
{
if(s=='=')
outfile<<"("<<"/="<<","<<"_)"<<'\n';
else
outfile<<"("<<"/"<<","<<"_)"<<'\n';
return s;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?