首页 > 代码库 > 词法分析器

词法分析器

 

  

  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

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

 

 

词法分析器