#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
int count=0;
struct WK
{
int kind;//单词种别编码:1自定义标识符2字符3字符串4常数5关键字6界符
char name;//单词属性
}WK_list[200];
//关键字、自定义标识符识别
void gjzbsf(char c,FILE *fp1)
{
int i=0;
int n;
char word[200]="";
char *key[32]={"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"};//关键字保留
while(c=='_'||(c>='a'&&c<='z')||(c>='A'&&c<='Z')||(c>='0'&&c<='9')&&((c=fgetc(fp1))!=EOF))
{
word[i++]=c;
c=fgetc(fp1);
}
if(c==' '||c=='\t'||c=='\n'||c=='+'||c=='-'||c=='*'||c=='/'||c=='>'||c=='<'||c==','||c=='.'||c==';'||c==':'||c=='!'||c=='('||c==')'||c=='['||c==']'||c=='{'||c=='}')
{
word[i]='\0';
for(n=0;n<32;n++)
{
if(strcmp(word,key[n])==0)
{
WK_list[count].kind=5;
WK_list[count].name=word;
count++;
break;
}//存储关键字
}
if(n==32)
{
WK_list[count].kind=1;
WK_list[count].name=word;
count++;
}//存储自定义标识符
}
return 0;
}
//字符识别
void zf(char c,FILE *fp1)
{
int i=0;
char word[200]="";
word[i++]=c;
c=fgetc(fp1);
while(c!='\''&&((c=fgetc(fp1))!=EOF))
{
word[i++]=c;
c=fgetc(fp1);
}
word[i++]=c;
c=fgetc(fp1);
WK_list[count].kind=2;
WK_list[count].name=word;
count++;
}
//字符串识别
void zfc(char c,FILE *fp1)
{
int i=0;
char word[200]="";
word[i++]=c;
c=fgetc(fp1);
while(c!='\"'&&((c=fgetc(fp1))!=EOF))
{
word[i++]=c;
c=fgetc(fp1);
}
word[i++]=c;
c=fgetc(fp1);
WK_list[count].kind=3;
WK_list[count].name=word;
count++;
}
//常数识别
void cs(char c,FILE *fp1)
{
int i=0;
char word[200]="";
int state=0;
bool flag=false;
while (state!=7)
{
switch(state)
{
case 0:
if((c>='0'&&c<='9')||c=='-')
{
state=1;
word[i++]=c;
c=fgetc(fp1);
}
break;
case 1:
if(c>='0'&&c<='9')
{
state=1;
word[i++]=c;
c=fgetc(fp1);
}
else if(c=='e'||c=='E')
{
state=4;
word[i++]=c;
c=fgetc(fp1);
}
else if(c=='.')
{
state=2;
word[i++]=c;
c=fgetc(fp1);
}
else
{
state=7;
flag=true;
}
break;
case 2:
if(c>='0'&&c<='9')
{
state=3;
word[i++]=c;
c=fgetc(fp1);
}
break;
case 3:
if(c=='e'||c=='E')
{
state=4;
word[i++]=c;
c=fgetc(fp1);
}
else if(c>='0'&&c<='9')
{
state=3;
word[i++]=c;
c=fgetc(fp1);
}
else flag=true;
break;
case 4:
if(c=='+'||c=='-')
{
state=5;
word[i++]=c;
c=fgetc(fp1);
}
else if(c>='0'&&c<='9')
{
state=6;
word[i++]=c;
c=fgetc(fp1);
}
break;
case 5:
if(c>='0'&&c<='9')
{
state=6;
word[i++]=c;
c=fgetc(fp1);
}
break;
case 6:
if(c>='0'&&c<='9')
{
state=6;
word[i++]=c;
c=fgetc(fp1);
}
if(c<'0'&&c>'9')
{
state=7;
}
break;
case 7:
flag=true;
break;
}
if(flag) break;
}
word[i]='\0';
WK_list[count].kind=4;
WK_list[count].name=word;
count++;
}
//界符识别
void jf(char c,FILE *fp1)
{
int i=0;
char word[200]="";
if((c<'a'&&c>'z')&&(c<'A'&&c>'Z')&&(c<'0'&&c>'9'))
{
word[i++]=c;
c=fgetc(fp1);
}
if(c=='=')
{
word[i++]=c;
c=fgetc(fp1);
}
WK_list[count].kind=6;
WK_list[count].name=word;
count++;
}
int main()
{
int num;
char c;
char word[200];
FILE *fp1,*fp2;
fp1=fopen("E:\\资料\\词法测试用例\\1.3词法分析\\测试用例\\1\\input.txt","rt");
fp2=fopen("E:\\资料\\词法测试用例\\1.3词法分析\\测试用例\\1\\output1.txt","wt+");
while((c=fgetc(fp1))!=EOF)
{
while(c==' '||c=='\t'||c=='\n') c=fgetc(fp1);//消耗空格制表换行符
if(c=='_'||(c>='a'&&c<='z')||(c>='A'&&c<='Z'))//关键字标识符
{
gjzbsf(c,fp1);
printf("关键字标识符识别\n");
continue;
}
else if((c>='0'&&c<='9')||c=='-')//常数
{
cs(c,fp1);
printf("常数识别\n");
continue;
}
else if(c=='\'')//字符
{
zf(c,fp1);
printf("字符识别\n");
continue;
}
else if(c=='\"')//字符串
{
zfc(c,fp1);
printf("字符串识别\n");
continue;
}
else//界符
{
jf(c,fp1);
printf("界符识别\n");
continue;
}
}
for(num=0;num<=count;num++)
{
fprintf(fp2,"%d %s\n",WK_list[num].kind,WK_list[num].name);
}
fclose(fp1);
fclose(fp2);
printf("词法分析结束");
return 0;
}
如图所示,代码执行后并未将结构体输出到文本文件中,萌新不知道是哪个环节出了问题,有无大佬指点一二
编译原理一般要用上堆栈吧,计算机的编译原理都是利用堆栈来实现的
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632