#include <iostream>#include <list>#include <iterator> using namespace std; int static biaozi=1;class str{public: str(int t,char a[],int len) { for(int i=0;i<len;i++) name[i]=a[i]; type=t; leng=len; } void show() { cout<<'('<<type<<','; for(int i=0;i<leng;i++) cout<<name[i]; cout<<')'; }private: int type; char name[10]; int leng;}; void change_input(char a[],int &len) //获取IO_BUFFER中的字符串到a数组{ char c; c=getchar(); while(c!='#') { a[len++]=c; c=getchar(); } a[len++]='#'; }void insert(list<str > &l,int t,char a[],int indexon,int leng)//把每个词法成分放入表中{ char temp[20]; for(int i=0;i<leng;i++) temp[i]=a[indexon+i]; l.push_back(str(t,temp,leng));}void check(list<str> &l,char a[],int len) //DFA词法扫描{ int disp=0;int leng=0; while(a[disp]!='#'&&disp+leng!=len&&biaozi!=0) { if(!(a[disp]>='a'&&a[disp]<='z'||a[disp]>='A'&&a[disp]<='Z'||(a[disp]>='0'&&a[disp]<='9')||a[disp]==' '||a[disp]=='<'||a[disp]=='>'||a[disp]=='='||a[disp]=='\n')){cout<<'('<<4<<','<<a[disp]<<')'<<endl;biaozi=0;goto down;}//处理非词法的字符 if(a[disp]==' '||a[disp]=='\n'){disp++;leng=0;goto down;}//略过空格及回车 if(a[disp]>='a'&&a[disp]<='z'||a[disp]>='A'&&a[disp]<='Z')//进入字母 { if(a[disp]=='B'||a[disp]=='b'||a[disp]=='E'||a[disp]=='e'||a[disp]=='I'||a[disp]=='i'||a[disp]=='T'||a[disp]=='t')//状态2,(8,20),12,15入口 { if(a[disp]=='E'||a[disp]=='e')//2,8 { leng++; if(a[disp+leng]=='N'||a[disp+leng]=='n'||a[disp+leng]=='L'||a[disp+leng]=='l') { if(a[disp+leng]=='N'||a[disp+leng]=='n')//9 { leng++; if(a[disp+leng]=='D'||a[disp+leng]=='d')//10 { leng++; if(a[disp+leng]>='0'&&a[disp+leng]<='9'||a[disp+leng]>='a'&&a[disp+leng]<='z'||a[disp+leng]>='A'&&a[disp+leng]<='Z') goto loop_biaoshi;//->25 else { insert(l,0,a,disp,leng); //END disp=disp+leng; leng=0; goto down; } } else goto loop_biaoshi;//->25 } else//21 { leng++; if(a[disp+leng]=='S'||a[disp+leng]=='s')//22 { leng++; if(a[disp+leng]=='E'||a[disp+leng]=='e')//23 { leng++; if(a[disp+leng]>='0'&&a[disp+leng]<='9'||a[disp+leng]>='a'&&a[disp+leng]<='z'||a[disp+leng]>='A'&&a[disp+leng]<='Z') goto loop_biaoshi;//->25 else { insert(l,0,a,disp,leng); //ELSE disp=disp+leng; leng=0; goto down; } } else goto loop_biaoshi;//->25 } else goto loop_biaoshi;//->25 } } else goto loop_biaoshi;//->25 } if(a[disp]=='I'||a[disp]=='i')//12 { leng++; if(a[disp+leng]=='F'||a[disp+leng]=='f')//13 { leng++; if(a[disp+leng]>='0'&&a[disp+leng]<='9'||a[disp+leng]>='a'&&a[disp+leng]<='z'||a[disp+leng]>='A'&&a[disp+leng]<='Z') { goto loop_biaoshi;//->25 } else { insert(l,0,a,disp,leng); //IF disp=disp+leng; leng=0; goto down; } } else goto loop_biaoshi;//->25 } if(a[disp]=='B'||a[disp]=='b')//2 { leng++; if(a[disp+leng]=='E'||a[disp+leng]=='e')//3 { leng++; if(a[disp+leng]=='G'||a[disp+leng]=='g')//4 { leng++; if(a[disp+leng]=='I'||a[disp+leng]=='i')//5 { leng++; if(a[disp+leng]=='N'||a[disp+leng]=='n')//6 { leng++; if(a[disp+leng]>='0'&&a[disp+leng]<='9'||a[disp+leng]>='a'&&a[disp+leng]<='z'||a[disp+leng]>='A'&&a[disp+leng]<='Z') goto loop_biaoshi;//->25 else { insert(l,0,a,disp,leng);//BEGIN disp=disp+leng; leng=0; goto down; } } else goto loop_biaoshi;//->25 } else goto loop_biaoshi; } else goto loop_biaoshi; } else goto loop_biaoshi; } if(a[disp]=='T'||a[disp]=='t')//15 { leng++; if(a[disp+leng]=='H'||a[disp+leng]=='h')//16 { leng++; if(a[disp+leng]=='E'||a[disp+leng]=='e')//17 { leng++; if(a[disp+leng]=='N'||a[disp+leng]=='n')//18 { leng++; if(a[disp+leng]>='0'&&a[disp+leng]<='9'||a[disp+leng]>='a'&&a[disp+leng]<='z'||a[disp+leng]>='A'&&a[disp+leng]<='Z') goto loop_biaoshi;//25 else { insert(l,0,a,disp,leng); //THEN disp=disp+leng; leng=0; goto down; } } else goto loop_biaoshi;//->25 } else goto loop_biaoshi; } else goto loop_biaoshi; } } else//25入口 { loop_biaoshi: while(a[disp+leng]!=' '&&a[disp+leng]!='\n'&&a[disp+leng]!='<'&&a[disp+leng]!='>'&&a[disp+leng]!='='&&a[disp+leng]!='#') { leng++; } insert(l,1,a,disp,leng); disp=disp+leng;leng=0; goto down; } } if(a[disp]>='0'&&a[disp]<='9')//27 { while(a[disp+leng]>='0'&&a[disp+leng]<='9') { leng++; } if(a[disp+leng]==' '||a[disp+leng]=='\n'||a[disp+leng]=='#'||a[disp+leng]=='<'||a[disp+leng]=='>'||a[disp+leng]=='=') { insert(l,2,a,disp,leng);//获取无符号整数 disp=disp+leng;leng=0; goto down; } else //错误的标识符 { while(a[disp+leng]>='a'&&a[disp+leng]<='z'||a[disp+leng]>='A'&&a[disp+leng]<='Z'||a[disp+leng]>='0'&&a[disp+leng]<='9') {leng++;} insert(l,4,a,disp,leng); disp=disp+leng;leng=0; biaozi=0; goto down; } } if(a[disp]=='>'||a[disp]=='<'||a[disp]=='=')//(29,31,36),34,(39,41) { if(a[disp]=='<')//(29,31,36) { leng++; if(a[disp+leng]=='='||a[disp+leng]=='>') { if(a[disp+leng]=='=')//32 { leng++; if(a[disp+leng]=='<'||a[disp+leng]=='>'||a[disp+leng]=='=') { while(a[disp+leng]=='<'||a[disp+leng]=='>'||a[disp+leng]=='=') { leng++; } insert(l,4,a,disp,leng); disp=disp+leng;leng=0; biaozi=0; goto down; } else { insert(l,3,a,disp,leng); disp=disp+leng;leng=0; goto down; } } if(a[disp+leng]=='>')//37 { leng++; if(a[disp+leng]=='<'||a[disp+leng]=='>'||a[disp+leng]=='=') { while(a[disp+leng]=='<'||a[disp+leng]=='>'||a[disp+leng]=='=') {leng++;} insert(l,4,a,disp,leng); disp=disp+leng;leng=0;biaozi=0; goto down; } else { insert(l,3,a,disp,leng); disp=disp+leng;leng=0; goto down; } } } else { if(a[disp+leng]=='<')//29 { while(a[disp+leng]=='<'||a[disp+leng]=='>'||a[disp+leng]=='=') {leng++;} insert(l,4,a,disp,leng); disp=disp+leng;leng=0; biaozi=0; goto down; } else { insert(l,3,a,disp,leng); disp=disp+leng;leng=0; goto down; } } } if(a[disp]=='=')//34 { leng++; if(a[disp+leng]=='<'||a[disp+leng]=='>'||a[disp+leng]=='=') { while(a[disp+leng]=='<'||a[disp+leng]=='>'||a[disp+leng]=='=') {leng++;} insert(l,4,a,disp,leng); disp=disp+leng;leng=0; biaozi=0; goto down; } else { insert(l,3,a,disp,leng); disp=disp+leng;leng=0; goto down; } } if(a[disp]=='>')//39,41 { leng++; if(a[disp+leng]=='=')//42 { leng++; if(a[disp+leng]=='<'||a[disp+leng]=='>'||a[disp+leng]=='=') { while(a[disp+leng]=='<'||a[disp+leng]=='>'||a[disp+leng]=='=') {leng++;} insert(l,4,a,disp,leng); disp=disp+leng;leng=0; biaozi=0; goto down; } else { insert(l,3,a,disp,leng); disp=disp+leng;leng=0; goto down; } } else//39 { if(a[disp+leng]=='<'||a[disp+leng]=='>'||a[disp+leng]=='=') { while(a[disp+leng]=='<'||a[disp+leng]=='>'||a[disp+leng]=='=') {leng++;} insert(l,4,a,disp,leng); disp=disp+leng;leng=0; biaozi=0; goto down; } else { insert(l,3,a,disp,leng); disp=disp+leng;leng=0; goto down; } } } } down: { } }}void main(){ cout<<"输入语句:以#为结束:"<<endl; int k=0; for(;k!=60;k++) cout<<"*"; cout<<endl; char zifu[200];int length=0;//length记录字符的长度 change_input(zifu,length); for(k=0;k!=60;k++) cout<<"*";cout<<flush<<endl; list<str> words; check(words,zifu,length); list<str >::iterator i=words.begin(); for(;i!=words.end();i++) (*i).show(),cout<<endl; if(biaozi==0) cout<<"error!"<<endl;//如果有错误则输出}

评论