#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
//定义关键字
char *Key[20]={"main","unsigned","break","return","void","case",
"float","char","for","while","continue","if","default",
"do","int","switch","double","long","else"};
char Word[20],ch; //存储识别出的单词流
int IsAlpha(char c)
{
if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))
return 1;
else return 0;
}
//判断是否为字母
int IsNum(char c)
{
if(c>'0'&&c<'9')
return 1;
else return 0;
}
//判断是否为数字
int IsKey(char *Word)
{
int m,i;
for(i=0;i<20;i++)
{
if((m=strcmp(Word,Key[i]))==0)
{
return 1;
}
}
return 0;
}
//识别关键字函数
void scanner(FILE *fp)
{
char Word[100]={'\0'};
char ch;
int i,c;
ch=fgetc(fp); //获取字符,指针自动指向下一个字符
if(IsAlpha(ch)) //字母
{
Word[0]=ch;
ch=fgetc(fp);
i=1;
while(IsNum(ch)||IsAlpha(ch))
{
Word[i]=ch;
i++;
ch=fgetc(fp);
}
Word[i]='\0';
fseek(fp,-1,1); //回退
c=IsKey(Word); //判断关键字
if(c==0)
printf("%s\t,\t\n标识符\n",Word);
else
printf("%s\t,\t保留字\n\n",Word);
}
else if(IsNum(ch)) //数字
{
Word[0]=ch;
ch=fgetc(fp);
i=1;
while(IsNum(ch)){
Word[i]=ch;
i++;
ch=fgetc(fp);
}
Word[i]='\0';
fseek(fp,-1,1);
printf("%s\t,\t常量\n\n",Word);
}
else //不是字母和数字
{
Word[0]=ch;
switch(ch)
{
case '{':printf("%s\t,\t界限符\n\n",Word);break;
case '}':printf("%s\t,\t界限符\n\n",Word);break;
case '[':printf("%s\t,\t界限符\n\n",Word);break;
case ']':printf("%s\t,\t界限符\n\n",Word);break;
case '(':printf("%s\t,\t界限符\n\n",Word);break;
case ')':printf("%s\t,\t界限符\n\n",Word);break;
case ',':printf("%s\t,\t界限符\n\n",Word);break;
case ';':printf("%s\t,\t界限符\n\n",Word);break;
case '+':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='=')
printf("%s\t,\t运算符\n\n",Word); //+=
else if(ch=='+')
printf("%s\t,\t运算符\n\n",Word); //++
else if(ch=='!')
printf("%s\t,\t运算符\n\n",Word); // !+
else{
fseek(fp,-1,1);
printf("%s\t,\t运算符\n\n",Word); //+
}
break;
case '-':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='=')
printf("%s\t,\t运算符\n\n",Word); //-=
else if(ch=='-')
printf("%s\t,\t运算符\n\n",Word); //--
else{
fseek(fp,-1,1);
printf("%s\t,\t运算符\n\n",Word); //-
}
break;
case '*':printf("%s\t,\t运算符\n\n",Word);break;
case '/':printf("%s\t,\t运算符\n\n",Word);break;
case '>':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='=')
printf("%s\t,\t运算符\n\n",Word); //>=
printf("%s\t,\t运算符\n\n",Word);
break;
case '<':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='=')
printf("%s\t,\t运算符\n\n",Word); //<=
else printf("%s\t,\t运算符\n\n",Word);
break;
case '!':printf("%s\t,\t运算符\n\n",Word);break;
case '&':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='&')
printf("%s\t,\t运算符\n\n",Word);
break;
case '|':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='|')
printf("%s\t,\t运算符\n\n",Word);
break;
default:printf("无法识别字符!\n\n",Word);break;
}
}
}
int main()
{
char in_fn[30]; //文件路径
FILE *fp;
printf("\n请输入源文件名(包括路径和后缀名):");
gets(in_fn);
if((fp=fopen(in_fn,"r"))==NULL){
exit(0);
}
//读取文件内容,并返回文件指针,该指针指向文件的第一个字符s
printf("\n**********词法分析结果如下**********\n");
while(!feof(fp)){
ch=fgetc(fp);
if(ch==' '||ch=='\t'||ch=='\n'){} //忽略空格、空白、换行
else {
fseek(fp,-1,1);
scanner(fp);
}
}
return 0;
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
//定义关键字
char *Key[20]={"main","unsigned","break","return","void","case",
"float","char","for","while","continue","if","default",
"do","int","switch","double","long","else"};
char Word[20],ch; //存储识别出的单词流
int IsAlpha(char c)
{
if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))
return 1;
else return 0;
}
//判断是否为字母
int IsNum(char c)
{
if(c>'0'&&c<'9')
return 1;
else return 0;
}
//判断是否为数字
int IsKey(char *Word)
{
int m,i;
for(i=0;i<20;i++)
{
if((m=strcmp(Word,Key[i]))==0)
{
return 1;
}
}
return 0;
}
//识别关键字函数
void scanner(FILE *fp)
{
char Word[100]={'\0'};
char ch;
int i,c;
ch=fgetc(fp); //获取字符,指针自动指向下一个字符
if(IsAlpha(ch)) //字母
{
Word[0]=ch;
ch=fgetc(fp);
i=1;
while(IsNum(ch)||IsAlpha(ch))
{
Word[i]=ch;
i++;
ch=fgetc(fp);
}
Word[i]='\0';
fseek(fp,-1,1); //回退
c=IsKey(Word); //判断关键字
if(c==0)
printf("%s\t,\t\n标识符\n",Word);
else
printf("%s\t,\t保留字\n\n",Word);
}
else if(IsNum(ch)) //数字
{
Word[0]=ch;
ch=fgetc(fp);
i=1;
while(IsNum(ch)){
Word[i]=ch;
i++;
ch=fgetc(fp);
}
Word[i]='\0';
fseek(fp,-1,1);
printf("%s\t,\t常量\n\n",Word);
}
else //不是字母和数字
{
Word[0]=ch;
switch(ch)
{
case '{':printf("%s\t,\t界限符\n\n",Word);break;
case '}':printf("%s\t,\t界限符\n\n",Word);break;
case '[':printf("%s\t,\t界限符\n\n",Word);break;
case ']':printf("%s\t,\t界限符\n\n",Word);break;
case '(':printf("%s\t,\t界限符\n\n",Word);break;
case ')':printf("%s\t,\t界限符\n\n",Word);break;
case ',':printf("%s\t,\t界限符\n\n",Word);break;
case ';':printf("%s\t,\t界限符\n\n",Word);break;
case '+':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='=')
printf("%s\t,\t运算符\n\n",Word); //+=
else if(ch=='+')
printf("%s\t,\t运算符\n\n",Word); //++
else if(ch=='!')
printf("%s\t,\t运算符\n\n",Word); // !+
else{
fseek(fp,-1,1);
printf("%s\t,\t运算符\n\n",Word); //+
}
break;
case '-':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='=')
printf("%s\t,\t运算符\n\n",Word); //-=
else if(ch=='-')
printf("%s\t,\t运算符\n\n",Word); //--
else{
fseek(fp,-1,1);
printf("%s\t,\t运算符\n\n",Word); //-
}
break;
case '*':printf("%s\t,\t运算符\n\n",Word);break;
case '/':printf("%s\t,\t运算符\n\n",Word);break;
case '>':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='=')
printf("%s\t,\t运算符\n\n",Word); //>=
printf("%s\t,\t运算符\n\n",Word);
break;
case '<':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='=')
printf("%s\t,\t运算符\n\n",Word); //<=
else printf("%s\t,\t运算符\n\n",Word);
break;
case '!':printf("%s\t,\t运算符\n\n",Word);break;
case '&':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='&')
printf("%s\t,\t运算符\n\n",Word);
break;
case '|':
ch=fgetc(fp);
Word[1]=ch;
if(ch=='|')
printf("%s\t,\t运算符\n\n",Word);
break;
default:printf("无法识别字符!\n\n",Word);break;
}
}
}
int main()
{
char in_fn[30]; //文件路径
FILE *fp;
printf("\n请输入源文件名(包括路径和后缀名):");
gets(in_fn);
if((fp=fopen(in_fn,"r"))==NULL){
exit(0);
}
//读取文件内容,并返回文件指针,该指针指向文件的第一个字符s
printf("\n**********词法分析结果如下**********\n");
while(!feof(fp)){
ch=fgetc(fp);
if(ch==' '||ch=='\t'||ch=='\n'){} //忽略空格、空白、换行
else {
fseek(fp,-1,1);
scanner(fp);
}
}
return 0;
}
可识别标识符、关键字、数字和符号,需要输入文档名称