遞歸下降分析分析法


用遞歸下降法編寫一個語法分析程序,使之與詞法分析器結合,能夠根據語言的上下文無關文法,識別輸入的單詞序列是否文法的句子。

   

對下列文法,用遞歸下降分析法對任意輸入的符號串進行分析:

E->TG G->+TG|-TG G->ε

T->FS S->*FS|/FS S->ε

F->(E) F->i

源程序

#include<iostream>

#include<string>

using namespace std;

void E(); //E->TG

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

void T(); //T->FS

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

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

string str;

string strC;

void main()

{

    cout << "請輸入字符串(#號結束):" << endl;

    cin >> str;

    strC = str;

    cout << "文法        分析串     分析字符        剩余串" << endl;

    E();

}

void E()

{

    cout << "E->TG        " << strC.substr(0, strC.length() - str.length() + 1) << "        " << str[0] << "        " << str << endl;

    T();

    G();

}

void T()

{

    cout << "T->FS        " << strC.substr(0, strC.length() - str.length() + 1) << "        " << str[0] << "        " << str << endl;

    F();

    S();

}

void G()

{

    if (str[0] == '+')

    {

        cout << "G->+TG        " << strC.substr(0, strC.length()-str.length()+1) << "        " << str[0] << "        " << str << endl;

        str = str.substr(1, str.length());

        T();

        G();

    }

    else if (str[0] == '-')

    {

        cout << "G->-TG        " << strC.substr(0, strC.length() - str.length()+1) << "        " << str[0] << "        " << str << endl;

        str = str.substr(1, str.length());

        T();

        G();

    }

    else

    {

        cout << "G->ε                " << strC.substr(0, strC.length() - str.length() + 1) << "        " << str << endl;

    }

}

void F()

{

    if (str[0] == 'i') {

        cout << "F->i        " << strC.substr(0, strC.length() - str.length() + 1) << "        " << str[0] << "        " << str << endl;

        str = str.substr(1, str.length());

    }

    else if (str[0] == '(') {

        cout << "F->(E)        " << strC.substr(0, strC.length() - str.length() + 1) << "        " << str[0] << "        " << str << endl;

        str = str.substr(1, str.length());

        E();

        if (str[0] == ')') {

            cout << "F->(E)        " << strC.substr(0, strC.length() - str.length() + 1) << "        " << str[0] << "        " << str << endl;

            str = str.substr(1, str.length());

        }

        else {

            printf("\n非法的符號串!\n");

            exit(0);

        }

    }

    else {

        printf("非法的符號串!\n");

        exit(0);

    }

}

void S()

{

    if (str[0] == '*') {

        cout << "S->*FS        " << strC.substr(0, strC.length() - str.length() + 1) << "        " << str[0] << "        " << str << endl;

        str = str.substr(1, str.length());

        F();

        S();

    }

    else if (str[0] == '/')

    {

        cout << "S->/FS        " << strC.substr(0, strC.length() - str.length() + 1) << "        " + str[0] << "        " << str << endl;

        str = str.substr(1, str.length());

        F();

        S();

    }

    else{

        cout << "S->ε        " << strC.substr(0, strC.length() - str.length() + 1) << "        " << str[0] << "        " << str << endl;

    }

}

 

 


免責聲明!

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



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