#include #define ID 12
#define INT 13
#define JF 14
#define YSF 15
#define N 30
char TOKEN[N];
FILE *write;
int looksame(char *a)
{
int i;
Char*key[22]={"begin","end","if","then","else","for","do","while","and","or","not",
"BEGIN","END","IF","THEN","ELSE","FOR","DO","WHILE","AND","OR","NOT"};
for(i = 0;i < 22;i++)
{
if(strcmp(key[i],a) == 0)/*该字符串是否与关键字相匹配*/
return (i%11+1);
}
return 0;
}
/*本函数的意思是,查询一个字符串,看其是否与指定的字符相匹配,如果匹配返回1个非零的值,如果不匹配,则返回一个0值*/
void out(int a,char *b)
{
FILE *write;
write = fopen("E:\\b.txt","a+");
if(write == NULL)
{
printf("文件打开失败");
exit(0);
}
fprintf(write,"%d\t", a);
fwrite(b,strlen(b),1,write);
fprintf(write,"\n");
fclose(write);
printf("%d %20s\t\t",a,b);
}
//这个函数的意思就是吧a输入到指定文件中,然后从该文件中读出字符串,放到一个数组中输出//
int error()
{
printf("书写格式错误,未被识别\n");
return 0;
}
void function(FILE *fp)
{
char ch=' ';
int i,c;
while(ch!= EOF)
{
ch = fgetc(fp);
while(ch == ' ' || ch == '\t' || ch == '\n') {
ch = fgetc(fp);
}
if(isalpha(ch)) //isalpha()判断是否为英文字母,是则返回非零值,否则返回零值//
{
TOKEN[0] = ch;
ch = fgetc(fp);
i = 1;
while(isalnum(ch)) //isalnum()判断字符是否为英文字母或数字,如果是则返 回非零值,如果不是则返回零值//
{
TOKEN[i] = ch;
i++;
ch = fgetc(fp); }
TOKEN[i] = '\0';
fseek(fp,-1,1);
c = looksame(TOKEN);
if(c == 0)
{
out(ID,TOKEN);printf("标示符\n");
}
else
{
out(c,TOKEN);printf("关键字\n");
}
}
else if(isdigit(ch)) //isdigit()判断是否为a0-9的数字//
{
TOKEN[0] = ch;
ch = fgetc(fp);
i = 1;
while(isdigit(ch))
{
TOKEN[i] = ch;
i++;
ch = fgetc(fp);
}
TOKEN[i] = '\0';
fseek(fp,-1,1);
out(INT,TOKEN);
printf("常数\n");
}
else
{
switch(ch)
{
case'+':out(YSF,"+");printf("运算符\n");
break;
case'-':out(YSF,"-");printf("运算符\n");
break;
case';':out(JF,";");printf("界符\n");
break;
case',':out(JF,",");printf("界符\n");
break;
case'|':out(YSF,"|");printf("运算符\n");
break;
case'{':out(JF,"{");printf("界符\n");
break;
case'(':out(JF,"(");printf("界符\n");
break;
case'!':out(JF,"!");printf("界符\n");
break;
case'^':out(JF,"^");printf("界符\n");
break;
case')':out(JF,")");printf("界符\n");
break;
case'}':out(JF,"}");printf("界符\n");
break;
case'')
{
out(YSF,"<>");
printf("运算符\n");
}
else
{
fseek(fp,-1,1);
out(YSF,"':ch = fgetc(fp);
if(ch == '=')
{
out(YSF,">=");
printf("运算符\n");
}
else
{
fseek(fp,-1,1);
out(YSF,">");
printf("运算符\n");
}
break;
case':':ch = fgetc(fp);
if(ch == '=')
{
out(YSF,":=");
printf("运算符\n");
}
else
{
fseek(fp,-1,1);
out(JF,":");
printf("界符\n");
}
break;
case'/':ch = fgetc(fp);
if(ch == '*')
{
out(JF,"/*");
printf("界符\n");
while(1) // 注释的内容不反应在词法分析中// {
while(ch != '/')
ch = fgetc(fp);
fseek(fp, -2, 1);
ch = fgetc(fp);
if(ch == '*')
{
fseek(fp, 1, 1);
break;
}
else
{
fseek(fp, 2, 1);
ch = fgetc(fp);
}
}
fseek(fp, -2, 1);
}
else
{
fseek(fp,-1,1);
out(JF,"/");
printf("界符\n");
}
break;
case'*':ch = fgetc(fp);
if(ch == '/')
{
out(JF,"*/");
printf("界符\n");
}
else
{
fseek(fp,-1,1);
out(YSF,"*");
printf("运算符\n");
}
break;
case EOF:break;
default:error();
break;
}
}
}
}
int main()
{
FILE *read;
read = fopen("E:\\a.txt","r");
write = fopen("E:\\b.txt","a+");
if(read == NULL)
{
printf("FILE OPEN FAIL!");//
exit(0);
}
printf("===========================================================\n");
printf("====================词法分析程序===========================\n");
printf("===========该分析程序的文件存放在D:\\a.txt目录下==========\n");
printf("===========该程序的分析结果存放在D:\\b.txt目录下===========\n");
printf("============================================================\n");
function(read);
fclose(read);
system("pause");
return 0;
}