cifa.cpp
上传用户:sales9
上传日期:2022-01-26
资源大小:2k
文件大小:5k
源码类别:

词法分析

开发平台:

Visual C++

  1.   #include<iostream.h>   
  2.   #include<string.h>   
  3.   char *KeyWord[45]={"auto","break","case","char","const","continue","default","do","double","else","enum","extern","float","for","goto","if","int","long","return","short","signed","sizeof","static","struct","switch","typedef","unsigned","void","while","catch","class","const_cast","delete","friend",   
  4.   "inline","new","operator","private","protected","public","template","this","throw","try","virtual"};   
  5.   int   i=0,j=0,k=0,t=0;//搜索指示器   
  6.   char   ch;//存放最新读入的原程序字符   
  7.   char   strToken[20];//存放构成单词符号的字符串   
  8.   char   *   chr_form[100];//字符表   
  9.   char   *   int_form[100];//常数表   
  10.   char   form[1000];   
  11.   int   q=0;   
  12.   int   temp;   
  13.   void   GetChar()//将下一个字符读入ch中,搜索指示器前移一字符位   
  14.   {   
  15.   ch=form[k];   
  16.   k++;   
  17.   }   
  18.   void   GetBC()//检查ch中的字符是否为空白,若是则调用Getchar直至ch中进入一个非空白字符   
  19.   {   
  20.   while(ch=='   ')   
  21.   {   
  22.   //k--;   
  23.   GetChar();   
  24.   }   
  25.   }   
  26.   void   Concat()//将ch中的字符连接到strToken之后,   
  27.   {   
  28.   strToken[i]=ch;   
  29.   i++;   
  30.   }   
  31.   bool   IsLetter()//判断ch中的字符是否为字符   
  32.   {   
  33.   if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))   
  34.                 return   (1);   
  35.   else   
  36.   return(0);   
  37.   }   
  38.   bool   IsDigit()//判断ch中的字符是否为数字   
  39.   {   
  40.   //k--;   
  41.   if(((ch)<='9')&&(   (ch)>='0'))   
  42.   return   (1);   
  43.   else   
  44.   return   (0);   
  45.   }   
  46.   int   Reserve()//对strToken中的字符串查找保留字表,若它是一个保留字   
  47.   //则返回它的编码,否则返回-1值   
  48.   {   
  49.   for(int   q=0;q<45;q++)   
  50.   {   
  51.           if   (strcmp(KeyWord[q],strToken)==0)   
  52.   return   q;   
  53.   if(q==44)   
  54.                     return   -1;   
  55.   }   
  56.   }   
  57.   void   Retract()//将搜索指示器回调一个字符位置,将ch置为空白字符   
  58.   {   
  59.   k--;   
  60.   ch=NULL;   
  61.   }   
  62.   char*InsertId()//将strToken中的标识符插入符号表,返回符号表的指针   
  63.   {   
  64.   chr_form[j]=strToken;   
  65.   j++;   
  66.   return   chr_form[0];   
  67.   }   
  68.   char   *   InsertConst()//将strToken中的常数插入常数表,返回常数表指针   
  69.   {   
  70.   int_form[t]=strToken;   
  71.   t++;   
  72.   return   int_form[0];   
  73.   }   
  74.   int   code;   
  75.   //////////////////////////////////////////////////////////////////////   
  76.   void   analyze()   
  77.   {   
  78.   GetChar();   
  79.   GetBC();   
  80.   //cout<<"此处没有错"<<endl;   
  81.   if(IsLetter())   
  82.   {   
  83.   while(IsLetter()||IsDigit())   
  84.   {   
  85.   Concat();   
  86.   GetChar();   
  87.   }   
  88.   //cout<<"此处没有错"<<endl;   
  89.   Retract();   
  90.   code=Reserve();   
  91.   switch(code)   
  92.   {   
  93.   case   -1:cout<<"字符串,   "<<strToken<<endl;break;   
  94.   default:cout<<"关键字,   "<<strToken<<endl;   
  95.   }   
  96.   }   
  97.   else   
  98.   {   
  99.   if(IsDigit())   
  100.   {   
  101.   while(IsDigit()||ch=='.')   
  102.   {   
  103.   Concat();   
  104.   GetChar();   
  105.   }   
  106.   Retract();   
  107.   cout<<"常数,       "<<strToken<<endl;   
  108.   }   
  109.   else   
  110.   {   
  111.   switch   (ch)   
  112.   {   
  113.   case   '=':   
  114.   case   '/':   
  115.   case   '%':   
  116.   case   '*':cout<<"运算符,"<<ch<<endl;break;   
  117.   case   '-': GetChar();   
  118.     if(ch=='-')   
  119.     {   
  120.     cout<<"运算符,"<<"--"<<endl;break;   
  121.     }   
  122.     else   
  123.     {   
  124.     Retract();   
  125.     cout<<"运算符,"<<"-"<<endl;break;   
  126.     }   
  127.   case   '+':   
  128.     GetChar();   
  129.     if(ch=='+')   
  130.     {   
  131.     cout<<"运算符,"<<"++"<<endl;break;   
  132.     }   
  133.     else   
  134.     {   
  135.     Retract();   
  136.     cout<<"运算符,"<<"+"<<endl;break;   
  137.     }   
  138.   case   '|':   
  139.                       GetChar();   
  140.     if(ch=='|')   
  141.     {   
  142.     cout<<"运算符,"<<"||"<<endl;break;   
  143.     }   
  144.     else   
  145.     {   
  146.     Retract();   
  147.     cout<<"非法符号,"<<"|"<<endl;break;   
  148.     }   
  149.   case   '&':   
  150.   GetChar();   
  151.     if(ch=='&')   
  152.     {   
  153.     cout<<"运算符,"<<"&&"<<endl;break;   
  154.     }   
  155.                       case   '(':   
  156.   case   ';':   
  157.   case   ')':   
  158.   case   ':':   
  159.   case'[':   
  160.   case']':   
  161.   case   '"':   
  162.   case''':   
  163.   case   '{':   
  164.   case   ',':   
  165.   case   '}':cout<<"界符,     "<<ch<<endl;break;   
  166.   case   '<':   
  167.                                   GetChar();   
  168.     if(ch=='<')   
  169.     {   
  170.     cout<<"运算符,"<<"<<"<<endl;break;   
  171.     }   
  172.     else   
  173.     {   
  174.     cout<<"界符,     "<<"<"<<endl;break;   
  175.     }   
  176.   case   '>':   
  177.   GetChar();   
  178.     if(ch=='>')   
  179.     {   
  180.     cout<<"运算符,"<<">>"<<endl;break;   
  181.     }   
  182.     else   
  183.     {   
  184.     Retract();   
  185.     cout<<"界符,     "<<">"<<endl;break;   
  186.     }   
  187.   }   
  188.   }   
  189.   }   
  190.   while(k<q)   
  191.   {   
  192.   // strcpy(strToken,"       ");   
  193.   //strcpy(strToken,"");   
  194.   for(int   p=0;p<50;p++)   
  195.   strToken[p]='';   
  196.   i=0;   
  197.   analyze();   
  198.   }   
  199.   }   
  200.   void   main()   
  201.   {   
  202.   cout<<"请输入一段程序,以#号结束:"<<endl;   
  203.   form[0]=cin.get();   
  204.   for(   q=1;form[q-1]!='##';q++)   
  205.   {   
  206.   form[q]=cin.get();   
  207.   if(form[q]=='#')   
  208.   {   
  209.   cout<<"你输入的程序段为n";   
  210.   cout.write(form,q);   
  211.                   break;   
  212.   }   
  213.   }   
  214.   cout<<endl;   
  215.   analyze();   
  216.   }   
  217.