設計模式之直譯器模式(C++)
阿新 • • 發佈:2018-12-17
設計模式之直譯器模式
直譯器模式,給定一個語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子。直譯器模式解決的問題是,如果一種特定型別的問題發生的頻率足夠高,那麼可能就只得將該問題的各個示例表述為一個簡單語言中的句子。這樣就可以構建一個直譯器,該直譯器通過解釋這些句子來解決問題。
其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;
}
測試結果如下圖: 使用直譯器模式,就意味著可以很容易地改變和擴充套件文法,因為該模式使用類來表示文法規則,你可使用繼承來改變或擴充套件該文法。也比較容易實現文法,因為定義抽象語法樹種各個節點的類的實現大體類似,這些類都易於直接編寫。
直譯器模式的不足之處在於,直譯器模式為文法中的每一條規則至少定義了一個類,因此包含許多規則的文法可能難以管理和維護。