這是大話設計模式中的直譯器模式的c++版本
/*
* interpretr.cpp
* * created on: oct 26, 2017
* author: [email protected]
* 直譯器模式:給定乙個語言,定義它的文法的一種表示,
* 並定義乙個直譯器,這個直譯器用該表示
* 來解釋語言中的句子。
*/#include
#include
#include
#include
using
namespace
std;
//string 轉 int
int toint(const
std::string str)
/*按照關鍵字拆分字串
* 引數:1.源字串 2.拆分的關鍵字 3.存放拆分出來的字串
* 返回值:拆分後剩下的字串
* */
string splitex(string src,string separate_character,string &single_str)
else
return src.substr(lastposition);
// cout<<"src.substr(lastposition) = "<}
map getsound()
class playcontext
void settext(string text)
private:
string _text;
};//表示式類
class expression
virtual ~expression(){}
void interpret(playcontext* context)
else
}//抽象執行方法
virtual
void excute(string key,int value)=0;
};//音符類
class note:public expression
}cout
<" ";
}};class scale:public expression
cout
<" ";
}};class speed:public expression
};int main()
}//當字段為o時初始化為音節,其他化為音符
switch(option)
//執行操作
expression->interpret(context);
}cout
0;}
執行結果:
clh@clh
:~/testcode/設計模式$ g++ interpretr.cpp -std=c++11 -g
clh@clh
:~/testcode/設計模式$ ./a.out
上海灘中速 中音 356
3523
56 高音 1 中音 651
32
以下內容摘抄自設計模式。
直譯器模式的適用性:
1.該文法相對簡單,文法的類層次變得龐大而無法管理。此時語法分析程式這樣的工具是更好的選擇。它們無需構建抽象語法樹即可解釋表示式。可節省空間與時間。
2.效率不是乙個關鍵問題。
直譯器模式的優點:
1.易於改變和擴充套件文法 因為該模式使用類來表示文法規則,你可以使用繼承來改變或擴充套件該文法。已有的表示式可被增量式地改變,而新的表示式可以定義為舊的表示式的變體。
2.易於實現文法 定義抽象語法樹中各個節點的類的實現大體類似。這些類易於直接編寫,通常它們也可用乙個編譯器或語法分析生成器生成。
3.增加了新的解釋表示式的方式 直譯器模式使得實現新表示式「計算」變得更容易。
直譯器模式的缺點:
1.複雜的文法難以維護 直譯器模式為文法中的每一條規則至少定義了乙個類。因此包含許多規則的文法可能難以管理和維護。
直譯器模式
include include include include include using namespace std 直譯器模式 給定一種語言,定義它的文法的一種表示,並定義乙個直譯器 該直譯器使用該表示來解釋語言中的句子 類似於程式語言或者指令碼 假設情景是乙個指令碼控制系統 wasd上下左右方...
直譯器模式
1 模式定義 直譯器模式 interpreter pattern 定義語言的文法,並且建立乙個直譯器來解釋該語言中的句子,這裡的 語言 意思是使用規定格式和語法的 它是一種類行為型模式。2 模式結構 直譯器模式包含如下角色 abstractexpression 抽象表示式 terminalexpre...
直譯器模式
給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。要解決的問題 如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構造乙個直譯器,該直譯器通過解釋這些句子來解決該問題。的好處 當有乙個語言需要解...