首页 > 代码库 > 构造递归下降分析程序

构造递归下降分析程序

 

词法分析程序scaner( ),sym;error( )


每个函数名是相应的非终结符,函数体是根据右部符号串的结构编写。


当遇到终结符时,则编写语句if(当前读入的符号==a)则读入下一个单词
当遇到非终结符A时,则编写语句调用A( )
当遇到规则A→ε时,则编写语句调用if(当前读入的符号? FOLLOW(A))error( )

 

对于给定的文法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

是否是LL(1)文法?

select(E→TE‘)=first(TE‘)={(,i}
select(E‘→+TE‘)=first(+TE‘)={+}
select(E‘→-TE‘)=first(-TE‘)={-}
select(E‘→∑)=follow(E‘)={),#}
select(T→FT‘)=first(FT‘)={(,i}
select(T‘→*FT‘)=first(*FT‘)={*}
select(T‘→/FT‘)=first(/FT‘)={/}
select(T‘→∑)=follow(T‘)={+,-,),#)
select(F→(E))=first((E))={(}
select(F→i)=first(i)={i}

由上分析,得知此文法满足LL(1)文法

 

代码如下

 

#include<stdio.h>
#include<string>
char str[10];   //记录要分析的字符串
int x=0;        //记录第一个字符
 
void E();           
void X();           
void T();           
void Y(); 
void F(); 
 
int main()
{
    int len;
    printf("请输入算数表达式:");
    scanf("%s",str);
    len=strlen(str);
    str[len]=#;
    str[len+1]=\0;
    E();
    printf("\n正确!\n");
    strcpy(str,"");
    x=0;
    return 0;
}
 
void E()
{
    T();
    X();
}
 
void X()
{
    if(str[x]==+||str[x]==-)
    {
        x++;
        T();
        X();
    } 
}
 
void T()
{
    F();
    Y();
}
 
void Y()
{
    if(str[x]==*||str[x]==/)
    {
        x++;
        F();
        Y();
    }
}
 
void F()
{
    if(str[x]>=a&&str[x]<=z)
    {
        x++;
    }
    else if(str[x]>=0&&str[x]<=9)
    {
        x++;
    }
    else if (str[x]==()
    {     
        x++;
        E();
        if(str[x]==))
        {
            x++; 
        }
        else
        {
            printf("\n错误!\n");
            exit(0);
        }
    } 
    else
    {
        printf("\n错误r!\n"); 
exit(0);
 }
 }

 

构造递归下降分析程序