📄 wordanalyze.cpp
字号:
#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;
string preserve_word[10]={"int","char","bool","long","struct","while","for","if","case","switch"};//保留字
//保留字内码
char inner_code[10][3]={{'0','0','0'},{'0','0','1'},{'0','0','2'},{'0','0','3'},{'0','0','4'},{'0','0','5'},
{'0','0','6'},{'0','0','7'},{'0','0','8'},{'0','0','9'}};
signed char table[9][7]={ //状态转换矩阵(实数)
/*digit,'.','+','-','E','\n or space ',other*/
{1,-1,-1,-1,-1,-1,-1}, //状态0(初试状态)的转换情况
{1,2,-1,-1,4,9,-1}, //状态1的转换情况
{3,-1,-1,-1,-1,-1,-1}, //状态2的转换情况
{3,-1,-1,-1,4,9,-1}, //状态3的转换情况
{7,-1,6,5,-1,9,-1}, //状态4的转换情况
{7,-1,-1,-1,-1,-1,-1}, //状态5的转换情况
{7,-1,-1,-1,-1,-1,-1}, //状态6的转换情况
{8,-1,-1,-1,-1,9,-1}, //状态7的转换情况
{-1,-1,-1,-1,-1,9,-1}}; //状态8的转换情况
bool IsCharater(char ch) //判断该字符是否为小写字母,是返回真,否则返回假
{
if((int)ch>=97&&(int)ch<=122) return true;
else return false;
}
bool Isdigit(char ch) //判断该字符是否为数字,是返回真,否则返回假
{
if((int)ch>=48&&(int)ch<=57) return true;
else return false;
}
void convert(char *buffer) //将该字符串表示的实数转换为双精度型
{
int i=0,j=0,k,kk,n,flag;
double temp=0,num;
while(buffer[i]!='\0'&&buffer[i]!='.'&&buffer[i]!='E')
{
i++;
j++;
}
k=i+1;
for(i=0;i<j;i++) temp=temp*10+buffer[i]-'0';
num=temp;
if(buffer[j]=='.')
{
i=j=k;
while(buffer[i]!='\0'&&buffer[i]!='E')
{
i++;
j++;
}
kk=j;
for(i=k,n=0,temp=0;i<j;i++)
{
temp=temp*10+buffer[i]-'0';
n++;
}
for(i=0;i<n;i++) temp=temp/10;
num+=temp;
if(buffer[kk]=='E')
{
for(j=k-1,i=kk;buffer[i]!='\0';i++,j++) buffer[j]=buffer[i];
buffer[j]='\0';
}
}
if(buffer[k-1]=='E')
{
temp=buffer[k+1]-'0';
if(buffer[k+2]!='\0') temp=temp*10+buffer[k+2]-'0';
if(buffer[k]=='+') {cout<<temp<<'\n';flag=1;}
else if(buffer[k]=='-') flag=2;
else if(buffer[k]!='\0')
{
temp=buffer[k]-'0';
if(buffer[k+1]!='\0') temp=temp*10+buffer[k+1]-'0';
flag=1;
}
if(flag==1) for(j=0;j<temp;j++) num*=10;
else if(flag==2) for(j=0;j<temp;j++) num/=10;
}
sprintf(buffer,"%1.12e",num);
//cout<<buffer;
}
void main(int argc,char *argv[])
{
int i=0,j=0,k=0,tag=0,state=0,temp;
char ch;
char *buffer2=new char;
string finname,foutname,buffer;
FILE *fin,*fout;
cout<<"This is 010851's word analyzer.\n"
<<"First please input the main file name you want to analyze: ";
cin>>finname;
cout<<"Then input the main file name you want to output: ";
cin>>foutname;
finname=finname+".fin";
foutname=foutname+".fou";
fin=fopen(finname.c_str(),"r");
if(fin==NULL)
{
cout<<"Can't open the source file!";
exit(-1);
}
fout=fopen(foutname.c_str(),"w");
if(fout==NULL)
{
cout<<"Can't open or creat the output file!";
fclose(fin);
exit(-1);
}
ch=fgetc(fin);
while(ch!=EOF)
{
if(ch==' '||ch=='\n') ch=fgetc(fin);//需要改进!
buffer="";
if(IsCharater(ch)) //如果该字符串的首字符是小写英文字母的处理情况
{
do{
buffer+=ch;
ch=fgetc(fin);
}while(IsCharater(ch)||Isdigit(ch));
if(ch==' '||ch=='\n')
{
if(buffer=="int")
{
for(i=0;i<3;i++) fputc(inner_code[0][i],fout);
fputc('\n',fout);
}
else if(buffer=="char")
{
for(i=0;i<3;i++) fputc(inner_code[1][i],fout);
fputc('\n',fout);
}
else if(buffer=="bool")
{
for(i=0;i<3;i++) fputc(inner_code[2][i],fout);
fputc('\n',fout);
}
else if(buffer=="long")
{
for(i=0;i<3;i++) fputc(inner_code[3][i],fout);
fputc('\n',fout);
}
else if(buffer=="struct")
{
for(i=0;i<3;i++) fputc(inner_code[4][i],fout);
fputc('\n',fout);
}
else if(buffer=="while")
{
for(i=0;i<3;i++) fputc(inner_code[5][i],fout);
fputc('\n',fout);
}
else if(buffer=="for")
{
for(i=0;i<3;i++) fputc(inner_code[6][i],fout);
fputc('\n',fout);
}
else if(buffer=="if")
{
for(i=0;i<3;i++) fputc(inner_code[7][i],fout);
fputc('\n',fout);
}
else if(buffer=="case")
{
for(i=0;i<3;i++) fputc(inner_code[8][i],fout);
fputc('\n',fout);
}
else if(buffer=="switch")
{
for(i=0;i<3;i++) fputc(inner_code[9][i],fout);
fputc('\n',fout);
}
else
{
for(i=0;i<buffer.size();i++) buffer2[i]=buffer.at(i);
buffer2[i]='\0';
fprintf(fout,"Identify :%s \n",buffer2);
}
}
else
{
tag=0;
do
{
buffer+=ch;
ch=fgetc(fin);
if(ch==EOF)
{
tag=1;
break;
}
}while(ch!=' '&&ch!='\n');
for(i=0;i<buffer.size();i++) buffer2[i]=buffer.at(i);
buffer2[i]='\0';
fprintf(fout,"Error Constant: %s\n",buffer2);
if(tag==1) break;
else continue;
}
}
else if(Isdigit(ch)) //如果该字符串的首字符是数字的处理情况
{
i=0;
state=0;
while(state!=-1&&state!=9)
{
if(isdigit(ch))
j=0;
else switch(ch)
{
case '.':j=1;break;
case '+':j=2;break;
case '-':j=3;break;
case 'E':j=4;break;
case '\n':j=5;break;
case ' ':j=5;break;
default:j=6;
}
temp=table[state][j];
if(-1==temp)
{
buffer2[i]=ch;
state=-1;
}
else
{
buffer2[i]=ch;
i++;
state=temp;
ch=fgetc(fin);
}
}
if(state==-1)
{
tag=0;
while(ch!=' '&&ch!='\n')
{
if(ch==EOF)
{
tag=1;
break;
}
buffer2[i+1]=ch;
i++;
ch=fgetc(fin);
}
buffer2[i]='\0';
fprintf(fout,"Error constant: %s\n",buffer2);
if(tag==1) break;
else continue;
}
else
{
if(buffer2[i-1]!=' '&&buffer2[i-1]!='\n') buffer2[i]='\0';
else buffer2[i-1]='\0';
convert(buffer2);
fprintf(fout,"%s\n",buffer2);
}
}
else if(ch!=EOF) //其他情况(一定是认不出的字符串)
{
tag=0;
do
{
buffer+=ch;
ch=fgetc(fin);
if(ch==EOF)
{
tag=1;
break;
}
}while(ch!=' '&&ch!='\n');
for(i=0;i<buffer.size();i++) buffer2[i]=buffer.at(i);
buffer2[i]='\0';
fprintf(fout,"Error constant: %s\n",buffer2);
if(tag==1) break;
else continue;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -