#include <iostream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
using namespace std;
#define MAX 22
char ch =' ';
string key[15]={"switch","break","if","then","else","while","write","read",
"do", "int","const","char","float","double","for"};
int Iskey(string c) //关键字判断
{
int i;
for(i=0;i<MAX;i++)
{
if(key[i].compare(c)==true)
return 1;
}
return 0;
}
int IsLetter(char c) //判断是否为字母
{
if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))
return 1;
else
return 0;
}
int IsDigit(char c) //判断是否为数字
{
if(c>='0'&&c<='9')
return 1;
else
return 0;
}
void analyse(FILE *fpin) //词法分析程序
{
string arr="";
while((ch=fgetc(fpin))!=EOF)
{
arr="";
if(ch==' '||ch=='\t'||ch=='\n')
{
}
else if(IsLetter(ch))
{
while(IsLetter(ch)||IsDigit(ch))
{
if((ch<='Z')&&(ch>='A'))
ch=ch+32;
arr=arr+ch;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
if (Iskey(arr))
{
cout<<arr<<"\t$关键字"<<endl;
}
else cout<<arr<<"\t$普通标识符"<<endl;
}
else if(IsDigit(ch))
{
while(IsDigit(ch)||(ch=='.'&&IsDigit(fgetc(fpin))))
{
arr=arr+ch;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
cout<<arr<<"\t$无符号实数"<<endl;
}
else switch(ch)
{
case'+':
case'-' :
case'*' :
case'=' :
case'/' :cout<<ch<<"\t$运算符"<<endl;break;
case'(' :
case')' :
case'[' :
case']' :
case';' :
case'.' :
case',' :
case'{' :
case'}' :cout<<ch<<"\t$界符"<<endl;break;
case':' :
{ch=fgetc(fpin);
if(ch=='=')
cout<<":="<<"\t$运算符"<<endl;
else
{
cout<<"="<<"\t$运算符"<<endl;;
fseek(fpin,-1L,SEEK_CUR);
}
}break;
case'>' :{ch=fgetc(fpin);
if(ch=='=') cout<<">="<<"\t$运算符"<<endl;
if(ch=='>')cout<<">>"<<"\t$输入控制符"<<endl;
else {cout<<">"<<"\t$运算符"<<endl;
fseek(fpin,-1L,SEEK_CUR);}
}break;
case'<' :{ch=fgetc(fpin);
if(ch=='=')cout<<"<="<<"\t$运算符"<<endl;
else if(ch=='<')cout<<"<<"<<"\t$输出控制符"<<endl;
else if(ch=='>') cout<<"<>"<<"\t$运算符"<<endl;
else{cout<<"<"<<"\t$运算符"<<endl;
fseek(fpin,-1L,SEEK_CUR);}
}break;
default : cout<<ch<<"\t$无法识别字符"<<endl;
}
}
}
int main()
{
char in_fn[30];
FILE * fpin;
cout<<"请输入源文件名(包括路径和后缀名):";
for(;;)
{
cin>>in_fn;
if((fpin=fopen(in_fn,"r"))!=NULL)
break;
else
cout<<"文件路径错误!请输入源文件名(包括路径和后缀名):";
}
cout<<"\n********************分析如下*********************"<<endl;
analyse(fpin);
fclose(fpin);
return 0;
}
编译原理词法分析程序
最新推荐文章于 2024-05-24 16:43:42 发布