📄 cifafenxiqi.cpp
字号:
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<process.h> /*头文件*/
void init();
char *DchangeB(char *buf);
int search(char *buf,int type,int command);
void intdeal(char *buffer);
void chardeal(char *buffer);
void errordeal(char error,int lineno);
void scanner();
void init()
{
char *key[]={" ","auto","break","case","char","const","continue","default","do","double",
"else","enum","extern","float","for","goto","if","int","long","register",
"return","short","signed","sizeof","static","struct","switch","typedef",
"union","unsigned","void","volatile","while","bool","class","new","friend",
"true","delete","using","namespsce","private","protected","publec","this"};
/*C++语言所有关键字*/
char *limit[]={" ","(",")","<",">","->",".","!","++","—","&","~","/","%","+","-","<<",">>","[",
"<=",">",">=","==","!=","&&","||","=","+=","-=","*=","/=",",",";","{","}","#",
"_","'","//","/*","*/"}; /*运算、限界符*/
fstream outfile;
int i,j;
char *c;
outfile.open("key.txt",ios::out);
for(i=0;i<32;i++)
outfile<<key[i]<<endl;
outfile.close();
outfile.open("Limit.txt",ios::out);
for(j=0;j<38;j++)
outfile<<limit[j]<<endl;
c="";
outfile<<c;
outfile.close();
outfile.open("bsf.txt",ios::out);
outfile.close();
outfile.open("cs.txt",ios::out);
outfile.close();
outfile.open("output.txt",ios::out);
outfile.close();
}
char *DchangeB(char *buf)
{
int temp[20];
char *binary;
int value=0,i=0,j;
for(i=0;buf[i]!='0';i++)
value=value*10+(buf[i]-48); /*将字符转化为十进制数*/
if(value==0)
{
binary=new char[2];
binary[0]='0';
binary[1]='0';
return(binary);
}
i=0;
while(value!=0)
{
temp[i++]=value%2;
value/=2;
}
temp[i]='0';
binary=new char[i+1];
for(j=0;j<=i-1;j++)
binary[j]=(char)(temp[i-j-1]+48);
binary[i]='0';
return(binary); /*十进制转化为二进制*/
}
int search(char *buf,int type,int command)
{
int number=0;
fstream outfile;
char ch;
char temp[30];
int i=0;
switch(type)
{
case 1: outfile.open("key.txt",ios::in);break;
case 2: outfile.open("bsf.txt",ios::in);break;
case 3: outfile.open("cs.txt",ios::in);break;
case 4: outfile.open("limit.txt",ios::in);break;
}
outfile.get(ch);
while(ch!=EOF)
{
while(ch!=' ')
{
temp[i++]=ch;
outfile.get(ch);
}
temp[i]='0';
i=0;
number++;
if(strcmp(temp,buf)==0)
{
outfile.close();
return number; /*若找到,返回在相应表中的序号*/
}
else
outfile.get(ch);
} //结束外层while循环
if(command==1)
{
outfile.close( );
return 0; /*找不到,当只需查表,返回0,否则还需造表*/
}
switch(type)
{
case 1: outfile.open("key.txt",ios::in);break;
case 2: outfile.open("bsf.txt",ios::in);break;
case 3: outfile.open("cs.txt",ios::in);break;
case 4: outfile.open("limit.txt",ios::in);break;
}
outfile<<buf;
outfile.close();
return number+1;
}
void chardeal(char *buffer)
{
fstream outfile;
int result;
result=search(buffer,1,1); /*先查关键字表*/
outfile.open("output.txt",ios::app);
if(result!=0)
{
cout<<buffer<<"是关键字"<<endl;
outfile<<buffer<<result<<endl;
} /*若找到,写入输出文件*/
else
{
result=search(buffer,2,2); /*若找不到,则非关键字,查标识符表,还找不到则造入标识符表*/
outfile<<buffer<<result<<endl;
} /*写入输出文件*/
outfile.close();
}
void errordeal(char error,int lineno)
{
cout<<" error: "<<error<<" ,line"<<lineno<<endl;
}
void scanner()
{
fstream infile,outfile;
char filename[20];
char ch;
int err=0;
int i=0,line=1;
int count,result,errorno=0;
char array[30];
char *word;
cout<<" 请输入要分析的文件名:";
cin>>filename;
err=1;
infile.open(filename,ios::nocreate|ios::in);
while(! infile)
{
cout<<"不能打开文件"<<endl;
cout<<"请重新输入要分析的文件名: ";
cin>>filename;
infile.open(filename,ios::nocreate|ios::in);
err++;
if(err==3)
{
cout<<"SORROY YOU CAN'T VIEW THE PROGRAME ";
cout<<"TANKE YOU VIEW"<<endl;
exit(0);
}
}
infile.get(ch);
while(ch!=EOF)
{ /*按字符依次扫描源程序,直至结束*/
i=0;
if(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_'))
{/*以字母开头*/
while(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_')||
((ch>='0')&&(ch<='9')))
{
array[i++]=ch;
infile.get(ch);
}
word=new char[i+1];
word[i]='0';
chardeal(word);
if(ch!=EOF)
infile.seekg(-1,ios::cur);
}
else
if(ch>='0'&&ch<='9')
{ /*以数字开头*/
while(ch>='0'&&ch<='9')
{
array[i++]=ch;
infile.get(ch);
}
word=new char[i+1];
word[i]='0';
cout<<word<<"为常数;"<<endl;
if(ch!=EOF)
infile.seekg(-1,ios::cur);
}
else
if((ch==' ')||(ch=='\t'))
infile.get(ch);/*消除空格符和水平制表符*/
else
if(ch=='\n')
{
infile.get(ch);
line++; /*消除回车并记录行数*/
}
else
if(ch=='/')
{ /*消除注释*/
infile.get(ch);
if(ch=='=')
{ /*判断是否为‘/=’符号*/
outfile.open("output.txt",ios::noreplace|ios::app);
cout<<"/= 为运算符; ";
outfile<<"/=\t\t\t4\t\t\t32\n";
outfile.close();
}
else
if(ch!='*')
{ /*若为除号,写入输出文件*/
outfile.open("output.txt",ios::noreplace|ios::app);
cout<<"/ 为运算符; ";
outfile<<"/\t\t\t4\t\t\t13\n";
outfile.close();
outfile.seekg(-1,ios::cur);
}
else
if(ch=='*')
{ /*若为注释的开始,消除包含在里面的所有字符*/
count=0;
infile.get(ch);
while(count!=2)
{ /*当扫描到‘*’且紧接着下一个字符为‘/’才是注释的结束*/
count=0;
while(ch!='*')
infile.get(ch);
count++;
infile.get(ch);
if(ch=='/')
count++;
else
infile.get(ch);
}
}
}
else
if(ch=='"')
{ /*消除包含在双引号中的字符串常量*/
outfile.open("output.txt",ios::noreplace|ios::app);
outfile<<ch<<"\t\t\t4\t\t\t37\n";
outfile.close();
while(ch!='"')
{
infile.get(ch);
infile<<ch<<"\t\t\t4\t\t\t37\n";
cout<<ch;
}
cout<<"为常量;"<<endl;
infile.close();
}
else
{ /*首字符为其它字符,即运算限界符或非法字符*/
array[0]=ch;
infile.get(ch); /*再读入下一个字符,判断是否为双字符运算、限界符*/
if(ch!=EOF)
{ /*若该字符非文件结束符*/
array[1]=ch;
word=new char[3];
word[2]='0';
result=search(word,4,1); /*先检索是否为双字符运算、限界符*/
if(result==0) /*若不是*/
word=new char[2];
else
{ /*若为双字符运算、限界符,写入输出文件*/
outfile.open("output.txt",ios::noreplace|ios::app);
cout<<word<<endl;
outfile<<word<<"\t\t\t4\t\t\t"<<result<<endl;
outfile.close( );
}
word[1]='0';
result=search(word,4,1); /*检索是否为单字符运算、限界符*/
if(result==0)
{ /*若还不是,则为非法字符*/
errordeal(array[0],line);
errorno++;
infile.seekg(-1,ios::cur);
}
else
{ /*若为单字符运算、限界符,写入输出文件并将扫描文件指针回退一个字符*/
outfile.open("output.txt",ios::noreplace|ios::app);
cout<<word<<endl;
outfile<<word<<"\t\t\t4\t\t\t"<<result<<"\t"<<endl;
outfile.close();
infile.seekg(-1,ios::cur);
}
}
else
{ /*若读入的下一个字符为文件结束符*/
word=new char[2];
word[1]='0';
result=search(word,4,1); /*只考虑是否为单字符运算、限界符*/
if(result==0) /*若不是,转出错处理*/
errordeal(array[0],line);
else
{ /*若是,写输出文件*/
outfile.open("output.txt",ios::noreplace|ios::app);
cout<<word<<endl;
cout<<word<<endl;
outfile<<word<<"\t\t\t4\t\t\t"<<result<<"\t"<<endl;
outfile.close();
}
}
infile.get(ch);
}
infile.close();
cout<<"一共出现了"<<errorno<<"错误."; /*报告错误字符个数*/
}
void main()
{
char yn;
do
{
init(); /*初始化*/
scanner();/*扫描源程序*/
cout<<"是否继续进行(y/n)\n "; //判断是否继续?
cin>>yn;
}
while(yn=='y'||yn=='Y');
cout<<"谢谢使用!!"<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -