Chinaunix首页 | 论坛 | 博客
  • 博客访问: 43584
  • 博文数量: 11
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 120
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-22 20:28
文章分类
文章存档

2011年(1)

2007年(10)

我的朋友
最近访客

分类: C/C++

2007-11-05 07:37:35

#include
#include
#include

using namespace std;

int static biaozi=1;
class str
{
public:
 str(int t,char a[],int len)
 {
  for(int i=0;i   name[i]=a[i];
  type=t;
  leng=len;
 }
 void show()
 {
  cout<<'('<  for(int i=0;i   cout<  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 &l,int t,char a[],int indexon,int leng)//
把每个词法成分放入表中
{
 char temp[20];
 for(int i=0;i  temp[i]=a[indexon+i];
 l.push_back(str(t,temp,leng));
}
void check(list &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<<','<处理非词法的字符
  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<<"
输入语句:以#为结束:"< int k=0;
 for(;k!=60;k++)
  cout<<"*";
 cout< char zifu[200];int length=0;//length
记录字符的长度
 change_input(zifu,length);

 for(k=0;k!=60;k++)
  cout<<"*";cout< 
 list words;
 check(words,zifu,length);
 list::iterator i=words.begin();
 for(;i!=words.end();i++)
   (*i).show(),cout< if(biaozi==0) cout<<"error!"<如果有错误则输出
}



阅读(715) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~