12.16

 

/*G[E]:
E->E+T|E-T|T
T->T*F|T/F|F
F->(E)|i
左递归消除
E->TE'
E'->+TE'|-TE'|ε
T->FT'
T'->*FT'|/FT'|ε
F->(E)|i
*/
#include<stdio.h>
char sym;
char LL1[1000];
int N=-1;

void T();
void E();
void F();
void e();
void t();
void error();
void scaner();
void main()
{
    char ch;
    int i=0;
    printf("请输入需要分析的sym语法:(以#结束)\n");
    do{
        scanf("%c",&ch);
        LL1[i] = ch;
        i++;
    }while(ch != '#');
    scaner();
    E();
    if(sym == '#')
        printf("成功!\n");
    else{
        printf("文法有误!!\n");
        error();
    }
}
void scaner(){   //用于读取源函数的下一个字符

    N++;
    if(LL1[N] == ' '){
        N++;
    }else{
        sym = LL1[N];
    }
}

void E(){
    T();
    e();
}
void T(){
    F();
    t();
}

void e(){
    if(sym == '+'||sym == '-'){
        scaner();
        T();
        e();
    }
    else if(LL1[N+1] == '#' || LL1[N+1] == '+' || LL1[N+1] == '/' || LL1[N+1] == '*' || LL1[N+1] == '-'){
        if(LL1[N] != '(' && LL1[N] != ')')
        error();
    
    }
}

void t(){
    if(sym == '*'||sym == '/'){
        scaner();
        F();
        T();
    }
    else if(LL1[N+1] == '#' || LL1[N+1] == '+' || LL1[N+1] == '/' || LL1[N+1] == '*' || LL1[N+1] == '-'){
        if(LL1[N] != '(' && LL1[N] != ')')
        error();
    
    }
}
void F(){
    if(sym == '('){
        scaner();
        E();
        if(sym == ')'){
            scaner();
        }else{
            error();
        }
    }else    //判断是否是函数或者是数字
     while(1){
            if(sym >= 'a' && sym<='z' || sym >= 'A' && sym <= 'Z' || sym >= '0' && sym <= '9'){
                scaner();

             }
             else{
                break;
            }
     }
        }
    


void error(){
    printf("第%d个 %c之后的文法有错!\n",N,sym);
}

 

posted @ 2015-12-16 17:47  32朱杰  阅读(182)  评论(0编辑  收藏  举报