词法分析器

 

  

  1 #include <stdio.h>
  2 char prog[100]={'\0'};
  3 char token[9];
  4 char ch;
  5 int syn,n,sum,p;
  6 void scaner(){
  7      int m=0;
  8      sum=0;
  9      char *r[7]={"begin","if","then","for","while","do","end"};//数组存放关键字
 10     for(n=0;n<9;n++)
 11         token[n]='\0';
 12     ch=prog[p++];
 13     while(ch==' ')
 14         ch=prog[p++];
 15     if(isalpha(ch))    /*ch为字母字符*/
 16     {
 17         while(isalpha(ch)||isdigit(ch))    /*ch 为字母字符或者数字字符*/
 18         {
 19            token[m++]=ch;
 20            ch=prog[p++];}
 21         token[m++]='\0';
 22         ch=prog[p--];
 23         syn=10;
 24         for(n=0;n<7;n++)
 25             if(strcmp(token,r[n])==0)    /*字符串的比较*/
 26             {
 27                 syn=n+1;
 28                 break;}}
 29     else
 30 
 31         if(isdigit(ch))    /*ch是数字字符*/
 32         {
 33             while(isdigit(ch))    /*ch是数字字符*/
 34             {
 35                 sum=sum*10+ch-'0';
 36                 ch=prog[p++];}
 37             ch=prog[p--];
 38             syn=11;}
 39 
 40         else
 41             switch(ch){
 42                 case'<':m=0;token[m++]=ch;ch=prog[p++];
 43                         if(ch=='>'){
 44                         syn=21;
 45                             token[m++]=ch;}
 46                         else if(ch=='='){
 47                             syn=22;
 48                             token[m++]=ch;}
 49                             else{
 50                                  syn=20;
 51                                  ch=prog[p--];}
 52                         break;
 53                 case'>':m=0;token[m++]=ch;ch=prog[p++];
 54                         if(ch=='='){
 55                             syn=24;
 56                             token[m++]=ch;}
 57                         else{
 58                         syn=23;
 59                         ch=prog[p--];}
 60                         break;
 61              case':':m=0;token[m++]=ch;ch=prog[p++];
 62                      if(ch=='='){
 63                          syn=18;
 64                         token[m++]=ch;}
 65                      else{
 66                          syn=17;
 67                          ch=prog[p--];}
 68                      break;
 69              case'+':syn=13;token[0]=ch;break;
 70              case'-':syn=14;token[0]=ch;break;
 71              case'*':syn=15;token[0]=ch;break;
 72              case'/':syn=16;token[0]=ch;break;
 73              case'=':syn=25;token[0]=ch;break;
 74              case';':syn=26;token[0]=ch;break;
 75              case'(':syn=27;token[0]=ch;break;
 76              case')':syn=28;token[0]=ch;break;
 77              case'!':syn=29;token[0]=ch;break;
 78              case'#':syn=0;token[0]=ch;break;
 79              default:syn=-1;}
 80 }
 81 void put(){
 82     p=0;
 83     do{
 84         scaner();
 85         switch(syn){
 86             case 11: printf("(%d,%d)\n",syn,sum);break;
 87             case -1: printf("不存在");break;
 88             default: printf("(%d,%s)\n",syn,token);}
 89      }while(syn!=0);
 90     getch();
 91 }
 92 void memun(){
 93      printf("\t\t\t欢迎使用词法分析程序!!\n");
 94         printf("    单词符号    种别码       单词符号     种别码\n");
 95         printf("       begin     1            :          17 \n");
 96         printf("       if        2            :=         18 \n");
 97         printf("       then      3            <          20\n");
 98         printf("       for       4            <>         21\n");
 99         printf("       while     5            <=         22\n");
100         printf("       do        6            >          23\n");
101         printf("       end       7            >=         24\n");
102         printf("       l(l|d)*   10           =          25\n");
103         printf("       dd*       11           ;          26\n");
104         printf("       +         13           (          27\n");
105         printf("       -         14           )          28\n");
106         printf("       *         15           !          29\n");
107         printf("       /         16           #          0 \n");
108 }
109 main(){
110    p=0;
111    memun();
112     printf("请输入字符串(直到#退出):\n");
113     do {
114            ch=getchar();
115            prog[p++]=ch;
116        }while(ch!='#');
117        put();
118 }

词法规则

<字母>Aa|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z  SSA

•<数字>A0|1|2|3|4|5|6|7|8|9  SSA

•<整数常数> A1|2|3|4|5|6|7|8|9  B0  SSA|SB

•<标识符>Aa|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z

B0|1|2|3|4|5|6|7|8|9   SASB

•<关键字>

Aconst|var|procedur|begin|end|odd|if|then|call|while|do|read|write

SSA

•<运算符>A+|-|*|/|<=|>=|<|>   SSA

•<界符>A(|)  B,|;|.  SASB

欢迎大家指出我的错误!!!

 

 

posted @ 2016-09-30 10:22  207钟程泰  阅读(241)  评论(0编辑  收藏  举报