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:\n");
    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=='\n') 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++]='\0';    //把token的末尾设置结束符\0 
        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++]='\0'; 
    } 

} 
void A()
{ 
    if(syn==10 || syn==11)
    { 
        scaner(); 
    } 
    else if(syn==27)
    { 
        scaner(); 
        B(); 
        if(syn==28)
            scaner(); 
        else 
        { 
            kk=1; 
            printf("ERROR: )错误\n");
        } 
    } 
    else 
    { 
        kk=1; 
        printf("ERROR: 表达式错误\n");
    } 
} 
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: 赋值号错误\n");
        } 
    } 
    else
    { 
        kk=1; 
        printf("ERROR: 语句错误\n"); 
    } 
} 
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!\n"); 
            else if(syn!=0 && kk==0) 
            { 
                kk=1; 
                printf("ERROR: END后未正常结束\n");
            } 
        } 
        else
        { 
            if(kk!=1) 
            { 
                kk=1; 
                printf("ERROR: 缺少end\n");
            } 
        }
    } 
    else 
    { 
        kk=1; 
        printf("ERROR: begin错误\n");
    } 

} 

 

转载于:https://www.cnblogs.com/xiaochenxi/p/5091730.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值