#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]=='E'||a[disp]=='I'||a[disp]=='T')//状态2,(8,20),12,15入口
{
if(a[disp]=='E')//2,8
{
leng++;
if(a[disp+leng]=='N'||a[disp+leng]=='L')
{
if(a[disp+leng]=='N')//9
{
leng++;
if(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')//22
{
leng++;
if(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')//12
{
leng++;
if(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')//2
{
leng++;
if(a[disp+leng]=='E')//3
{
leng++;
if(a[disp+leng]=='G')//4
{
leng++;
if(a[disp+leng]=='I')//5
{
leng++;
if(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')//15
{
leng++;
if(a[disp+leng]=='H')//16
{
leng++;
if(a[disp+leng]=='E')//17
{
leng++;
if(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;//如果有错误则输出
}