码迷,mamicode.com
首页 > 其他好文 > 详细

词法分析器

时间:2016-09-30 12:20:03      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

 

  

  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

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

 

 

词法分析器

标签:

原文地址:http://www.cnblogs.com/zzl-0402/p/5922544.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!