专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C语言教程 » c语言词法分析器:词法分析器 »正文

c语言词法分析器:词法分析器

来源: 发布时间:星期四, 2008年9月25日 浏览:21次 评论:0

#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[8]={\"do\",\"begin\",\"else\",\"end\",\"if\",\"then\",\"var\",\"while\"};
char *operatornum[4]={\"+\",\"-\",\"*\",\"/\"};
char *comparison[6]={\"<\",\"<=\",\"=\",\">\",\">=\",\"<>\"};
char *interpunction[6]={\",\",\";\",\":=\",\".\",\"(\",\")\"};
//////////////////////////////////////////////////////////////////////////////////////////
bool search(char searchstr[],int wordtype)
{
int i;
switch (wordtype)
{
case 1:for(i=0;i<=7;i++)
{
if(strcmp(keyword[i],searchstr)==0)
return(true);

}
case 2:{
for(i=0;i<=3;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);
}

//////////////////////////////////////////////////////////////////////////////////////////////

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)
str=letterprocess(str);
else
{
if (isdigit(str)!=0)
str=numberprocess(str);
else
str=otherprocess(str);
}

};
printf(\"词法分析结束,谢谢使用!\\n\");

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: