一个词法分析器(BCB)

 

  //---------------------------------------------------------------------------

  #include <vcl.h>
  #pragma hdrstop

  //---------------------------------------------------------------------------

  #pragma argsused


  #include<string.h>

  #include<stdio.h>

  #include<stdlib.h>

  #include<ctype.h>

                                    //定义关键字

  char*Key[36]={"main","printf","scanf","else","if","auto","double","int","struct","break","long","switch","case","enum","register","typedef","char","extern","return","union","const","float","short","unsigned","continue","for","signed","void","default","goto","sizeof","volatile","do","while","static"};

  int syn;                           /*存放单词字符的种别码*/

  char Word[20],ch;                   // 存储识别出的单词流

 


  int IsAlpha(char c) {                //判断是否为字母

         if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))

         {

                return 1;

          syn=71;

         }

         else return 0;

  }


  int IsNum(char c){                //判断是否为数字

         if(c>='0'&&c<='9')

         {return 1;

         syn=70;

         }

         else return 0;

  }

  int IsKey(char *Word){          //识别关键字函数

         int m,i;

         for(i=0;i<35;i++){

                if((m=strcmp(Word,Key[i]))==0)

                {   syn=i+1;

                if(i==0)

                       return 2;

                return 1;

                }

         }

         return 0;

  }


  void scanner(FILE *fp){        //扫描函数

         char Word[20]={'\0'};

         char ch;

         int i,c;

         ch=fgetc(fp);        //获取字符,指针fp并自动指向下一个字符

         if(IsAlpha(ch)){           //判断该字符是否是字母

                Word[0]=ch;

                ch=fgetc(fp);

                i=1;

                while(IsNum(ch)||IsAlpha(ch)){   //判断该字符是否是字母或数字

                       Word[i]=ch;

                       i++;

                       ch=fgetc(fp);

                   }

                Word[i]='\0';       //'\0' 代表字符结束(空格)

                fseek(fp,-1,1);                              //回退一个字符

                c=IsKey(Word);                              //判断是否是关键字

                if(c==0){syn=36;

                       printf("(字符%s是:$普通标识符,\t\t种别码是:%d)\n\n",Word,syn);}//不是关键字

                else if(c==2) {syn=360;printf("(%s$主函数\t,\t\t种别码是:%d)\n\n",Word,syn);}

                else    {syn=361; printf("(字符%s是:$关键字\t,\t\t种别码是:%d)\n\n",Word,syn); }     //输出关键字

         }


        else                          //开始判断的字符不是字母

                if(IsNum(ch)){                //判断是否是数字

                          Word[0]=ch;

                          ch=fgetc(fp);

                          i=1;

                          while(IsNum(ch)){

                                     Word[i]=ch;

                                     i++;

                                     ch=fgetc(fp);

                              }

                              Word[i]='\0';

                              fseek(fp,-1,1);                    //回退

                              syn=73;

                              printf("(字符%s是$无符号实数\t\t,\t\t种别码是:%d)\n\n",Word,syn);

                   }
  else         //开始判断的字符不是字母也不是数字
                   {

                          Word[0]=ch;

                          switch(ch){

                          case'[':syn=57;break;

                 case'\\':syn=74;break;

                          case']':syn=58;break;

                          case'(':syn=59;break;

                          case')':syn=60;break;

                          case'{':syn=61;break;

                          case'}':syn=62;break;

                          case',':syn=63;break;

                          case'"':syn=64;break;

                          case';':syn=69;printf("(字符%s是$界符\t\t,\t\t种别码是:%d)\n\n",Word,syn); break;

                          case'+':ch=fgetc(fp);

                                 Word[1]=ch;

                                 if(ch=='='){syn=40;

                              printf("(字符%s是$运算符\t\t,\t\t种别码是:%d)\n\n",Word,syn);//运算符"+="

                                 }

                                 else if(ch=='+'){syn=41;

                                 printf("(字符%s是$运算符\t\t,\t\t种别码是:%d)\n\n",Word,syn); //判断结果为"++"

                                 }

                                 else {

                                        fseek(fp,-1,1);syn=42;

                                     printf("(字符%s是$运算符\t\t,\t\t种别码是:%d)\n\n",Word,syn); //判断结果为"+"

                                 }

                                 break;

                          case'-':ch=fgetc(fp);

                                 Word[1]=ch;

                                 if(ch=='='){

                                     printf("(字符%s是$运算符\t\t,\t\t种别码是:%d)\n\n",Word,syn);                         }

                                 else if(ch=='-'){syn=44;

                              printf("(字符%s是$运算符\t\t,\t\t种别码是:%d)\n\n",Word,syn); //判断结果为"--"

                                 }

                                 else {

                                        fseek(fp,-1,1);syn=43;

                                     printf("(字符%s是$运算符\t\t,\t\t种别码是:%d)\n\n",Word,syn); //判断结果为"-"

                                 }

                                 break;

                          case'*':syn=45;break;

                          case'/':syn=46;break;

                          case'!':syn=47;break;

                 case'?':syn=37;break;

                          case':':syn=38;break;

                          case'.':syn=39;break;

                          case'#':syn=65;break;

                          case'=':ch=fgetc(fp);

                                 if(ch=='='){syn=48;

                              printf("(字符%s是\$运算符\t\t,t\t种别码是:%d)\n\n",Word,syn);

                                 }

                                 else {

                                        fseek(fp,-1,1);syn=49;

                                        printf("(字符%s是$运算符\t\t,\t\t种别码是:%d)\n\n",Word,syn);

                                 }

                                 break;
                                 }
                                 }
                                 }
                                 int main()
                                 {
                                   return 0;
                                 }

  // 词法分析结果:
  //

  //
  //          ■〓〓〓〓〓〓〓〓下面是数字的涵义:〓〓〓〓〓〓〓〓〓■
  //
  //          ■ 1.数字1到35代表关键字                            ■
  //
  //          ■ 2.数字36代表普通标识符                           ■
  //
  //          ■ 3.数字37到65代表算符                             ■
  //
  //          ■ 4.数字69代表界符                                 ■
  //
  //          ■ 5.数字70,71和73分别代表数字和字母无符号数字     ■
  //
  //          ■〓〓〓〓〓〓〓〓〓〓〓〓〓●〓〓〓〓〓〓〓〓〓〓〓 ■
  //
  //
  //请输入源文件名(包括路径和后缀名):E:\Canalysis\test.cpp
  //
  //
  //******************* 词法分析结果如下 *******************
  //
  //(字符include是:$普通标识符,            种别码是:36)
  //
  //
  //(字符stdio是:$普通标识符,              种别码是:36)
  //
  //
  //(字符h是:$普通标识符,          种别码是:36)
  //
  //
  //(字符void是:$关键字    ,               种别码是:361)
  //
  //
  //(main$主函数    ,               种别码是:360)
  //
  //
  //(字符int是:$关键字     ,               种别码是:361)
  //
  //
  //(字符m是:$普通标识符,          种别码是:36)
  //
  //
  //(字符10是$无符号实数            ,               种别码是:73)
  //
  //
  //(字符10是$无符号实数            ,               种别码是:73)
  //
  //
  //(字符=是$运算符         ,               种别码是:49)
  //
  //
  //(字符0是$无符号实数             ,               种别码是:73)
  //
  //
  //(字符1是$无符号实数             ,               种别码是:73)
  //(字符;是$界符           ,               种别码是:69)
  //
  //
  //(字符int是:$关键字     ,               种别码是:361)
  //
  //
  //(字符i是:$普通标识符,          种别码是:36)
  //
  //
  //(字符j是:$普通标识符,          种别码是:36)
  //
  //
  //(字符n是:$普通标识符,          种别码是:36)
  //
  //
  //(字符;是$界符           ,               种别码是:69)
  //
  //
  //(字符printf是:$关键字 ,               种别码是:361)
  //
  //
  //(字符please是:$普通标识符,             种别码是:36)
  //
  //
  //(字符enter是:$普通标识符,              种别码是:36)
  //
  //
  //(字符the是:$普通标识符,                种别码是:36)
  //
  //
  //(字符trangle是:$普通标识符,            种别码是:36)
  //
  //
  //无法识别字符!
  //
  //
  //无法识别字符!
  //
  //
  //(字符;是$界符           ,               种别码是:69)
  //
  //
  //(字符scanf是:$关键字   ,               种别码是:361)
  //
  //
  //字符%d是$类型标识符


          

  //---------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值