正文

简单词法分析程序2007-11-16 15:58:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wwwzrccom/30942.html

分享到:

#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;//如果有错误则输出}

阅读(2975) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册