首頁  >  文章  >  後端開發  >  C++設計模式淺識解釋器模式

C++設計模式淺識解釋器模式

黄舟
黄舟原創
2017-01-17 13:25:381322瀏覽

解釋器模式(Interpreter):給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。

解釋器模式解決的問題:如果一種特定類型的問題發生的頻率足夠高,那麼可能就值得將該問題的各個實例表述為一個簡單語言中的句子。這樣就可以建立一個解釋器,該解釋器透過解釋這些句子來解決該問題。

正規表示式就是它的一種應用,解釋器為正規表示式定義了一個文法和表示一個特定的正規表示式,以及如何解釋這個正規表示式。

四個角色:

AbstractExpression抽象表達式:宣告一個抽象的解釋操作,這個介面為抽象語法樹中所有的節點所共用。

TerminalExpression終結符表達式:實現與文法中的終結符相關聯的解釋操作。

NonterminalExpression:非終結符表達式,為文法中的非終結符實現解釋操作。對文法中每一條規則R1、R2…Rn都需要一個具體的非終結符表達式類別。

Context:包含解釋器以外的一些全域資訊。

模式實作:

[code]//Context
class Context{
private:
    std::string input;
public:
    std::string Input(std::string in){
        input = in;
        return input;
    }
};

//抽象表达式
class AbstractExpression{
public:
    virtual void Interpret(Context *context) = 0;
};

//终结符表达式
class TerminalExpression: public AbstractExpression{
public:
    void Interpret(Context *context)override{
        std::cout << "TerminalExpression\n";
    }
};

//非终结符表达式
class NonterminalExpression: public AbstractExpression{
public:
    void Interpret(Context *context)override{
        std::cout << "NonterminalExpression\n";
    }
};

客戶端:

[code]//Client
int main(){
    Context *context = new Context;
    std::list<AbstractExpression*> list;
    list.push_back(new TerminalExpression);
    list.push_back(new NonterminalExpression);
    list.push_back(new TerminalExpression);
    list.push_back(new TerminalExpression);

    for(auto i : list)
        i->Interpret(context);
    // Output:
    // TerminalExpression
    // NonterminalExpression
    // TerminalExpression
    // TerminalExpression

    return 0;
}

解釋器模式好處: 

通常有一個語言需要解釋執行,並且可將該語言中的句子表示為一個抽象語法樹時,可使用解釋器模式。

以上就是C++設計模式淺識解釋器模式的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn