编译原理词法分析程序
#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; }
请dalao不吝赐教。