直譯器模式(interpreter),給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示解釋語言中的句子。
直譯器模式需要解決的是,如果乙個特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決問題。比如說正規表示式就是利用給直譯器來模式實現的。
通常當有乙個語言需要解釋執行,並且你可將改語言中的句子表示為乙個抽象語法樹時,可實用直譯器模式。
直譯器模式的好處是可以很容易地改變和擴充套件文法,因為該模式實用累的表示文法準則,你可實用繼承來改變或擴充套件該文法。也比較容易實現文法,因為定義抽象語法樹中的各個節點的類的實現大體類似。這些類都易於直接編寫。
直譯器的不足之處,直譯器模式為文法中的每一條規則至少定義了乙個類,因此包含許多規則的文法可能難以管理和維護。建議當文法非常複雜時,使用其他的技術如語法分析程式或編譯器生成器來處理。
具體解釋模式的內interpt的的細節可忽略,不同的直譯器為達到解釋的目的,要根據一定的規則進行解釋。具體規則與此設計模式無關。
//playcontext 類
#ifndef _playcontext_hpp
#define _playcontext_hpp#include
using
namespace
std;
class
playcontext
string
getcontext()
void setcontext(string
str)
private
:
string
context;
};#endif
//expression類
#ifndef _expression_hpp
#define _expression_hpp#include
"playcontext.hpp
"class
expression
else
}else
}virtual
void excute(string key, double value) = 0;};
#endif
//note類
#ifndef _note_hpp
#define _note_hpp#include
#include
"expression.hpp
"using
namespace
std;
class note : public
expression
else
if("
d" ==key)
else
if("
e" ==key)
else
if("
f" ==key)
else
if("
g" ==key)
else
if("
a" ==key)
else
if("
b" ==key)
else
cout
<< note << "";
}};#endif
//scale類
#ifndef _scale_hpp
#define _scale_hpp#include
#include
"expression.hpp
"using
namespace
std;
class scale : public
expression
cout
<< scale << "";
}};#endif
//myexception類,只是為了異常處理,與設計模式無關
#ifndef _myexception_hpp
#define _myexception_hpp#include
#include
#include
class myexception : public
std::exception
else
strcat(val,"'
");}
virtual
const
char*what()
private
:
char val[100
]; };
#endif
//執行結果如下:客戶端**
#include#include
"playcontext.hpp
"#include
"note.hpp
"#include
"scale.hpp
"#include
"myexception.hpp
"using
namespace
std;
intmain()
else
if("
c" == str || "
d" == str || "
e" == str || "
f" ==str
|| "
g" == str || "
a" == str || "
b" == str || "
p" ==str)
else
if(exp)}}
catch(myexception*e)
catch
(...)
getchar();
return0;
}
27 直譯器模式
給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這一就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。可以很容易的擴充套件和改變文法,因為該模...
設計模式 27 其實你不懂老闆的心 直譯器模式
直譯器模式 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋該語言中的句子。適用於 如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個實力表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器 該直譯器通過解釋這些句子來解決該問題。當有乙個語言需要解...
直譯器模式
include include include include include using namespace std 直譯器模式 給定一種語言,定義它的文法的一種表示,並定義乙個直譯器 該直譯器使用該表示來解釋語言中的句子 類似於程式語言或者指令碼 假設情景是乙個指令碼控制系統 wasd上下左右方...