词法分析器

Posted 悦动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了词法分析器相关的知识,希望对你有一定的参考价值。

 

  

  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

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

 

 

以上是关于词法分析器的主要内容,如果未能解决你的问题,请参考以下文章

词法分析

词法分析器代码复审

实验一 词法分析器+编译原理

Second-词法分析

lex实现扩展的pl0语言的词法分析器(附源码)

词法分析器