解譯器模式(Interpreter):給定一個語言,定義它的文法的一種表示,並定義一個解譯器,這個解譯器使用該表示來解釋語言中的句子。
解譯器模式解決的問題:如果一種特定類型的問題發生的頻率足夠高,那麼可能就值得將該問題的各個執行個體表述為一個簡單語言中的句子。這樣就可以構建一個解譯器,該解譯器通過解釋這些句子來解決該問題。
Regex就是它的一種應用,解譯器為Regex定義了一個文法和表示一個特定的Regex,以及如何解釋這個Regex。
四個角色:
AbstractExpression抽象運算式:聲明一個抽象的解釋操作,這個介面為抽象文法樹中所有的節點所共用。
TerminalExpression終結符運算式:實現與文法中的終結符相關聯的解釋操作。
NonterminalExpression:非終結符運算式,為文法中的非終結符實現解釋操作。對文法中每一條規則R1、R2…Rn都需要一個具體的非終結符運算式類。
Context:包含解譯器之外的一些全域資訊。
模式實現:
[code]//Contextclass 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]//Clientint 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++設計模式淺識解譯器模式的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!