• c语言语法分析器


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

  • 相关阅读:
    Remove Element
    String StringBuffer StringBuilder
    Length of Last Word
    Space Replacement
    Longest Palindromic Substring
    jQuery2.0.0版本以后不再支持ie8的原因
    npm命令
    不借助第三个变量实现两个变量交换及原理分析
    js 不同进制之间相互转换
    ECMAScript toString() 方法
  • 原文地址:https://www.cnblogs.com/zzl-0402/p/6188383.html
Copyright © 2020-2023  润新知