📄 词法分析器.cpp
字号:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
char B[76][10]={"#include","#define","#if","#else","#elif",//5
"auto","break","case","char","const","continue","default","do",//+8=13
"double","else","enum","extern","float","for","goto","if","int",//+9=22
"long","register","return","short","signed","sizeof","static",//+7=29
"struct","switch","typedef","union","unsigned","void","volatile","while",//+8=37
"(",")","[","]","{","}",",",";","\"","->","'",".","_","\\",//+14=51
"++","--","+","-","*","/","%",//+7=58
"==","!=",">","<","<=",">=",//+6=64
"&","&&","|","||",">>","<<","!",//+7=71
"=","+=","-=","*=","/="};//+5=76
char buffer[30];
int m=0;
int NR=1;
struct fa
{
int grade;
int nr;
char ch[30];
char di[30];
struct fa *next;
};
fa *head=NULL,*p=NULL,*q=NULL;
void end()
{
int i;
if(buffer[0]>='0'&&buffer[0]<='9'||buffer[0]=='-'&&buffer[1]!='-'&&buffer[1]!='>')
{
p=(fa *)malloc(sizeof(fa));
p->nr=NR;
p->next=NULL;
p->grade=77;
strcpy(p->di,buffer);
if(p->di[strlen(buffer)-1]=='.')
{
p->di[strlen(buffer)]='0';
p->di[strlen(buffer)+1]='\0';
}
if(head==NULL){head=p;q=p;}
else{q->next=p;q=p;}
}
else
{
p=(fa *)malloc(sizeof(fa));
p->nr=NR;
p->next=NULL;
for(i=0;i<76;i++)
{
if(strcmp(buffer,B[i])==0)break;
}
if(i<76)p->grade=i;
else if(buffer[0]>='a'&&buffer[0]<='z'||
buffer[0]>='A'&&buffer[0]<='Z'||buffer[0]=='_')p->grade=i;
else p->grade=78;
strcpy(p->ch,buffer);
if(head==NULL){head=p;q=p;}
else{q->next=p;q=p;}
}
for(i=0;i<30;i++)buffer[i]='\0';
}
void fun()
{
FILE *in=NULL,*out=NULL;
char c;int i,j;
for(i=0;i<30;i++)buffer[i]='\0';
if(in=fopen("experiment.c","r"))
{
while(fscanf(in,"%c",&c)!=EOF)
{
if(c>='a'&&c<='z'||c>='A'&&c<='Z'||c=='_')
{
if(m==0)buffer[m++]=c;
else if(buffer[m-1]>='a'&&buffer[m-1]<='z'||
buffer[m-1]>='A'&&buffer[m-1]<='Z'||
buffer[0]=='#'||buffer[m-1]=='_')
buffer[m++]=c;
else
{
if(m>0)
{
m=0;
end();
}
buffer[m++]=c;
}
}
else if(c>='0'&&c<='9')
{
if(m==0)buffer[m++]=c;
else if(buffer[0]>='0'&&buffer[0]<='9'||
buffer[0]>='a'&&buffer[0]<='z'||
buffer[0]>='A'&&buffer[0]<='Z'||
buffer[0]=='_'||
buffer[0]=='-'&&buffer[1]!='-'&&buffer[1]!='>')
buffer[m++]=c;
else
{
if(m>0)
{
m=0;
end();
}
buffer[m++]=c;
}
}
else if(c==' '||c==10||c==13||c=='\n'||c=='\t')
{
if(m>0)
{
m=0;
end();
}
if(c==10||c==13||c=='\n')
{
NR++;
}
}
else
{
if(m==0)buffer[m++]=c;
else if(buffer[m-1]>='a'&&buffer[m-1]<='z'||
buffer[m-1]>='A'&&buffer[m-1]<='Z'||
buffer[m-1]=='_'||
buffer[m-1]>='0'&&buffer[m-1]<='9'&&c!='.')
{
if(m>0)
{
m=0;
end();
}
buffer[m++]=c;
}
else
{
if(c=='+'&&buffer[0]=='+')
{
buffer[m++]=c;
end();
m=0;
}
else if(c=='='&&(buffer[0]=='+'||buffer[0]=='-'||
buffer[0]=='*'||buffer[0]=='/'||buffer[0]=='>'||
buffer[0]=='<'||buffer[0]=='='||buffer[0]=='!'))
{
buffer[m++]=c;
end();
m=0;
}
else if(c=='>'&&(buffer[0]=='-'||buffer[0]=='>'))
{
buffer[m++]=c;
end();
m=0;
}
else if(c=='<'&&buffer[0]=='<')
{
buffer[m++]=c;
end();
m=0;
}
else if(c=='&'&&buffer[0]=='&')
{
buffer[m++]=c;
end();
m=0;
}
else if(c=='|'&&buffer[0]=='|')
{
buffer[m++]=c;
end();
m=0;
}
else if(c=='.'&&(buffer[0]>='0'&&buffer[0]<='9'||buffer[0]=='-'&&buffer[1]>='0'&&buffer[1]<='9'))
{
j=1;
for(i=0;i<m;i++)if(buffer[i]=='.')break;
if(i<m)j=0;
if(j==1)buffer[m++]=c;
else
{
m=0;
end();
buffer[m++]=c;
}
}
else
{
m=0;
end();
buffer[m++]=c;
}
}
}
}
if(m>0)
{
end();
}
fclose(in);
p=head;i=1;
out=fopen("result.txt","w");
while(p)
{
fprintf(out,"%d行:\t%d\t\t",p->nr,p->grade);
if(p->grade<5)fprintf(out,"%s\t\t预定义字\n",p->ch);
else if(p->grade<37)fprintf(out,"%s\t\t基本保留字\n",p->ch);
else if(p->grade<43)fprintf(out,"%s\t\t符号(括号)\n",p->ch);
else if(p->grade<51)fprintf(out,"%s\t\t符号\n",p->ch);
else if(p->grade<58)fprintf(out,"%s\t\t符号(算术运算符)\n",p->ch);
else if(p->grade<64)fprintf(out,"%s\t\t符号(判别大小符)\n",p->ch);
else if(p->grade<71)fprintf(out,"%s\t\t符号(逻辑运算符)\n",p->ch);
else if(p->grade<76)fprintf(out,"%s\t\t符号(赋值运算符)\n",p->ch);
else if(p->grade==76)fprintf(out,"%s\t\t其他单词\n",p->ch);
else if(p->grade==77)fprintf(out,"%s\t\t数字\n",p->di);
else fprintf(out,"%s\t\tunknown_?\n",p->ch);
p=p->next;
}
}
}
int main()
{
//printf("%s",B[74]);
fun();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -