C语言语法分析器 238

#include <stdio.h>
#include <string.h>
char prog[800], token[20];
char ch;
int syn,p,m,n,sum;
char * rwtab[6]= {"begin","if","then","while","do","end"};

main()
{
      p=0;
      printf("\n 请输入字符串: \n");
      do{
                 ch=getchar();
                 prog[p++]=ch;
      }while (ch!='#');
      p=0;
      do{
          scaner();
          switch(syn)
                  {
                     case 11: printf("\n(%d,%d)",syn,sum); break;
                     case -1: printf("\n(%s,出错!)",token);break;
                     default: printf("\n(%d,%s)",syn, token);   
                  }
       }while (syn!=0);
       printf("\n  分析成功 \n");
           p=0;
    scaner();
     E();
     if (syn==0) 
              printf("\n 没有错误. \n");
     else     printf("\n  出现错误. \n"); 
}

scaner()
{
        for (n=0;n<20;n++) token[n]=NULL;        
        m=0;
        sum=0;
        ch=prog[p++];
        while (ch==' ') {ch=prog[p++];}
        if (ch>='a'&& ch<='z')
           {while (ch>='a'&& ch<='z'||ch>='0' && ch<='9')
                  {
                   token[m++]=ch;
                   ch=prog[p++];
                  }
          
            syn=10;p--;
            for (n=0;n<6;n++)
                if(strcmp(token,rwtab[n])==0) {syn=n+1;break;}                                               
           }
 else  
            if(ch>='0' && ch<='9')
            {while (ch>='0' && ch<='9') {sum=sum*10+(ch-'0'); ch=prog[p++];}
             syn=11;p--;
            }
          else 
                switch(ch)
                {
                  case '<': token[m++]=ch;
                            ch=prog[p++];
                            if (ch=='>') {syn=21;token[m++]=ch;}
                            else if (ch=='=') {syn=22;token[m++]=ch;}
                                 else {syn=20;p--;}
                            break;
                  
                  case '>': m=0; token[m++]=ch;
                            ch=prog[p++];
                            if (ch=='='){syn=24;token[m++]=ch;}
                            else {syn=23;p--;}
                            break;
                  case ':': m=0; token[m++]=ch;
                            ch=prog[p++];
                            if (ch=='='){syn=18;token[m++]=ch;}
                            else {syn=17;p--;}
                            break;
                 case '+': syn=13;token[0]=ch;break;
                  case '-': syn=14;token[0]=ch;break;
                  case '*': syn=15;token[0]=ch;break;
                  case '/': syn=16;token[0]=ch;break;
                  case '=': syn=25;token[0]=ch;break;                           
                  case ';': syn=26;token[0]=ch;break;
                  case '(': syn=27;token[0]=ch;break;                                    
                  case ')': syn=28;token[0]=ch;break; 
                  case '#': syn=0; token[0]=ch;break;
                  default: syn=-1;token[0]=ch;
                }
}

E()
{printf("E ");
    T();
    E1();
    
}

E1()
{printf("E1 ");
    if (syn==13) {
        scaner();
        T();
        E1();
    }
    else {
        if (syn!=28 && syn!=0) error();
    }
} 

T()
{printf("T ");
    F();
    T1();
}

T1()
{printf("T1 ");
    if (syn==15) {
        scaner();
        F();
        T1();
    }
    else {
        if (syn!=28 && syn!=0 && syn!=13) error();
    }
}

F()
{printf("F ");
    if (syn==27) {
        scaner();
        E();
        if(syn==28) scaner();
        else error();
    }
    else if (syn==11 || syn==10) scaner();
    
}
error()
{
    printf("\n (%d,%s)错误地方! \n",syn, token);
}

运行结果:

原文地址:https://www.cnblogs.com/xujinpei/p/6189308.html