递归下降语法分析

#include
#include<string.h>
#include

char prog[]="(a+b)*2",token[20];
char ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end" };

void E();
void T();
void E1();
void T1();
void F();
void error();

void scaner(){
    m=0;
 for(n=0; n<8; n++) token[n]=NULL;
 ch=prog[p++];
 while(ch==' ') ch=prog[p++];
 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++];
     }
     token[m++]='\0';
     syn=10;
     p=p-1;      //回退一个字符
     for(n=0; n<6; n++) {
         if(strcmp(token,rwtab[n])==0) {
             syn=n+1;
             break;
         }
     }
 } else if(ch>='0' && ch<='9') {
     sum=0;
     while(ch>='0' && ch<='9') {
         sum=sum*10+ch-'0';
         ch=prog[p++];
     }
     p=p-1;
     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=p-1;
             }
             p=p+1;
             token[m]='\0';
             break;
         case '>':
             m=0;
             token[m++]=ch;
             ch=prog[p++];
             if(ch=='=') {
                 syn=24;
                 token[m++]=ch;
             } else {
                 syn=23;
                 p=p-1;
             }
             break;
         case ':':
             m=0;
             token[m++]=ch;
             ch=prog[p++];
             if(ch=='=') {
                 syn=18;
                 token[m++]=ch;
             } else {
                 syn=17;
                 p=p-1;
             }
             break;
         case '+':
             syn=13;
             token[0]=ch;
             break;
         case '-':
             syn=14;
             token[0]=ch;
             break;
         case '*':
             syn=15;
             token[0]=ch;
             break;
         case '/':
             syn=16;
             token[0]=ch;
             break;
         case ';':
             syn=26;
             token[0]=ch;
             break;
         case '(':
             syn=27;
             token[0]=ch;
             break;
         case ')':
             syn=28;
             token[0]=ch;
             break;
         case '=':
             syn=25;
             token[0]=ch;
             break;
         case '#':
             syn=0;
             token[0]=ch;
             break;
         default:
             syn=-1;
     }
}
}

void E()
{
    T();
    E1();
}

void E1()
{
    if(syn == 13){
        scaner();
        T();
        E1();
    }else if(syn ==0 || syn==20){
    }else  error();
}

void T(){
    F();
    T1();
}

void T1(){
    if(syn ==15){
        scaner();
        F();
        T1();
    }else if (syn==0|| syn==13){
    }else error();
}

void F(){
    if(syn==27){
        scaner();
        E();
        if(syn==28)  scaner();
        else    error;
    }else if (syn ==11 ||syn ==10)
        scaner();
    else
        error();    
}

void error(){
    printf("\n(%s,出错)",token);
    
}
main()
{
    scaner();
    E();
}

 

#include#include#include
char prog[]="(a+b)*2",token[20];char ch;int syn,p,m,n,sum;char *rwtab[6]={"begin","if","then","while","do","end" };
void E();void T();void E1();void T1();void F();void error();
void scaner(){m=0; for(n=0; n<8; n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') ch=prog[p++]; 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++];     }     token[m++]='\0';     syn=10;     p=p-1;      //回退一个字符     for(n=0; n<6; n++) {         if(strcmp(token,rwtab[n])==0) {             syn=n+1;             break;         }     } } else if(ch>='0' && ch<='9') {     sum=0;     while(ch>='0' && ch<='9') {         sum=sum*10+ch-'0';         ch=prog[p++];     }     p=p-1;     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=p-1;             }             p=p+1;             token[m]='\0';             break;         case '>':             m=0;             token[m++]=ch;             ch=prog[p++];             if(ch=='=') {                 syn=24;                 token[m++]=ch;             } else {                 syn=23;                 p=p-1;             }             break;         case ':':             m=0;             token[m++]=ch;             ch=prog[p++];             if(ch=='=') {                 syn=18;                 token[m++]=ch;             } else {                 syn=17;                 p=p-1;             }             break;         case '+':             syn=13;             token[0]=ch;             break;         case '-':             syn=14;             token[0]=ch;             break;         case '*':             syn=15;             token[0]=ch;             break;         case '/':             syn=16;             token[0]=ch;             break;         case ';':             syn=26;             token[0]=ch;             break;         case '(':             syn=27;             token[0]=ch;             break;         case ')':             syn=28;             token[0]=ch;             break;         case '=':             syn=25;             token[0]=ch;             break;         case '#':             syn=0;             token[0]=ch;             break;         default:             syn=-1;     }}}
void E(){T();E1();}
void E1(){if(syn == 13){scaner();T();E1();}else if(syn ==0 || syn==20){}else  error();}
void T(){F();T1();}
void T1(){if(syn ==15){scaner();F();T1();}else if (syn==0|| syn==13){}else error();}
void F(){if(syn==27){scaner();E();if(syn==28)  scaner();elseerror;}else if (syn ==11 ||syn ==10)scaner();elseerror();}
void error(){printf("\n(%s,出错)",token);}main(){scaner();E();}

你可能感兴趣的:(递归下降语法分析)