1. 程式人生 > >設計模式之直譯器模式(C++)

設計模式之直譯器模式(C++)

設計模式之直譯器模式

直譯器模式,給定一個語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子。直譯器模式解決的問題是,如果一種特定型別的問題發生的頻率足夠高,那麼可能就只得將該問題的各個示例表述為一個簡單語言中的句子。這樣就可以構建一個直譯器,該直譯器通過解釋這些句子來解決問題。

其UML圖如下: 直譯器模式UML圖 在直譯器模式中每一種表示式對應一種表示式解釋類,比如TerminalExpression和NonterminalExpression。Context類種是表示式內容,在客戶端中決定是那種型別的表示式,從而建立不同的表示式獨享來解釋該語句。

示例程式碼如下:

// InterpreterModel.h檔案
#pragma once #include <iostream> #include <string> class Context { private: std::string m_strInput; std::string m_strOutput; public: void setExpression(std::string str) { m_strInput = str; } }; class Expression { public: virtual void Interpret(Context * context) = 0; }; class TerminalExpression
: public Expression { public: void Interpret(Context * context) { std::cout << "TerminalExpression!" << std::endl; } }; class NonterminalExpression : public Expression { public: void Interpret(Context * context) { std::cout << "NonterminalExpression!" << std::endl;
} };

測試程式碼如下:

#include <iostream>
#include "InterpreterModel.h"

int main()
{
	using namespace std;
	// 直譯器模式
	Context * pContext = new Context();
	pContext->setExpression("Expression......");
	Expression * pNon = new NonterminalExpression();
	Expression * p = new TerminalExpression();
	// 根據Expression中的內容判斷採用那種表示式解析
	pNon->Interpret(pContext);
	p->Interpret(pContext);
	delete p;
	delete pNon;
	delete pContext;

	getchar();
	return 0;
}

測試結果如下圖: 在這裡插入圖片描述 使用直譯器模式,就意味著可以很容易地改變和擴充套件文法,因為該模式使用類來表示文法規則,你可使用繼承來改變或擴充套件該文法。也比較容易實現文法,因為定義抽象語法樹種各個節點的類的實現大體類似,這些類都易於直接編寫。

直譯器模式的不足之處在於,直譯器模式為文法中的每一條規則至少定義了一個類,因此包含許多規則的文法可能難以管理和維護。