Chapter27 直譯器模式

2022-08-13 04:27:18 字數 3173 閱讀 8337

直譯器模式(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上下左右方...