您的位置:首页 > 其它

编译原理语法分析器递归下降法求助

2017-12-29 22:39 357 查看
#include "stdio.h"  

#include "string.h"  

  

  

char prog[100],token[8],ch;  

char *rwtab[6]={"begin","if","then","while","do","end"};  

int syn,p,m,n,sum;  

int kk;  

  

void factor(void);  

void expression(void);  

void yucu(void);  

void term(void);  

void statement(void);  

void lrparser(void);  

void scaner(void);  

void ifblock(void);

void whileblock(void);

void judge(void);

  

void main(void)  

{  

    p=kk=0;  

    printf("\nplease input a string (end with '#'): \n");  

  

    do  

    {  

        scanf("%c",&ch);  

        prog[p++]=ch;  

    }while(ch!='#');  

  

    p=0;  

    scaner();  

    lrparser();  

    //getch();  

}  

  

void lrparser(void)  

{  

    if(syn==1)          //begin

    {   

        scaner();       /*读下一个单词符号*/  

        yucu();         /*调用yucu()函数;*/  

        if(syn==6)      /*读到end,如果跟在后面的是#则结束*/

        {  

            scaner();  

            if((syn==0)&&(kk==0))  

            printf("success!\n");  

        }  

        else  

        {  

            if(kk!=1) printf("the string haven't got a 'end'!\n");  

            kk=1;  

        }  

    }  

    else  

    {   

        printf("haven't got a 'begin'!\n");  

        kk=1;  

    }  

      

    return;  

}  

  

void yucu(void)  

{   
if(syn == 2)            //判断if
{
ifblock();
}
if(syn == 4)            //判断while
{
whileblock();
}

    statement();         /*调用函数statement();*/  

    while(syn==26)       //分号

    {  

        scaner();          /*读下一个单词符号*/  

        if(syn!=6){         // 不是end
if(syn == 2)
{
ifblock();
}
if(syn == 4)
{
whileblock();

statement();         /*调用函数statement();*/  
}

    }   

    return;  

}  

  

void statement(void)      //句子,必须以字母开头

{  

    if(syn==10)           // 单词

    {  

        scaner();        /*读下一个单词符号*/  

        if(syn==18)      // :=

        {  

            scaner();      /*读下一个单词符号*/  

            expression();      /*调用函数expression();*/  

        }  

        else  

        {  

            printf("the sing ':=' is wrong!\n");  

            kk=1;  

        }  

    }  

    else  

    {   

        printf("wrong sentence!\n");  

        kk=1;  

    }  

      

    return;  

}  

  

void expression(void)  

{  

    term();  

    while((syn==13)||(syn==14))  // +、-

    {  

        scaner();             /*读下一个单词符号*/  

        term();               /*调用函数term();*/  

    }  

      

    return;  

}  

  

void term(void)  

{   

    factor();  

    while((syn==15)||(syn==16))   // *、/

    {   

        scaner();             /*读下一个单词符号*/  

        factor();              /*调用函数factor(); */  

    }  

      

    return;  

}  

  

void factor(void)  

{   

    if((syn==10)||(syn==11))    //单词或数字

    {  

        scaner();  

    }  

    else if(syn==27)            //左括号

    {   

        scaner();           /*读下一个单词符号*/  

        expression();        /*调用函数statement();*/  

  

        if(syn==28)             //右括号

        {  

            scaner();          /*读下一个单词符号*/  

        }  

        else   

        {  

            printf("the error on '('\n");  

            kk=1;  

        }  

    }  

    else  

    {   

        printf("the expression error!\n");  

        kk=1;  

    }  

      

    return;  

}  

void scaner(void)  

{  

    sum=0;  

  

    for(m=0;m<8;m++)  

        token[m++]=NULL;  

      

    m=0;  

    ch=prog[p++];  

      

    while(ch==' ')  

        ch=prog[p++];  

      

    if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))  

    {   

        while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))  

        {  

            token[m++]=ch;  

            ch=prog[p++];  

        }  

        p--;

        syn=10;  

        token[m++]='\0';  

        for(n=0;n<6;n++)  

        if(strcmp(token,rwtab
)==0)  

        {  

            syn=n+1;  

            break;  

        }  

    }  

    else if((ch>='0')&&(ch<='9'))  

    {  

        while((ch>='0')&&(ch<='9'))  

        {   

            sum=sum*10+ch-'0';  

            ch=prog[p++];  

        }  

        p--;  

        syn=11;  

    }  

    else  

    switch(ch)  

    {  

        case '<':  

            m=0;  

            ch=prog[p++];  

            if(ch=='>')  

            {   

                syn=21;  

            }  

            else if(ch=='=')  

            {   

                syn=22;  

            }  

            else  

            {   

                syn=20;  

                p--;  

            }  

        break;  

          

        case '>':  

            m=0;  

            ch=prog[p++];  

            if(ch=='=')  

            {   

                syn=24;  

            }  

            else  

            {  

                syn=23;  

                p--;  

            }  

        break;  

          

        case ':':  

            m=0;  

            ch=prog[p++];  

            if(ch=='=')  

            {  

                syn=18;  

            }  

            else  

            {  

                syn=17;  

                p--;  

            }  

            break;  

              

        case '+':  

            syn=13;  

        break;  

          

        case '-':   

            syn=14;  

        break;  

          

        case '*':  

            syn=15;  

        break;  

          

        case '/':   

            syn=16;  

        break;  

          

        case '(':   

            syn=27;  

        break;  

          

        case ')':   

            syn=28;  

        break;  

          

        case '==':  

            syn=25;  

        break;  

          

        case ';':   

            syn=26;  

        break;  

          

        case '#':  

            syn=0;  

        break;  

          

        default:  

            syn=-1;  

        break;  

    }  



void judge(void)

{
if(syn==10)        //单词
{
scaner();
if(syn == 25)
{
scaner();
expression();
}
}
else 
printf("the judge error!\n"); 
return;

}

void ifblock(void)

{
if(syn == 2)           //if
{
scaner();
judge();
if(syn==3)
{
statement();
}
}
else 
printf("the ifblock error!\n"); 
return;

}

void whileblock(void)

{
if(syn == 4)           //while
{
scaner();
judge();
if(syn==5)
{
statement();
}
}
else 
printf("the whileblock error!\n");
return;
}

请问为什么会出现error sentence?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息