zoukankan      html  css  js  c++  java
  • 1217递归下降语法分析

    #include <stdio.h>
    #include <string.h> 
    char prog[80], token[8]; 
    char ch; 
    int syn, p, m, n, sum, kk=0; 
    char *rwtab[6]={"begin", "if", "then", "while", "do", "end"}; 
    void scaner(); 
    void E(); 
    void Y(); 
    void T(); 
    void B(); 
    void C(); 
    void A(); 
    void main() 
    { 
    
    
        p=0;  
        printf("Please input string:
    ");
        do 
        { 
            scanf("%c", &ch); 
            prog[p++]=ch; 
        }while(ch!='#'); //当遇到‘#’,结束输入
        p=0; 
        scaner(); 
        E(); 
    } 
    void scaner() 
    { 
        for(n=0; n<8; n++) 
            token[n]=NULL; 
        ch=prog[p++]; 
        while(ch==' '||ch=='
    ') ch=prog[p++]; 
        m=0; 
        if((ch>='A'&&ch<='Z') || (ch>='a'&&ch<='z')) 
        { 
            while((ch>='A'&&ch<='Z') || (ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'))
            { 
                token[m++]=ch; 
                ch=prog[p++];    //    将prog数组的字母复制到ch数组中
            } 
            token[m++]='';    //把token的末尾设置结束符 
            p--;//标记到当前token数组中不是字母的当前位置
            syn=10;//标记字母的对应码
            for(n=0; n<6; n++) 
            { 
                if(strcmp(token, rwtab[n])==0)//判断token对应rwtab中的哪一个,并进行对应赋对应码
                { 
                    syn=n+1; 
                    break;    
                } 
            } 
        } 
        else if(ch>='0'&&ch<='9')
        {
            sum=0; 
            while(ch>='0'&&ch<='9') 
            { 
                sum=sum*10+ch-'0';//number用来记录所对应的数字
                ch=prog[p++]; 
            } 
            p--;
            syn=11;//标记数字的对应码
        } 
        else 
        { 
            switch(ch) 
            { 
            case '<': 
                m=0; 
                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 '>': 
                token[m++]=ch; 
                ch=prog[p++]; 
                if(ch=='=')
                { 
                    syn=24; //标记”>=”的对应码
                    token[m++]=ch; 
                } 
                else 
                { 
                    syn=23;//标记”>”的对应码
                    p--; 
                } 
                break; 
            case ':': 
                token[m++]=ch; 
                ch=prog[p++]; 
                if(ch=='=')
                { 
                    syn=18;//标记”:=”的对应码
                    token[m++]=ch; 
                } 
                else
                { 
                    syn=17;//标记”:”的对应码
                    p--; 
                } 
                break;
            case '+': 
                syn=13;//标记”+”的对应码
                token[m++]=ch; 
                break; 
            case '-': 
                syn=14;//标记”-”的对应码
                token[m++]=ch; 
                break; 
            case '*':
                syn=15;//标记”*”的对应码
                token[m++]=ch; 
                break; 
            case '/': 
                syn=16;//标记”/”的对应码
                token[m++]=ch; 
                break;
            case '=': 
                syn=25;//标记”=”的对应码
                token[m++]=ch; 
                break; 
            case ';': 
                syn=26;//标记”;”的对应码
                token[m++]=ch; 
                break; 
            case '(': 
                syn=27;//标记”(”的对应码
                token[m++]=ch; 
                break; 
            case ')': 
                syn=28;//标记”)”的对应码
                token[m++]=ch; 
                break; 
            case '#': 
                syn=0;//标记”#”的对应码
                token[m++]=ch; 
                break; 
            default: 
                syn=-1;//当不是上述字母,数字,符号时,设置
                syn=-1;
            } 
            token[m++]=''; 
        } 
    
    } 
    void A()
    { 
        if(syn==10 || syn==11)
        { 
            scaner(); 
        } 
        else if(syn==27)
        { 
            scaner(); 
            B(); 
            if(syn==28)
                scaner(); 
            else 
            { 
                kk=1; 
                printf("ERROR: )错误
    ");
            } 
        } 
        else 
        { 
            kk=1; 
            printf("ERROR: 表达式错误
    ");
        } 
    } 
    void C()
    { 
        A(); 
        while(syn==15 || syn==16)
        { 
            scaner(); 
            A(); 
        } 
    
    } 
    void B()
    { 
        C(); 
        while(syn==13 || syn==14)
        { 
            scaner(); 
            C(); 
        } 
    
    } 
    void T()
    { 
        if(syn==10)
        { 
            scaner(); 
            if(syn==18)
            { 
                scaner(); 
                B(); 
            } 
            else
            { 
                kk=1; 
                printf("ERROR: 赋值号错误
    ");
            } 
        } 
        else
        { 
            kk=1; 
            printf("ERROR: 语句错误
    "); 
        } 
    } 
    void Y()
    { 
        B();  
        while(syn==26)
        {
            scaner();
            B(); 
    
        } 
    
    } 
    void E()//程序
    { 
        if(syn==1)
        { 
            scaner(); 
            Y(); 
            if(syn==6) 
            { 
                scaner(); 
                if(syn==0 && kk==0)
                    printf("success!
    "); 
                else if(syn!=0 && kk==0) 
                { 
                    kk=1; 
                    printf("ERROR: END后未正常结束
    ");
                } 
            } 
            else
            { 
                if(kk!=1) 
                { 
                    kk=1; 
                    printf("ERROR: 缺少end
    ");
                } 
            }
        } 
        else 
        { 
            kk=1; 
            printf("ERROR: begin错误
    ");
        } 
    
    } 

  • 相关阅读:
    mac上python3安装HTMLTestRunner
    双目深度估计传统算法流程及OpenCV的编译注意事项
    深度学习梯度反向传播出现Nan值的原因归类
    1394. Find Lucky Integer in an Array
    1399. Count Largest Group
    1200. Minimum Absolute Difference
    999. Available Captures for Rook
    509. Fibonacci Number
    1160. Find Words That Can Be Formed by Characters
    1122. Relative Sort Array
  • 原文地址:https://www.cnblogs.com/xiaochenxi/p/5091730.html
Copyright © 2011-2022 走看看