📄 c++词法分析.cpp
字号:
#include<iostream.h>
#include<stdio.h>
#include<ctype.h>
#include<string.h>
//#define KEY_No 1
//#define ID_No 2
//#define Number_No 3
//#define Sign_No 4
//#define Other_No 5
int isID(); //英文单词
int isNbr(); //无符号整形数
int match(); //保留字
void other(); //字符函数
void report_error(); //出错信息
char token[20]; //字符长度
char file[20]; //文件名长度
FILE *fp;
char ch; //用于存放取到的一个字符
int i;
int main()
{
cout<<"请输入文件名:";
cin>>file;
cout<<endl;
fp=fopen(file,"r");//读文件
if(fp)
{
ch=fgetc(fp); //读取一个字符
while(ch!=EOF) //判断
{
if(isalpha(ch))
{
if(isID())
{
if(match())
cout<<"("<<"保留字,"<<token<<")";//输出关键字
else
cout<<"("<<"标识符,"<<token<<")";//输出标识符
}
}
else
{
if(isdigit(ch))
isNbr(); //整形数的情况
else
other(); //运算符、分割符时的情况
}
ch=fgetc(fp);
cout<<'\n';
}
cout<<endl<<endl;
}
else
cout<<"你所想找的文件不存在!"<<endl<<endl;//找不到该文件
return 0;
}
int isID() //单词的情况
{
token[0]=ch;
ch=fgetc(fp);
i=1;
while(isalnum(ch)||ch=='_')
{
token[i]=ch;
i++;
ch=fgetc(fp);
}
token[i]='\0';
fseek(fp,-1,1);
return 1;
}
int isNbr() //判断并输出无符号整形数
{
token[0]=ch;
ch=fgetc(fp);
i=1;
while(isdigit(ch)||ch=='.')
{
token[i]=ch;
i++;
ch=fgetc(fp);
}
token[i]='\0';
fseek(fp,-1,1);
cout<<"(无符号整形数,"<<token<<")";
return 1;
}
int match() //逐个查找验证是不是保留字
{
char *keyword[]=
{
"if","else","int","while","return","continue","for","do","bresk"
};
for(int i=0;i<9;i++)
{
if(!strcmp(token,keyword[i]))
{
return 1;
break;
}
}
return 0;
}
void other() //判断并输出运算符,标识符
{
switch(ch)
{
case'<':
ch=fgetc(fp);
if(ch=='<')
{
ch=fgetc(fp);
if(ch=='=')
cout<<"(运算符,<<=)";
else{
fseek(fp,-1,1);
cout<<"(运算符,<<)";
}
}
else{
if(ch=='=')
cout<<"(运算符,<=)";
else{
fseek(fp,-1,1);
cout<<"(运算符,<)";
}
}
break;
case'=':
ch=fgetc(fp);
if(ch=='=')
cout<<"(运算符,==)";
else
{
fseek(fp,-1,1);
cout<<"(运算符,=)";
}
break;
case'>':
ch=fgetc(fp);
if(ch=='>')
{
ch=fgetc(fp);
if(ch=='=')
cout<<"(运算符,>>=)";
else
{
fseek(fp,-1,1);
cout<<"(运算符,>>)";
}
}
else{
if(ch=='=')
cout<<"(运算符,>=)";
else
{
fseek(fp,-1,1);
cout<<"(运算符,>)";
}
}
break;
case'+':
ch=fgetc(fp);
if(ch=='+')
cout<<"(运算符,++)";
else
{
if(ch=='=')
cout<<"(运算符,+=)";
else
{
fseek(fp,-1,1);
cout<<"(运算符,+)";
}
}
break;
case'-':
ch=fgetc(fp);
switch(ch)
{
case'-':cout<<"(运算符,--)";
break;
case'=':cout<<"(运算符,-=)";
break;
case'>':cout<<"(运算符,->)";
break;
default:fseek(fp,-1,1);
cout<<"(运算符,-)";
break;
}
case'*':
ch=fgetc(fp);
if(ch=='=')
cout<<"(运算符,*=)";
else
{
fseek(fp,-1,1);
cout<<"(运算符,*)";
}
break;
case'&':
ch=fgetc(fp);
if(ch=='&')
{
ch=fgetc(fp);
if(ch=='=')
cout<<"(运算符,&&=)";
else
{
fseek(fp,-1,1);
cout<<"(运算符,&&)";
}
}
else{
fseek(fp,-1,1);
cout<<"(运算符,&)";
}
break;
case'|':
ch=fgetc(fp);
if(ch=='|')
{
ch=fgetc(fp);
if(ch=='=')
cout<<"(运算符,||=)";
else
{
fseek(fp,-1,1);
cout<<"(运算符,||)";
}
}
else
{
if(ch=='=')
cout<<"(运算符,|=)";
else
{
fseek(fp,-1,1);
cout<<"(运算符,|)";
}
}
break;
case'^':
ch=fgetc(fp);
if(ch=='=')
cout<<"(运算符,^=)";
else
{
fseek(fp,-1,1);
cout<<"(运算符,^)";
}
break;
case'!':
ch=fgetc(fp);
if(ch=='=')
cout<<"(运算符,!=)";
else
{
fseek(fp,-1,1);
cout<<"(分割符,!)";
}
break;
case'~':cout<<"(分割符,~)";
break;
case'.':cout<<"(分割符,.)";
break;
case'(':cout<<"(分割符,()";
break;
case')':cout<<"(分割符,))";
break;
case'{':cout<<"(分割符,{)";
break;
case'}':cout<<"(分割符,})";
break;
case'[':cout<<"(分割符,[)";
break;
case']':cout<<"(分割符,])";
break;
case',':cout<<"(分割符,,)";
break;
case';':cout<<"(分割符,;)";
break;
case'?':
ch=fgetc(fp);
if(ch==':')
cout<<"(分割符,?:)";
else
{
fseek(fp,-1,1);
cout<<"(分割符,?)";
}
break;
case':':
ch=fgetc(fp);
if(ch==':')
cout<<"(分割符,::)";
else
{
fseek(fp,-1,1);
cout<<"(分割符,:)";
}
break;
case'/':
ch=fgetc(fp);
switch(ch)
{
case'=':cout<<"(分割符,/=)";
break;
case'/':
while(ch!='\n')
{
ch=fgetc(fp);
}
break;
case'*':
{
s1: while(ch!='*')
{
ch=fgetc(fp);
}
ch=fgetc(fp);
if(ch!='/')
goto s1;
}
break;
default:
fseek(fp,-1,1);
cout<<"(分割符,/)";
break;
}
break;
case'\\':
cout<<"(分割符,\\)";
break;
case'%':
ch=fgetc(fp);
if(ch=='=')
cout<<"(分割符,%=)";
else
{
fseek(fp,-1,1);
cout<<"(分割符,%)";
}
break;
case'@':cout<<"(分割符,@)";
break;
case'#':cout<<"(分割符,#)";
break;
case'"':cout<<"(分割符,\")";
break;
case' ':cout<<"(分割符,' ')";
break;
case'\n':cout<<"(分割符,换行)";
break;
case' ':
break;
default:report_error();
break;
}
}
void report_error()
{
cout<<"Error finds!";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -