📄 test.cpp
字号:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
void Init()
{
char *ke[]={"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"};//关键字32个
char *op[]={"(",")","[","]","->",".","!","++","--","&","~","*","/","%","+","-","<<",
">>","<","<=",">",">=","==","!=","&&","||","sizeof","=","+=","-=","*=",
"/=",","};//运算符33个
char *li[]={";","{","}","#","_","'"};//限界符6个
FILE *fp;
fp=fopen("key.txt","w");
for(int i=0;i<32;i++)
fprintf(fp,"%s\n",ke[i]);
fclose(fp);
fp=fopen("operation.txt","w");
for(i=0;i<33;i++)
fprintf(fp,"%s\n",op[i]);
fclose(fp);
fp=fopen("limitation.txt","w");
for(i=0;i<6;i++)
fprintf(fp,"%s\n",li[i]);
fclose(fp);
fp=fopen("output.txt","w");
fprintf(fp,"%s\n","1------标识符\n2------常数\n3------关键字\n4------运算符\n5------限界符\n");
fclose(fp);
if((fp=fopen("programme.txt","r"))==NULL)
{
printf("没有programme.txt文件!\n此文件用于输入您想分析的代码.\n请新建一个programme.txt文件,并输入您想要分析的代码!\n");
exit(0);
}
printf("1------标识符\n2------常数\n3------关键字\n4------运算符\n5------限界符\n");
}
void Find_Ke(char *buf)//不是关键字就是标识符
{
char temp[30];
char ch;
int i=0;
int flag=0;
FILE *fp,*fp1;
fp=fopen("key.txt","r");
ch=fgetc(fp);
while(ch!=EOF)
{
while(ch!='\n'&&ch!=EOF)
{
temp[i]=ch;
ch=fgetc(fp);
i++;
}
temp[i]='\0';
if(strcmp(temp,buf)==0)
flag=1;
if(ch==EOF)
break;
ch=fgetc(fp);
i=0;
}
if(flag==0)
{
fp1=fopen("output.txt","a");
fprintf(fp1,"<%d '%s'>\n",1,buf);
fclose(fp1); //是标识符
}
else
{
fp1=fopen("output.txt","a");
fprintf(fp1,"<%d '%s'>\n",3,buf);
fclose(fp1); //是关键字
}
}
int Find_Op(char *buf)
{
char temp[30];
char ch;
int i=0;
int flag=0;
FILE *fp,*fp1;
fp=fopen("operation.txt","r");
ch=fgetc(fp);
while(ch!=EOF)
{
while(ch!='\n'&&ch!=EOF)
{
temp[i]=ch;
ch=fgetc(fp);
i++;
}
temp[i]='\0';
if(strcmp(temp,buf)==0)
flag=1;
if(ch==EOF)
break;
ch=fgetc(fp);
i=0;
}
if(flag==1)
{
fp1=fopen("output.txt","a");
fprintf(fp1,"<%d '%s'>\n",4,buf);
fclose(fp1); //是运算符
return 1;
}
else
return 0;
}
void Find_Nu(char *buf)
{
FILE *fp;
fp=fopen("output.txt","a");
fprintf(fp,"<%d '%s'>\n",2,buf);
fclose(fp); //是常数
}
void Unknown(char *buf)
{
FILE *fp;
fp=fopen("output.txt","a");
fprintf(fp,"<%s %s>\n","无法识别",buf);
fclose(fp); //无法识别
}
void Scan()
{
char ch;
char temp[30];
int i=0;
int result;
FILE *fp,*fp1;
fp=fopen("programme.txt","r");
ch=fgetc(fp);
while(ch!=EOF)
{
if(((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||ch=='_'))//字母开头
{
while((((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_')||((ch>='0')&&(ch<='9')))&&ch!=EOF)
{
temp[i]=ch;
ch=fgetc(fp);
i++;
}
temp[i]='\0';
Find_Ke(temp);
i=0;
if(ch==EOF)
break;
}
else if((ch>='0'&&ch<='9'))
{ //以数字开头
while((ch>='0'&&ch<='9')&&ch!=EOF)
{
temp[i]=ch;
ch=fgetc(fp);
i++;
}
temp[i]='\0';
Find_Nu(temp);
i=0;
if(ch==EOF)
break;
}
else if((ch==' ')||(ch=='\t')||(ch=='\n'))
{
ch=fgetc(fp); //消除空格符和水平制表符
}
else if(ch==';'||ch=='{'||ch=='}'||ch=='#'||ch=='_'||ch=='\'')//限界符
{
fp1=fopen("output.txt","a");
fprintf(fp1,"<%d '%c'>\n",5,ch);
fclose(fp1); //是限界符
ch=fgetc(fp);
}
else
{ //首字符为其它字符,即运算限界符或非法字符
temp[0]=ch;
ch=fgetc(fp); //再读入下一个字符,判断是否为双字符运算、限界符
if(ch==EOF)
{
temp[1]='\0';
Find_Op(temp);
if(result==0) //若不是,则为非法字符
Unknown(temp);
}
else
{
temp[1]=ch;
temp[2]='\0';
result=Find_Op(temp); /*先检索是否为双字符运算符*/
if(result==0)//若不是,检索是否为单字符运算、限界符
{
i=0;
temp[1]='\0';
result=Find_Op(temp);
if(result==0)
{ //若还不是,则为非法字符
Unknown(temp);
}
}
else
ch=fgetc(fp);
}
}
}
fclose(fp);
}
int main()
{
Init();
Scan();
printf("词法分析已经完成!请查看文件output.txt!\n");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -