天天看點

簡單的遞歸下降分析

遞歸下降分析

程式輸入輸出示例:

簡單的遞歸下降分析

( 1 )     E→TG               

簡單的遞歸下降分析

( 2 )     G→ + TG |- TG | ε       

簡單的遞歸下降分析

( 3 )     T→FS               

簡單的遞歸下降分析

( 4 )     S → * FS |/ FS | ε     

簡單的遞歸下降分析

( 5 )     F→(E) | i           

輸出的格式如下:

(1)輸出一個以#結束的符号串(包括+ - * / i #):

(2)輸出結果:i+i*i#為合法符号串

備注:輸入一符号串如i+i*#,要求輸出為"非法的符号串"

簡單的遞歸下降分析
簡單的遞歸下降分析
簡單的遞歸下降分析

//                                    //

簡單的遞歸下降分析

//                                  //

簡單的遞歸下降分析

//             E→TG                //

簡單的遞歸下降分析

//             G→+TG|-TG|ε        //

簡單的遞歸下降分析

//             T→FS                //

簡單的遞歸下降分析

//             S→*FS|/FS|ε        //

簡單的遞歸下降分析

//             F→(E)|i             //

簡單的遞歸下降分析

//                                  //

簡單的遞歸下降分析
簡單的遞歸下降分析
簡單的遞歸下降分析
簡單的遞歸下降分析

#include  < iostream >

簡單的遞歸下降分析

using   namespace  std;

簡單的遞歸下降分析
簡單的遞歸下降分析

char  A[ 100 ];                                 // 用于存放符号串,不能多于100個字元

簡單的遞歸下降分析

int  i = 0 ;                                     // 記錄目前要判斷的字元位置

簡單的遞歸下降分析

void  E();                                     // E()

簡單的遞歸下降分析

void  G();                                     // G()

簡單的遞歸下降分析

void  T();                                     // 為每個非終節符構造一個子程式

簡單的遞歸下降分析

void  S();                                     // S()

簡單的遞歸下降分析

void  F();                                     // F()

簡單的遞歸下降分析

void  match( int   & k);                             // 此程式隻是此執行加1操作,為了取到後一個終結符

簡單的遞歸下降分析

void  main( )

簡單的遞歸下降分析
簡單的遞歸下降分析

... {

簡單的遞歸下降分析
簡單的遞歸下降分析

    cout<<"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;

簡單的遞歸下降分析

    cout<<"+ 遞歸下降分析 +"<<endl;

簡單的遞歸下降分析

    cout<<"+ 作者:楊浩 +"<<endl;

簡單的遞歸下降分析

    cout<<"+ 日期:2008年4月 +"<<endl;

簡單的遞歸下降分析

    cout<<"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;

簡單的遞歸下降分析
簡單的遞歸下降分析

    cout<<"請輸入一個有待判斷的符号串(以#結尾): ";

簡單的遞歸下降分析

    cout<<"輸入的符号串: ";

簡單的遞歸下降分析

    cin>>A;

簡單的遞歸下降分析

    cout<<"輸出的符号串: "<<A<<endl<<endl;

簡單的遞歸下降分析

    cout<<"比對的結果: ";

簡單的遞歸下降分析
簡單的遞歸下降分析

    E();

簡單的遞歸下降分析

    if(A[i]!='#')

簡單的遞歸下降分析
簡單的遞歸下降分析

    ...{

簡單的遞歸下降分析

        cout<<"此輸入串不合法"<<endl;

簡單的遞歸下降分析

        cout<<"不合法的原因: 不比對開始于在第"<<i+1<<"個終結符處,沒有發現與"<<A[i]<<"相比對的文法"<<endl;

簡單的遞歸下降分析

    }

簡單的遞歸下降分析

}

簡單的遞歸下降分析

void  E()                                                         // E->TG

簡單的遞歸下降分析
簡單的遞歸下降分析

... {

簡單的遞歸下降分析

    T();

簡單的遞歸下降分析

    G();

簡單的遞歸下降分析

}

簡單的遞歸下降分析

void  G()                                                         // G->+TG|-TG|ε

簡單的遞歸下降分析
簡單的遞歸下降分析

... {

簡單的遞歸下降分析

 // 這裡分了三個情況,“+”“-”以及“ε”三種情況。

簡單的遞歸下降分析

 // 如果是前兩種,則很好,本步驟比對 。如果沒有比對,則預設取到“ε”

簡單的遞歸下降分析

    if(A[i]=='+')                                                //比對“+”

簡單的遞歸下降分析
簡單的遞歸下降分析

    ...{

簡單的遞歸下降分析

        match(i);                                    

簡單的遞歸下降分析

        T();

簡單的遞歸下降分析

        G();

簡單的遞歸下降分析

    }

簡單的遞歸下降分析

    else if(A[i]=='-')                                            //比對“-”

簡單的遞歸下降分析
簡單的遞歸下降分析

    ...{

簡單的遞歸下降分析

        match(i);

簡單的遞歸下降分析

        T();

簡單的遞歸下降分析

        G();

簡單的遞歸下降分析

    }

簡單的遞歸下降分析

    else return;                                                //沒有與之比對,則預設為空

簡單的遞歸下降分析

}

簡單的遞歸下降分析

void  T()                                                         // T->FS

簡單的遞歸下降分析
簡單的遞歸下降分析

... {

簡單的遞歸下降分析

    F();

簡單的遞歸下降分析

    S();

簡單的遞歸下降分析

}

簡單的遞歸下降分析

void  S()                                                         // S->*FS|/FS|ε

簡單的遞歸下降分析
簡單的遞歸下降分析

... {

簡單的遞歸下降分析

 // 這裡分了三個情況,“*”“/”以及“ε”三種情況。

簡單的遞歸下降分析

 // 如果是前兩種,則很好,本步驟比對 。如果沒有比對,則預設取到“ε”

簡單的遞歸下降分析

 // 情況雷同G()

簡單的遞歸下降分析

    if(A[i]=='*')                                

簡單的遞歸下降分析
簡單的遞歸下降分析

    ...{

簡單的遞歸下降分析

        match(i);

簡單的遞歸下降分析

        F();

簡單的遞歸下降分析

        S();

簡單的遞歸下降分析

    }

簡單的遞歸下降分析

    else if(A[i]=='/')

簡單的遞歸下降分析
簡單的遞歸下降分析

    ...{

簡單的遞歸下降分析

        match(i);

簡單的遞歸下降分析

        F();

簡單的遞歸下降分析

        S();

簡單的遞歸下降分析

    }

簡單的遞歸下降分析

    else return;

簡單的遞歸下降分析

}

簡單的遞歸下降分析

void  F()                                                         // F->(E)|i

簡單的遞歸下降分析
簡單的遞歸下降分析

