词法分析程序

/*************************************************************/
/*
/*词法分析程序
/*maker:张建波
/*date:2005-10-26
/*
/*************************************************************/
#include "stdio.h"
#include "ctype.h"
#include "string.h"

/*保留字数量*/
#define keywordSum 8
char *keyword[keywordSum]={"if","else","for","while","do","int","read","write"};

/*纯但单分界符*/
#define singlewordSum 10
char singleword[singlewordSum]="+-*(){};,:";

/*双分界符*/
#define doublewordSum 4
char doubleword[doublewordSum]="<>=!";

#define wordlen 40 /*单词最大长度*/


char ScanInFile[300]; /*待分析的源程序文件*/
char ScanOutFile[305]; /*词法分析后的输出文件*/

FILE *fin,*fout; /*输入输出文件的指针*/

int LoadCodeFile()
{
/* 打开待分析的 源代码文件*/

printf("请输入源程序文件名:");
scanf("%s",ScanInFile);
if((fin=fopen(ScanInFile,"r"))==NULL)
{
printf("\n找不到文件:%s\n文件打开失败!\n");
return 0;
}
else
return 1;
}

int CreatWordFile()
{
/*创建次词法分析后结果的输出 文件*/
int len=0;
int i=0;
strcpy(ScanOutFile,ScanInFile);
while(ScanOutFile[i++]!='.');
ScanOutFile[i+1]='s';
ScanOutFile[i+2]='c';
ScanOutFile[i+3]='n';
ScanOutFile[i+4]='\0';
if((fout=fopen(ScanOutFile,"w"))==NULL)
{
/*文件创建失败*/
return 0;
}
else
return 1;

}

/*词法分析程序*/
int TScan()
{

char ch,token[wordlen]; /*ch 为每次读入的字符,token 为识别出来的单词*/

char ch1; /*处理注释时 用的临时变量*/

int err=0; /* 设置错误代码为 0, 表示没有错误 */
int j,n; /*临时变量,控制组合单词时的数组下标*/


if(LoadCodeFile()==0)
return 1; /*源代码文件读取失败*/
if(CreatWordFile()==0)
return 2; /*文件创建失败*/

ch=getc(fin);
while(ch!=EOF)
{
while(ch==' '||ch=='\n'||ch=='\t')
{
ch=getc(fin);
}
if(isalpha(ch))
{
/*输入的是字母,进行 标示符 处理*/
token[0]=ch;
j=1;
while(isalnum(ch))
{
token[j++]=ch;
ch=getc(fin);
}/*如果是字母数字则组合,否则结束*/
token[j]='\0';
/*查找保留字*/
n=0;
while((n<keywordSum) && strcmp(token,keyword[n]))
n++;
if(n>=keywordSum)
{
/*输出标示符*/
fprintf(fout,"%s\t%s\n","ID",token);
printf("%s\t%s\n","ID",token);
}
else
{
/*输出保留字*/
fprintf(fout,"%s\t%s\n",token,token);
printf("%s\t%s\n",token,token);
}
}
else if(isdigit(ch))
{
/*输入的是数字,进行 数字处理*/
token[0]=ch;
j=1;
ch=getc(fin);/*读下一字符*/
while(isdigit(ch))
{/*如果是数字则整合数字*/
token[j++]=ch;
ch=getc(fin);
}
token[j]='\0';/*整数整合结束*/
fprintf(fout,"%s\t%s\n","NUM",token);
printf("%s\t%s\n","NUM",token);
}
else if(strchr(singleword,ch)>0)
{
/*输入的是单分界符*/
token[0]=ch;
token[1]='\0';
ch=getc(fin);
fprintf(fout,"%s\t%s\n",token,token);
printf("%s\t%s\n",token,token);
}
else if(strchr(doubleword,ch)>0)
{
/*输入的是双分界符*/
token[0]=ch;
ch=getc(fin);
if(ch=='=') /*如果是 = 则组合双分界符*/
{
token[1]=ch;token[2]='\0';
ch=getc(fin);
}
else
{
token[1]='\0';
}
fprintf(fout,"%s\t%s\n",token,token);
printf("%s\t%s\n",token,token);
}
else if(ch=='/')
{
/*注释处理*/
ch=getc(fin);
if(ch=='*')
{
ch1=getc(fin);
do
{
ch=ch1;
ch1=getc(fin);
}while((ch!='*'||ch1!='/')&&ch1!=EOF);
ch=getc(fin);
}
else
{
token[0]='/';
token[1]='\0';
fprintf(fout,"%s\t%s\n",token,token); /*输出单词分界符*/
printf("%s\t%s\n",token,token);
}
}
else
{
/*无法识别的字符 */
token[0]=ch;
token[1]='\0';
ch=getc(fin);
err=3;
fprintf(fout,"%s\t%s\n","ERROR",token); /*输出错误符号*/
printf("%s\t%s\n","ERROR",token);
}
}
return err;
}

void main()
{
int e=0;
e=TScan();
if(e>0)printf("编译错误!");
else
printf("词法分析成功!");

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值