📄 cffx.cpp
字号:
#include"iostream.h"
#include"fstream.h"
bool isreservedword(char *token,int i) //判断是否为保留字;返回1保留字,返回0非保留字
{
switch(i)
{
case 2 :
if(token[0]=='i'&&token[1]=='f')
return 1;
else
return 0;
//break ;
case 3 :
if(token[0]=='i'&&token[1]=='n'&&token[2]=='t')
return 1;
else if(token[0]=='f'&&token[1]=='o'&&token[2]=='r')
return 1;
else
return 0;
//break ;
case 4:
if(token[0]=='c'&&token[1]=='h'&&token[2]=='a'&&token[3]=='r')
return 1;
else if(token[0]=='b'&&token[1]=='o'&&token[2]=='o'&&token[3]=='l')
return 1;
else if(token[0]=='v'&&token[1]=='o'&&token[2]=='i'&&token[3]=='d')
return 1;
else if(token[0]=='e'&&token[1]=='l'&&token[2]=='s'&&token[3]=='e')
return 1;
else if(token[0]=='c'&&token[1]=='a'&&token[2]=='s'&&token[3]=='e')
return 1;
else if(token[0]=='c'&&token[1]=='o'&&token[2]=='u'&&token[3]=='t')
return 1;
else
return 0;
//break ;
case 5:
if(token[0]=='f'&&token[1]=='l'&&token[2]=='o'&&token[3]=='a'&&token[4]=='t')
return 1;
else if(token[0]=='w'&&token[1]=='h'&&token[2]=='i'&&token[3]=='l'&&token[4]=='e')
return 1;
else if(token[0]=='b'&&token[1]=='r'&&token[2]=='e'&&token[3]=='a'&&token[4]=='k')
return 1;
else
return 0;
//break ;
case 6:
if(token[0]=='d'&&token[1]=='o'&&token[2]=='u'&&token[3]=='b'&&token[4]=='l'&&token[5]=='e')
return 1;
else if(token[0]=='s'&&token[1]=='w'&&token[2]=='i'&&token[3]=='t'&&token[4]=='c'&&token[5]=='h')
return 1;
else if(token[0]=='r'&&token[1]=='e'&&token[2]=='t'&&token[3]=='u'&&token[4]=='r'&&token[5]=='n')
return 1;
else
return 0;
//break ;
case 7:
if(token[0]=='d'&&token[1]=='e'&&token[2]=='f'&&token[3]=='a'&&token[4]=='u'&&token[5]=='l'&&token[6]=='t')
return 1;
else if(token[0]=='i'&&token[1]=='n'&&token[2]=='c'&&token[3]=='l'&&token[4]=='u'&&token[5]=='d'&&token[6]=='e')
return 1;
else
return 0;
//break ;
default:
return 0;
}
}
void print(char *token ,int x) //回显函数
{
cout<<" ";
for(int i=0;i<x;i++)
{
cout<<token[i];
}
cout<<endl;
}
int getToken(ifstream infile) //返回0文件结束,返回1为数字,返回2为保留字,返回3为标识符,返回4为运算符,
//返回5发生错误,返回6注释,返回7字符,返回8符号,返回9字符串常量
{
infile.seekg(-1,ios::cur); //前退一格
char tok[256];
int i=0;
infile.get(tok[i]);
while(tok[i]==' '||tok[i]=='\n'||tok[i]=='\t'||tok[i]=='\r'||tok[i]=='\b') //跳过不用处理的字符
{
infile.get(tok[i]);
}
if( tok[i]>='0' && tok[i]<='9') //首字符是数字
{
infile.get(tok[++i]);
while( tok[i]=='.' || (tok[i]>='0'&&tok[i]<='9') )
{
infile.get(tok[++i]);
}
cout<<"Number : ";
print(tok,i);
if(infile.eof()) //文件结束
return 0;
return 1;
}
else if( (tok[i]>='a'&&tok[i]<='z')||(tok[i]>='A'&&tok[i]<='Z') ) //首字符是字母
{
infile.get(tok[++i]);
while( (tok[i]>='a'&&tok[i]<='z') || (tok[i]>='A'&&tok[i]<='Z') || (tok[i]>='0' && tok[i]<='9') )
{
infile.get(tok[++i]);
}
if(isreservedword(tok,i))
{
cout<<"ReservedWord : ";
print(tok,i);
if(infile.eof()) //文件结束
return 0;
return 2;
}
else
{
cout<<"ID : ";
print(tok,i);
if(infile.eof()) //文件结束
return 0;
return 3;
}
}
else //首字符是符号
{
switch(tok[i])
{
case '+': //首字符是'+'号
infile.get(tok[++i]);
switch(tok[i])
{
case '+':
cout<<"Operator : ++"<<endl;
infile.seekg(1,ios::cur);
return 4;
case '=':
cout<<"Operator : +="<<endl;
infile.seekg(1,ios::cur);
return 4;
case ' ':case 'a':case 'b': case 'c':case 'd':case 'e':
case 'f':case 'g':case 'h': case 'i':case 'j':case 'k':
case 'l':case 'm':case 'n': case 'o':case 'p':case 'q':
case 'r':case 's':case 't': case 'u':case 'v':case 'w':
case 'x':case 'y':case 'z': case 'Z':case 'Y':case 'X':
case 'A':case 'B': case 'C':case 'D':case 'E':
case 'F':case 'G':case 'H': case 'I':case 'J':case 'K':
case 'L':case 'M':case 'N': case 'O':case 'P':case 'Q':
case 'R':case 'S':case 'T': case 'U':case 'V':
case 'W':
cout<<tok[--i]<<endl;
return 4;
case '0':case '1':case '2':case '3':case '4':case '5':
case '6':case '7':case '8':
case '9':
infile.get(tok[++i]);
while( tok[i]=='.' || (tok[i]>='0'&&tok[i]<='9') )
{
infile.get(tok[++i]);
}
cout<<"Number : ";
print(tok,i);
return 1;
}
case '-': //首字符是'-'号
infile.get(tok[++i]);
switch(tok[i])
{
case '-':
cout<<"Operator : --"<<endl;
infile.seekg(1,ios::cur);
return 4;
case '=':
cout<<"Operator : -="<<endl;
infile.seekg(1,ios::cur);
return 4;
case ' ':case 'a':case 'b': case 'c':case 'd':case 'e':
case 'f':case 'g':case 'h': case 'i':case 'j':case 'k':
case 'l':case 'm':case 'n': case 'o':case 'p':case 'q':
case 'r':case 's':case 't': case 'u':case 'v':case 'w':
case 'x':case 'y':case 'z': case 'Z':case 'Y':case 'X':
case 'A':case 'B': case 'C':case 'D':case 'E':
case 'F':case 'G':case 'H': case 'I':case 'J':case 'K':
case 'L':case 'M':case 'N': case 'O':case 'P':case 'Q':
case 'R':case 'S':case 'T': case 'U':case 'V':
case 'W':
cout<<tok[--i]<<endl;
return 4;
case '0':case '1':case '2':case '3':case '4':case '5':
case '6':case '7':case '8':
case '9':
infile.get(tok[++i]);
while( tok[i]=='.' || (tok[i]>='0'&&tok[i]<='9') )
{
infile.get(tok[++i]);
}
cout<<"Number : ";
print(tok,i);
return 1;
default:
cout<<"error"<<endl;
return 5;
} //end of second switch()
case '/': //首字符是'/'号
infile.get(tok[++i]);
switch(tok[i])
{
case '/':
while(tok[i]!='\n'&& (!infile.eof()) )
{
infile.get(tok[++i]);
}
infile.seekg(1,ios::cur);
cout<<"注释 : ";
print(tok,i);
return 6 ;
case '*':
while(tok[i]!='/')
{
while(tok[i]!='*')
{
infile.get(tok[++i]);
}
infile.get(tok[++i]);
}
infile.seekg(1,ios::cur);
cout<<"注释 : ";
print(tok,++i);
return 6 ;
case '=':
infile.seekg(1,ios::cur);
cout<<"Operator : "<<endl;
cout<<"/=";
return 3;
case 'a':case 'b': case 'c':case 'd':case 'e':
case 'f':case 'g':case 'h': case 'i':case 'j':case 'k':
case 'l':case 'm':case 'n': case 'o':case 'p':case 'q':
case 'r':case 's':case 't': case 'u':case 'v':case 'w':
case 'x':case 'y':case 'z': case 'Z':case 'Y':case 'X':
case 'A':case 'B': case 'C':case 'D':case 'E':
case 'F':case 'G':case 'H': case 'I':case 'J':case 'K':
case 'L':case 'M':case 'N': case 'O':case 'P':case 'Q':
case 'R':case 'S':case 'T': case 'U':case 'V':
case 'W':case '0':case '1':case '2':case '3':case '4':case '5':
case '6':case '7':case '8':
case '9':
cout<<"Operator : ";
cout<<"/"<<endl;
return 3;
default:
cout<<"Error! : ";
cout<<tok[--i]<<tok[i]<<endl;
return 5;
}
case '>': //首字符是'>'号
infile.get(tok[++i]);
switch(tok[i])
{
case '=':
infile.seekg(1,ios::cur);
cout<<"Operator : ";
cout<<">="<<endl;
return 3;
case '>':
infile.seekg(1,ios::cur);
cout<<"Operator : ";
cout<<">>"<<endl;
return 3;
case 'a':case 'b': case 'c':case 'd':case 'e':
case 'f':case 'g':case 'h': case 'i':case 'j':case 'k':
case 'l':case 'm':case 'n': case 'o':case 'p':case 'q':
case 'r':case 's':case 't': case 'u':case 'v':case 'w':
case 'x':case 'y':case 'z': case 'Z':case 'Y':case 'X':
case 'A':case 'B': case 'C':case 'D':case 'E':
case 'F':case 'G':case 'H': case 'I':case 'J':case 'K':
case 'L':case 'M':case 'N': case 'O':case 'P':case 'Q':
case 'R':case 'S':case 'T': case 'U':case 'V':
case 'W':case '0':case '1':case '2':case '3':case '4':case '5':
case '6':case '7':case '8':
case '9':
cout<<"Operator : ";
cout<<">"<<endl;
return 3;
default :
cout<<"Error! : ";
cout<<tok[--i]<<tok[i]<<endl;
return 5;
}
case '<': //首字符是'<'号
infile.get(tok[++i]);
switch(tok[i])
{
case '=':
infile.seekg(1,ios::cur);
cout<<"Operator : ";
cout<<"<="<<endl;
return 3;
case '<':
infile.seekg(1,ios::cur);
cout<<"Operator : ";
cout<<"<<"<<endl;
return 3;
case 'a':case 'b': case 'c':case 'd':case 'e':
case 'f':case 'g':case 'h': case 'i':case 'j':case 'k':
case 'l':case 'm':case 'n': case 'o':case 'p':case 'q':
case 'r':case 's':case 't': case 'u':case 'v':case 'w':
case 'x':case 'y':case 'z': case 'Z':case 'Y':case 'X':
case 'A':case 'B': case 'C':case 'D':case 'E':
case 'F':case 'G':case 'H': case 'I':case 'J':case 'K':
case 'L':case 'M':case 'N': case 'O':case 'P':case 'Q':
case 'R':case 'S':case 'T': case 'U':case 'V':
case 'W':case '0':case '1':case '2':case '3':case '4':case '5':
case '6':case '7':case '8':
case '9':
cout<<"Operator : ";
cout<<"<"<<endl;
return 3;
default :
cout<<"Error! : ";
cout<<tok[--i]<<tok[i]<<endl;
return 5;
}
case '\'' : //首字符是'号
infile.get(tok[++i]);
infile.get(tok[++i]);
if(tok[i]!='\'')
{
cout<<"Error! : ";
infile.seekg(1,ios::cur);
cout<<"\'"<<tok[--i]<<tok[i]<<endl;
return 5;
}
else
{
infile.seekg(1,ios::cur);
cout<<"char : ";
cout<<"\'"<<tok[--i]<<tok[i]<<endl;
return 7;
}
case '\"' : //首字符是"号
infile.get(tok[++i]);
while(tok[i]!='\"')
{
infile.get(tok[++i]);
}
infile.seekg(1,ios::cur);
cout<<"字符串常量 : ";
print(tok,++i);
return 9;
case ',':case '(':case ')':case '{':case '}': case '.':
case '[':case ']':case ';':case ':': case '#': //首字符是, ( ) { } [ ] ; :号
infile.seekg(1,ios::cur);
cout<<" "<<tok[i]<<endl;
return 8;
case '&': //首字符是'&'号
infile.get(tok[++i]);
if(tok[i]=='&')
{
infile.seekg(1,ios::cur);
cout<<"Operator : ";
cout<<tok[--i]<<tok[i]<<endl;
infile.seekg(1,ios::cur);
return 3;
}
else
{
cout<<"Error!"<<endl;
return 5;
}
case '|': //首字符是'|'号
infile.get(tok[++i]);
if(tok[i]=='|')
{
cout<<"Operator : ";
cout<<tok[--i]<<tok[i]<<endl;
infile.seekg(1,ios::cur);
return 3;
}
else
{
cout<<"Error!"<<endl;
return 5;
}
case '=':case '*':case '%':case '!': //首字符是= * % !号
infile.get(tok[++i]);
if(tok[i]=='=')
{
infile.seekg(1,ios::cur);
cout<<"Operator : ";
cout<<tok[--i]<<tok[i]<<endl;
if(infile.eof()) //文件结束
return 0;
return 3;
}
else
{
cout<<"Operator : ";
cout<<tok[--i]<<endl;
if(infile.eof()) //文件结束
return 0;
return 3;
}
} //end of fitst switch()
} //end of else
return 0;
}
void main()
{
ifstream infile("cpp.dat",ios::in|ios::nocreate);
if(!infile)
cout<<"无法打开";
else
{
infile.seekg(1,ios::cur);
while(getToken(infile))
{
//getToken(infile);
}
}
char relay;
cin>>relay;
infile.close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -