zoukankan      html  css  js  c++  java
  • 递归下降分析程序

    对于给定的文法G[E] :

    E→E+T|E-T|T
    T→T*F| T/F|F
    F→(E)|i

    消除左递归后的文法是:
    E→TE'

    E'→+TE'|-TE'|∑

    T→FT'

    T'→*FT'|/FT'|∑

    F→(E)|i

    是否是LL(1)文法?

    select(E→TE')=first(TE')={(,i}
    select(E'→+TE')=first(+TE')={+}
    select(E'→-TE')=first(-TE')={-}
    select(E'→∑)=follow(E')={),#}
    select(T→FT')=first(FT')={(,i}
    select(T'→*FT')=first(*FT')={*}
    select(T'→/FT')=first(/FT')={/}
    select(T'→∑)=follow(T')={+,-,),#)
    select(F→(E))=first((E))={(}
    select(F→i)=first(i)={i}

    由上分析,得知此文法满足LL(1)文法

      1 #include<stdio.h>
      2 #include <string.h>
      3 void scaner();
      4 void E();
      5 void E1();
      6 void T();
      7 void T1();
      8 void F();
      9 void error();
     10 char proce[100],ch,token[20];
     11 int syn,i,j,m,sum=0;
     12 char *keyword[6]= {"begin","if","then","while","do","end"};
     13 main()
     14 {
     15     i=0;//记录输入多少个字符
     16     printf("
     请输入词法分析程序:");
     17       do{
     18                  ch=getchar();
     19                  proce[i]=ch;
     20                  i++;
     21       }while (ch!='#');
     22       i=0;
     23       do{
     24           scaner();
     25           switch(syn)
     26                   {
     27                      case 11: printf("
    (%d,%d)",syn,sum);
     28                               break;
     29                      case -1: printf("
    (%s,#)",token);
     30                               break;
     31                      default: printf("
    (%d,%s)",syn, token);
     32                   }
     33        }while (syn!=0);
     34 
     35   printf("
    ");
     36 
     37     i=0;
     38 
     39     scaner();
     40      E();
     41      if (syn==0)
     42               printf("
     语法正确. 
    ");
     43      else     printf("
      语法失败. 
    ");
     44 
     45 }
     46 void scaner()
     47 {
     48         for (j=0;j<20;j++)
     49             token[j]=NULL;//将token赋值为空
     50         m=0;
     51         sum=0;
     52         ch=proce[i];
     53         i++;
     54         while (ch==' ')
     55         {
     56             ch=proce[i++];
     57         }
     58         if (ch>='a'&& ch<='z')
     59            {while (ch>='a'&& ch<='z'||ch>='0' && ch<='9')
     60                   {
     61                    token[m++]=ch;
     62                    ch=proce[i++];//继续看后面的
     63                   }
     64 
     65             syn=10;i--;//判断为变量
     66             for (j=0;j<6;j++)
     67                 if(strcmp(token,keyword[j])==0)
     68                     {
     69                         syn=j+1;
     70                          break;
     71                      }//如果有可以匹配的就为关键字
     72            }
     73  else
     74             if(ch>='0' && ch<='9')
     75             {while (ch>='0' && ch<='9')
     76               {
     77                 sum=sum*10+(ch-'0');
     78                 ch=proce[i];
     79                 i++;
     80               }
     81               syn=11;
     82               i--;
     83             }
     84           else
     85                 switch(ch)
     86                 {
     87                   case '<': token[m]=ch;
     88                              m++;
     89                             ch=proce[i];
     90                             i++;
     91                             if (ch=='>')
     92                                 {
     93                                     syn=21;
     94                                    token[m]=ch;
     95                                    m++;
     96                                  }
     97                             else if (ch=='=')
     98                                 {
     99                                     syn=22;
    100                                    token[m]=ch;
    101                                    m++;
    102                                  }
    103                                  else
    104                                     {
    105                                         syn=20;
    106                                         i--;
    107                                     }
    108                              break;
    109 
    110                   case '>': m=0;
    111                             token[m]=ch;
    112                             m++;
    113                             ch=proce[i];
    114                             i++;
    115                             if (ch=='=')
    116                             {
    117                              syn=24;
    118                              token[m]=ch;
    119                              m++;
    120                             }
    121                             else
    122                                 {
    123                                     syn=23;
    124                                     i--;
    125                                 }
    126                             break;
    127                   case ':': m=0;
    128                             token[m++]=ch;
    129                             ch=proce[i++];
    130                             if (ch=='=')
    131                             {
    132                                 syn=18;
    133                               token[m++]=ch;
    134                             }
    135                             else
    136                                 {
    137                                     syn=17;
    138                                     i--;
    139                                 }
    140                             break;
    141                  case '+':
    142                      syn=13;
    143                      token[0]=ch;
    144                      break;
    145                   case '-':
    146                       syn=14;
    147                       token[0]=ch;
    148                       break;
    149                   case '*':
    150                       syn=15;
    151                       token[0]=ch;
    152                       break;
    153                   case '/':
    154                       syn=16;
    155                       token[0]=ch;
    156                       break;
    157                   case '=':
    158                       syn=25;
    159                       token[0]=ch;
    160                       break;
    161                   case ';':
    162                       syn=26;
    163                       token[0]=ch;
    164                       break;
    165                   case '(':
    166                      syn=27;
    167                      token[0]=ch;
    168                       break;
    169                   case ')':
    170                       syn=28;
    171                       token[0]=ch;
    172                       break;
    173                   case '#':
    174                       syn=0;
    175                       token[0]=ch;
    176                       break;
    177                   default:
    178                       syn=-1;
    179                       token[0]=ch;
    180                 }
    181 }
    182 void E()
    183 {
    184     printf("E ");
    185     T();
    186     E1();
    187 
    188 }
    189 void E1()
    190 {
    191     printf("E1 ");
    192     if (syn==13)
    193     {
    194         scaner();
    195         T();
    196         E1();
    197     }
    198     else {
    199         if (syn!=28 && syn!=0)
    200         error();
    201     }
    202 }
    203 void T()
    204 {
    205     printf("T ");
    206     F();
    207     T1();
    208 }
    209 void T1()
    210 {
    211     printf("T1 ");
    212     if (syn==15) {
    213         scaner();
    214         F();
    215         T1();
    216     }
    217     else {
    218         if (syn!=28 && syn!=0 && syn!=13) error();
    219     }
    220 }
    221 
    222 void F()
    223 {
    224     printf("F ");
    225     if (syn==27)
    226     {
    227         scaner();
    228         E();
    229         if(syn==28) scaner();
    230         else error();
    231     }
    232     else if (syn==11 || syn==10)
    233       scaner();
    234 
    235 }
    236 
    237 void error()
    238 {
    239     printf("
     (%d,%s)语法错误! 
    ",syn, token);
    240 }
  • 相关阅读:
    《机器学习实战》K近邻算法
    第 4 章 单例模式
    第 3 章 闭包和高阶函数
    第2章 this 、 call 和 apply
    第1章 面向对象的JavaScript
    前言 发展历史
    Linux常用的基本命令
    VLSM
    IP编址和子网划分
    RADIUS操作命令
  • 原文地址:https://www.cnblogs.com/lgy520/p/6188746.html
Copyright © 2011-2022 走看看