設計模式學習筆記(C++實現)(十六)--直譯器模式
阿新 • • 發佈:2019-02-16
1.直譯器模式簡介
- 英文名稱
Interpreter - 主要目的
給定一種語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子。 - 使用場景
當有一種語言需要解釋執行,並且你可以將該語言中的句子表示為一個抽象語法樹時,最適合使用直譯器模式。
2.直譯器模式程式碼示例
- 測試平臺
1.開發語言:C++
2.開發工具:VS2015
3.作業系統:Win7 X64 程式碼說明
1.AbstractExpression–抽象表示式類,定義抽象介面;
2.TerminalExpression–終結符表示式類,具體表達式類,本例中表示大寫數字的結尾;
3.NonterminalExpression_Num、NonterminalExpression_Unit–非終結符表示式類,具體表達式類。在本例中分別用來表示實際大寫數字和具體的單位。注意:
1.本例用直譯器模式來實現報銷時的大寫數字的轉換;
2.通過定義相應的終結符、數字表達式類及單位表示式類,可以實現小寫數字到大寫數字的轉換。具體程式碼
#include <iostream>
#include <list>
using namespace std;
//抽象表示式,宣告一個抽象的解釋操作。這個介面為抽象語法樹種所有的節點所共享
class AbstractExpression
{
public:
//函式功能:建構函式
//引數: int num[IN] -- 具體數字
//返回值: 無
AbstractExpression(int num) :m_Num(num) {}
//函式功能:解釋抽象表示式的含義
//引數: 無
//返回值: 無
virtual void Interpret() = 0;
protected:
int m_Num; //數字
};
//TerminalExpression(終結符表示式),實現與文法中的終結符相關聯的解釋操作,本例中表示大寫數字的結尾
class TerminalExpression :public AbstractExpression
{
public :
//函式功能:建構函式
//引數: int num[IN] -- 具體數字
//返回值: 無
TerminalExpression(int num):AbstractExpression(num)
{}
//函式功能:解釋抽象表示式的含義
//引數: 無
//返回值: 無
void Interpret()
{
cout << "元整" << endl;
}
};
//數字類,非終結符直譯器,用來表示具體的大寫數字
class NonterminalExpression_Num :public AbstractExpression
{
public:
//函式功能:建構函式
//引數: int num[IN] -- 具體數字
//返回值: 無
NonterminalExpression_Num(int num):
AbstractExpression(num) {}
//函式功能:解釋抽象表示式的含義
//引數: 無
//返回值: 無
void Interpret()
{
switch (this->m_Num)
{
case 0:
cout << "零";
break;
case 1:
cout << "壹";
break;
case 2:
cout << "貳";
break;
case 3:
cout << "叄";
break;
case 4:
cout << "肆";
break;
case 5:
cout << "伍";
break;
case 6:
cout << "陸";
break;
case 7:
cout << "柒";
break;
case 8:
cout << "捌";
break;
case 9:
cout << "玖";
break;
}
}
};
//單位類,非終結符直譯器,用來表示具體的大寫數字單位
class NonterminalExpression_Unit :public AbstractExpression
{
public:
//函式功能:建構函式
//引數: int num[IN] -- 具體數字
//返回值: 無
NonterminalExpression_Unit(int num) :
AbstractExpression(num) {}
//函式功能:解釋抽象表示式的含義
//引數: 無
//返回值: 無
void Interpret()
{
switch (this->m_Num)
{
case 10:
cout << "拾";
break;
case 100:
cout << "佰";
break;
case 1000:
cout << "仟";
break;
}
}
};
int main()
{
list<AbstractExpression*> pressionList;
//將124從小寫字母,轉換為大寫字母
AbstractExpression* pExp1 = new NonterminalExpression_Num(1);
AbstractExpression* pExp2 = new NonterminalExpression_Unit(100);
AbstractExpression* pExp3 = new NonterminalExpression_Num(2);
AbstractExpression* pExp4 = new NonterminalExpression_Num(10);
AbstractExpression* pExp5 = new NonterminalExpression_Num(4);
AbstractExpression* pExp6 = new TerminalExpression(0);
pressionList.push_back(pExp1);
pressionList.push_back(pExp2);
pressionList.push_back(pExp3);
pressionList.push_back(pExp4);
pressionList.push_back(pExp5);
pressionList.push_back(pExp6);
cout << "124的大寫數字形式如下:" << endl;
for each (AbstractExpression* var in pressionList)
{
var->Interpret();
}
delete pExp1;
pExp1 = NULL;
delete pExp2;
pExp2 = NULL;
delete pExp3;
pExp3 = NULL;
delete pExp4;
pExp4 = NULL;
delete pExp5;
pExp5 = NULL;
delete pExp6;
pExp6 = NULL;
getchar();
return 0;
}
- 輸出結果
參考文獻:
1.《設計模式:可複用面向物件軟體的基礎》