#include <iostream> #include<string> using namespace std; #define MAX 22 char ch =' '; string key[15]={"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat"}; int Iskey(string c){ //关键字判断 int i; for(i=0;i<MAX;i++) { if(key[i].compare(c)==0) 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; } } } void 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);