再帰的降下の意味分析


#include
#include  
char str[10];
int index=0;
void E();            //E->TX;
void X();            //X->+TX|-TX| e
void T();            //T->FY
void Y();            //Y->*FY |/fy| e
void F();            //F->(E) | id
int id();           //id
int main()
{
    int len;
    int m;

        printf("        :");
        scanf("%s",str);
        len=strlen(str);
        str[len]='#';
        str[len+1]='\0';
        E();
        printf("    !
"); strcpy(str,""); index=0; return 0; } void E() { T(); X(); } void X() { if(str[index]=='+') { index++; T(); X(); } else if(str[index]=='-') { index++; T(); X(); } } void T() { F(); Y(); } void Y() { if(str[index]=='*') { index++; F(); Y(); } else if(str[index]=='/') { index++; F(); Y(); } } void F() { if(id()) { index++; } else if (str[index]=='(') { index++; E(); if(str[index]==')') { index++; }else{ printf("
!
"); exit (0); } } else{ printf(" !
"); exit(0); } } int id() { if(str[index]>='0'&&str[index]<='9') { while( str[index+1]>='0'&&str[index+1]<='9' ) { index++; } if(str[index+1]>='a'&&str[index+1]<='z' ) return 0; return 1; } else if(str[index]>='a'&&str[index]<='z' ) { return 1; } else return 0; }

転載先:https://www.cnblogs.com/RSTART/p/5089568.html