1. 程式人生 > >設計模式學習筆記(C++實現)(十六)--直譯器模式

設計模式學習筆記(C++實現)(十六)--直譯器模式

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.《設計模式:可複用面向物件軟體的基礎》