//#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include <ctype.h>
#include <conio.h>
#define NULL 0
FILE *fp;
char ch;
char *keyword[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"};
char *operatornum[5]={"+","-","*","/","%"};
char *comparison[6]={"<","<=","==",">",">=","<>"};
char *interpunction[6]={",",";","=",".","(",")"};
////////////////////////////////////////////////////////////////////////
bool search(char searchstr[],int wordtype)
{
int i;
switch (wordtype)
{
case 1:for(i=0;i<=31;i++)
{
if(strcmp(keyword[i],searchstr)==0)
return(true);
}
case 2:{
for(i=0;i<=4;i++)
{
if(strcmp(operatornum[i],searchstr)==0)
return(true);
}
break;
}
case 3: for(i=0;i<=5;i++)
{
if(strcmp(comparison[i],searchstr)==0)
return(true);
}
case 4: for(i=0;i<=5;i++)
{
if(strcmp(interpunction[i],searchstr)==0)
return(true);
}
}
return(false);
}
///////////////////////////////////////////////////////////////////////////////////////////
char letterprocess (char ch)//字母处理函数
{
int i=-1;
char letter[20];
while (isalnum(ch)!=0) //如果本函数的变元为字母或数字,它将返回非零值,否则返回零值
{
letter[++i]=ch;
ch=fgetc(fp);
};
letter[i+1]='/0';
if (search(letter,1))
{
printf("<%s,->/n",letter);
//strcat(letter,"/n");
//fputs('<' letter '>/n',outp);
}
else
{
printf("<indentifier,%s>/n",letter);
//strcat(letter,"/n");
//fputs(letter,outp);
}
return(ch);
}
////////////////////////////////////////////////////////////////////////////////////////
char numberprocess(char ch) //数字处理程序
{
int i=-1;
char num[20];
while (isdigit(ch)!=0)
{
num[++i]=ch;
ch=fgetc(fp);
}
/* if(isalpha(ch)!=0)
{
while(isspace(ch)==0)
{
num[++i]=ch;
ch=fgetc(fp);
}
num[i+1]='/0';
printf("错误!非法标识符:%s/n",num);
goto u;
}*/
num[i+1]='/0';
printf("<num,%s>/n",num);
//strcat(num,"/n");
//fputs(num,outp);
//u: return(ch);
return(ch);
}
//////////////////////////////////////////////////////////////////////////////////////////////
char otherprocess(char ch)
{
int i=-1;
char other[20];
if (isspace(ch)!=0)
{
ch=fgetc(fp);
goto u;
}
while ((isspace(ch)==0)&&(isalnum(ch)==0))
{
other[++i]=ch;
ch=fgetc(fp);
}
other[i+1]='/0';
if (search(other,2))
printf("<relop,%s>/n",other);
else
if (search(other,3))
printf("<%s,->/n",other);
else
if (search(other,4))
printf("<%s,->/n",other);
else
printf("错误!非法字符:%s/n",other);
u: return (ch);
}
/////////////////////////////////////////////////////////////////////////////////////////////
void main ()
{
char str,c;
printf("**********************************词法分析器************************************/n");
//outp=fopen("二元式表.txt","w");
if ((fp=fopen("源程序.txt","r"))==NULL)
printf("源程序无法打开!/n");
else
{
str =fgetc(fp);
while (str!=EOF)
{
if (isalpha(str)!=0) //判断字符c是否为英文字母,当c为英文字母a-z或A-Z时,在标准c中相当于使用“isupper(c)||islower(c)”做测试,返回非零值,否则返回零。
str=letterprocess(str);
else
{
if (isdigit(str)!=0) //判断字符c是否为数字,当c为数字0-9时,返回非零值,否则返回零
str=numberprocess(str);
else
str=otherprocess(str);
}
};
printf("词法分析结束,谢谢使用!/n");
printf("点任意键退出!/n");
}
c=getch();
}