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

  • 相关阅读:
    【转】SMARTY 不乱码截取中文
    godaddy最新优惠码
    javascript 学习之屏幕尺寸获取。
    IE6 实现minwidth
    css 修改页面选中时背景颜色
    jQuery 闪动的文字提示
    jQuery插件 blockUI
    HTML 5 video 视频标签全属性详解
    linux打包压缩命令汇总
    Windows 下MySQL zip 安装
  • 原文地址:https://www.cnblogs.com/xiaochenxi/p/5091730.html
Copyright © 2020-2023  润新知