思想:解釋腳本語言
意圖:
給定一個語言扒接,定義它的文法的一種表示,并定義一個解釋器们衙,這個解釋器使用該表示來解釋語言中的句子钾怔。
適用性:
當有一個語言需要解釋執(zhí)行, 并且你可將該語言中的句子表示為一個抽象語法樹時,可使用解釋器模式蒙挑。而當存在以下情況時該模式效果最好:
該文法簡單,對于復(fù)雜的文法, 文法的類層次變得龐大而無法管理宗侦。此時語法分析程序生成器這樣的工具是更好的選擇。它們無需構(gòu)建抽象語法樹即可解釋表達式, 這樣可以節(jié)省空間而且還可能節(jié)省時間忆蚀。
效率不是一個關(guān)鍵問題最高效的解釋器通常不是通過直接解釋語法分析樹實現(xiàn)的, 而是首先將它們轉(zhuǎn)換成另一種形式凝垛。例如,正則表達式通常被轉(zhuǎn)換成狀態(tài)機蜓谋。但即使在這種情況下, 轉(zhuǎn)換器仍可用解釋器模式實現(xiàn), 該模式仍是有用的。
案例一
'''
Interpreter
'''
class Context:
def __init__(self):
self.input=""
self.output=""
class AbstractExpression:
def Interpret(self,context):
pass
class Expression(AbstractExpression):
def Interpret(self,context):
print ("terminal interpret")
class NonterminalExpression(AbstractExpression):
def Interpret(self,context):
print ("Nonterminal interpret")
if __name__ == "__main__":
context= ""
c = []
c = c + [Expression()]
c = c + [NonterminalExpression()]
c = c + [Expression()]
c = c + [Expression()]
for a in c:
a.Interpret(context)
運行結(jié)果:
'''
terminal interpret
Nonterminal interpret
terminal interpret
terminal interpret
'''
案例二:解釋一段字符串描述的行為
'''Interpreter'''
class FullExpression:
# 將需要解釋的字符串傳入
def interpreter(self,str):
# 通過空格拆分字符串
strs = str.split(' ')
if strs[0]=='move':
print("向%s方向移動了%s步"%(strs[1],strs[2]))
elif strs[0]=='turn':
print("向%s方向旋轉(zhuǎn)了%s °"%(strs[1],strs[2]))
str='move X 6'
str2= 'turn P 50'
full_expression=FullExpression()
full_expression.interpreter(str)
full_expression.interpreter(str2)
'''
運行結(jié)果:
向X方向移動了6步
向P方向旋轉(zhuǎn)了50 °
'''