• 词法分析器


     

      

      1 #include <stdio.h>
      2 char prog[100]={''};
      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]='';
     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++]='';
     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)
    ",syn,sum);break;
     87             case -1: printf("不存在");break;
     88             default: printf("(%d,%s)
    ",syn,token);}
     89      }while(syn!=0);
     90     getch();
     91 }
     92 void memun(){
     93      printf("			欢迎使用词法分析程序!!
    ");
     94         printf("    单词符号    种别码       单词符号     种别码
    ");
     95         printf("       begin     1            :          17 
    ");
     96         printf("       if        2            :=         18 
    ");
     97         printf("       then      3            <          20
    ");
     98         printf("       for       4            <>         21
    ");
     99         printf("       while     5            <=         22
    ");
    100         printf("       do        6            >          23
    ");
    101         printf("       end       7            >=         24
    ");
    102         printf("       l(l|d)*   10           =          25
    ");
    103         printf("       dd*       11           ;          26
    ");
    104         printf("       +         13           (          27
    ");
    105         printf("       -         14           )          28
    ");
    106         printf("       *         15           !          29
    ");
    107         printf("       /         16           #          0 
    ");
    108 }
    109 main(){
    110    p=0;
    111    memun();
    112     printf("请输入字符串(直到#退出):
    ");
    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

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

  • 相关阅读:
    read_csv 函数
    fillna()
    一个逗号引发的错误
    数据预处理
    groupby()
    泰坦尼克号 预处理
    python string
    python title()的用法
    translate()函数及ROT13加密
    python Lambda, filter, reduce and map
  • 原文地址:https://www.cnblogs.com/zzl-0402/p/5922544.html
Copyright © 2020-2023  润新知