解釋器模式(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)!