首页 > 代码库 > 词法分析

词法分析

词法分析程序的功能:

输入一个二元式,输出二元式的值。

程序调试截图如下:

技术分享

 

符号与种别码对照表:

技术分享

 用文法描述词法规则:

•<字母>→ a|b|c|……y|z
•<数字>→d|<整数>|.<小数>
•<整数常数>→1|2|3|···
•<标识符>→l|l<字母数字>
•<关键字>→→if|else|while|do|for|int|char|···
•<运算符>→+|-|-|/|=|=<等号>···
•<界符>→,|;|(|)|···
 
源程序代码如下:
  1 #include <stdio.h>  2 #include <string.h>  3 char prog[80],token[8],ch;  4 int syn,p,m,n,sum;  5 char *rwtab[6]={"begin","if","then","while","do","end"};  6 void scaner(void);  7 main()  8 {  9     p=0; 10      printf("\n please input a string(end with ‘#‘):\n"); 11      do{ 12             scanf("%c",&ch); 13             prog[p++]=ch; 14     }while(ch!=#); 15      p=0; 16     do{ 17             scaner(); 18             switch(syn) 19              { 20                  case 11: 21                      printf("( %-10d%5d )\n",sum,syn); 22                   break; 23                   case -1: 24                       printf("you have input a wrong string\n"); 25                       return 0; 26                   break; 27                   default: 28                   printf("( %-10s%5d )\n",token,syn); 29                   break; 30               } 31         }while(syn!=0); 32  } 33 void scaner(void) 34 { 35      sum=0; 36     for(m=0;m<8;m++) 37         token[m++]= NULL; 38         ch=prog[p++]; 39         m=0; 40     while((ch== )||(ch==\n)) 41         ch=prog[p++]; 42     if(((ch<=z)&&(ch>=a))||((ch<=Z)&&(ch>=A))) 43      { 44           while(((ch<=z)&&(ch>=a))||((ch<=Z)&&(ch>=A))||((ch>=0)&&(ch<=9))) 45           { 46               token[m++]=ch; 47                ch=prog[p++]; 48          } 49           p--; 50           syn=10; 51           for(n=0;n<6;n++) 52         if(strcmp(token,rwtab[n])==0) 53            { 54                syn=n+1; 55             break; 56            } 57      } 58      else if((ch>=0)&&(ch<=9)) 59      { 60           while((ch>=0)&&(ch<=9)) 61         { 62             sum=sum*10+ch-0; 63               ch=prog[p++]; 64         } 65         p--; 66            syn=11; 67     } 68     else 69     { 70         switch(ch) 71         { 72         case <: 73             token[m++]=ch; 74             ch=prog[p++]; 75             if(ch===) 76             { 77                 syn=22; 78                 token[m++]=ch; 79             } 80             else 81             { 82                 syn=20; 83                 p--; 84             } 85         break; 86  87         case >: 88             token[m++]=ch; 89             ch=prog[p++]; 90             if(ch===) 91             { 92                 syn=24; 93                 token[m++]=ch; 94             } 95             else 96             { 97                 syn=23; 98                 p--; 99             }100         break;101 102         case +:103             token[m++]=ch;104             ch=prog[p++];105             if(ch==+)106             {107                 syn=17;108                 token[m++]=ch;109             }110             else111             {112                 syn=13;113                 p--;114             }115         break;116 117         case -:118             token[m++]=ch;119             ch=prog[p++];120             if(ch==-)121             {122                 syn=29;123                 token[m++]=ch;124             }125             else126             {127                 syn=14;128                 p--;129             }130         break;131 132         case !:133             ch=prog[p++];134             if(ch===)135             {136                 syn=21;137                 token[m++]=ch;138             }139             else140             {141                 syn=31;142                 p--;143             }144         break;145 146         case =:147             token[m++]=ch;148             ch=prog[p++];149             if(ch===)150             {151                 syn=25;152                 token[m++]=ch;153             }154             else155             {156                 syn=18;157                 p--;158             }159         break;160         case *:161             syn=15;162             token[m++]=ch;163         break;164         case /:165             syn=16;166             token[m++]=ch;167         break;168         case (:169             syn=27;170             token[m++]=ch;171         break;172         case ):173             syn=28;174             token[m++]=ch;175         break;176         case {:177             syn=5;178             token[m++]=ch;179         break;180         case }:181             syn=6;182             token[m++]=ch;183         break;184         case ;:185             syn=26;186             token[m++]=ch;187         break;188         case \":189             syn=30;190             token[m++]=ch;191         break;192         case #:193             syn=0;194             token[m++]=ch;195         break;196         case ::197             syn=17;198             token[m++]=ch;199         break;200         default:201             syn=-1;202         break;203         }204     }205         token[m++]=\0;206 }

 

 

词法分析