... {

簡單的遞歸下降分析

    if(A[i]=='(')

簡單的遞歸下降分析
簡單的遞歸下降分析

    ...{

簡單的遞歸下降分析

        match(i);

簡單的遞歸下降分析

        if(A[i]=='#')                                            //如果是“#”則說明已經搜尋比對完畢了,肯定合法

簡單的遞歸下降分析
簡單的遞歸下降分析

        ...{    

簡單的遞歸下降分析

            cout<<"此輸入串不合法"<<endl;

簡單的遞歸下降分析

            cout<<"不合法的原因: 沒有與'('相配對的')'"<<endl;

簡單的遞歸下降分析

            exit(0);            

簡單的遞歸下降分析

        }

簡單的遞歸下降分析

        E();

簡單的遞歸下降分析

        if(A[i]==')')

簡單的遞歸下降分析
簡單的遞歸下降分析

        ...{    

簡單的遞歸下降分析

            match(i);

簡單的遞歸下降分析

            if(A[i]=='#')                                        //如果是“#”則說明已經搜尋比對完畢了,肯定合法

簡單的遞歸下降分析
簡單的遞歸下降分析

            ...{    

簡單的遞歸下降分析

                if(A[i-2]=='i')

簡單的遞歸下降分析
簡單的遞歸下降分析

                ...{

簡單的遞歸下降分析

                    cout<<" 此輸入串合法 ";

簡單的遞歸下降分析

                    exit(0);

簡單的遞歸下降分析

                }

簡單的遞歸下降分析

                else 

簡單的遞歸下降分析
簡單的遞歸下降分析

                ...{

簡單的遞歸下降分析

                    cout<<"此輸入串不合法"<<endl;

簡單的遞歸下降分析

                    cout<<"不合法的原因: 前面沒有與'('相配對的'i'"<<endl;

簡單的遞歸下降分析

                    exit(0);

簡單的遞歸下降分析

                }

簡單的遞歸下降分析

            }

簡單的遞歸下降分析

        }

簡單的遞歸下降分析
簡單的遞歸下降分析

    }

簡單的遞歸下降分析

    else if(A[i]=='i')

簡單的遞歸下降分析
簡單的遞歸下降分析

    ...{

簡單的遞歸下降分析

        match(i);                                                //比對後繼續判斷有沒有到結束

簡單的遞歸下降分析

        if(A[i]=='#')                                            //如果是“#”則說明已經搜尋比對完畢了,肯定合法

簡單的遞歸下降分析
簡單的遞歸下降分析

        ...{

簡單的遞歸下降分析

            if(A[i-2]=='(')

簡單的遞歸下降分析
簡單的遞歸下降分析

            ...{    cout<<"此輸入串不合法"<<endl;

簡單的遞歸下降分析

                cout<<"不合法的原因: 沒有與'('相配對的')'"<<endl;

簡單的遞歸下降分析

                exit(0);

簡單的遞歸下降分析

            }

簡單的遞歸下降分析

            else 

簡單的遞歸下降分析
簡單的遞歸下降分析

            ...{

簡單的遞歸下降分析

                cout<<" 此輸入串合法 ";

簡單的遞歸下降分析

                exit(0);                

簡單的遞歸下降分析

            }

簡單的遞歸下降分析

        }

簡單的遞歸下降分析

        return ;

簡單的遞歸下降分析

    }

簡單的遞歸下降分析
簡單的遞歸下降分析

    else if (A[i]=='#')

簡單的遞歸下降分析
簡單的遞歸下降分析

    ...{

簡單的遞歸下降分析

        cout<<"此輸入串不合法"<<endl;

簡單的遞歸下降分析

        cout<<"不合法的原因: 不比對開始于在第"<<i<<"個終結符處,沒有發現與"<<A[i-1]<<"相比對的文法"<<endl;

簡單的遞歸下降分析

        exit(0);

簡單的遞歸下降分析

    }

簡單的遞歸下降分析

    else 

簡單的遞歸下降分析
簡單的遞歸下降分析

    ...{

簡單的遞歸下降分析

        cout<<"此輸入串不合法"<<endl;

簡單的遞歸下降分析

        cout<<"不合法的原因: 不比對開始于在第"<<i+1<<"個終結符處,沒有發現與"<<A[i]<<"相比對的文法"<<endl;

簡單的遞歸下降分析

        exit(0);

簡單的遞歸下降分析

    }

簡單的遞歸下降分析
簡單的遞歸下降分析

}

簡單的遞歸下降分析

void  match( int   & k)                                                 // 如果比對的話,取下一個終結符

簡單的遞歸下降分析
簡單的遞歸下降分析

... {

簡單的遞歸下降分析

    k++;

簡單的遞歸下降分析

}

簡單的遞歸下降分析

 輸出正确的還行,錯誤方面的分析有些被動,因為情況太多了,我隻把我想到的各種情況都寫上了,至于其他的,還請各位大哥幫小弟偵查一下。嘿嘿,謝謝啦!~~~