構造遞歸下降分析程序


 

詞法分析程序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);
 }
 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM