词法分析程序的功能:
一个具体的词法分析程序,从输入的源程序中,识别出各个具有独立意义的单词,即基本关键字、标识符、数字、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。
符号与种别码对照表:
用文法描述词法规则:
源代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Analyse(FILE *fp,char ch);
main()
{
FILE *fp;
char ch;
printf("请输入源程序代码(以#键结束):
");
if((fp=fopen("data.txt","w"))==NULL)
{
printf("Failure to open data.txt!
");
exit(0);
}
ch=getchar();
while(ch!='#')//将字符串存放到文件中
{
fputc(ch,fp);
ch=getchar();
}
fclose(fp);
if((fp=fopen("data.txt","rb"))==NULL)
{
printf("Failure to open data.txt!
");
exit(0);
}
ch=fgetc(fp);
Analyse(fp,ch);
}
void Analyse(FILE *fp,char ch)
{
char keyword[40][40]={"include","auto","break","case","char","const","continue","default","do","double","else","enum","extern","float","for","goto","if","int","long","return","short","sizeof","static","struct","switch","typedef","union","void","while"};
int i=0,j,flag;
int n=0,m;
char alp[20];
char num[11];
FILE *fp1;
FILE *fp2;
while(!feof(fp))
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%'||ch=='='||ch=='>'||ch=='<')//判断判断运算符
printf("%c 运算符
",ch);
else if(ch==';'||ch=='{'||ch=='}'||ch=='('||ch==')')//判断分隔符
printf("%c 分隔符
",ch);
else if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')//判断字符是不是字母
{
if((fp1=fopen("data1.txt","w"))==NULL)
{
printf("Failure to open data1.txt!
");
exit(0);
}
while(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')//将每个字母合并成一个字符串放到有个新的文件中
{
fputc(ch,fp1);
i++;
ch=fgetc(fp);
}
fclose(fp1);
if((fp1=fopen("data1.txt","rb"))==NULL)
{
printf("Failure to open data1.txt!
");
exit(0);
}
fgets(alp,i+1,fp1);
for(j=0;j<30;j++)
{
if(strcmp(alp,keyword[j])==0)//判断是否为关键字或标识符
flag=1;
}
if(flag==1)
printf("%s 关键字
",alp);
else
printf("%s 标识符
",alp);
fclose(fp1);
Analyse(fp,ch);
}
else if(ch=='
'||ch==' ')//识别回车和空格
printf("
");
else if(ch>='0'&&ch<='9')//识别数字
{
if((fp2=fopen("data2.txt","w"))==NULL)
{
printf("Failure to open data2.txt!
");
exit(0);
}
while(ch>='0'&&ch<='9')
{
fputc(ch,fp2);
n++;
ch=fgetc(fp);
}
fclose(fp2);
if((fp2=fopen("data2.txt","rb"))==NULL)
{
printf("Failure to open data2.txt!
");
exit(0);
}
fgets(num,n+1,fp2);
printf("%s 数字
",num);
fclose(fp2);
Analyse(fp,ch);
}
ch=fgetc(fp);//放到所有if后面
}
}
截图: