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错误
    ");
        } 
    
    } 

  • 相关阅读:
    将vue文件script代码抽取到单独的js文件
    git pull 提示错误:Your local changes to the following files would be overwritten by merge
    vue和uniapp 配置项目基础路径
    XAMPP Access forbidden! Access to the requested directory is only available from the local network.
    postman与newman集成
    postman生成代码段
    Curl命令
    POST方法的Content-type类型
    Selenium Grid 并行的Web测试
    pytorch转ONNX以及TnesorRT的坑
  • 原文地址:https://www.cnblogs.com/xiaochenxi/p/5091730.html
Copyright © 2011-2022 走看看