python设计模式之解释器模式

来源:互联网 发布:外国人来中国后被淘宝 编辑:程序博客网 时间:2024/06/06 01:12

python设计模式之解释器模式

意图

  • 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子

结构图

这里写图片描述

  • AbstractExpression, 定义解释器的接口,约定解释器的解释操作,其中的Interpret接口,正如其名字那样,它是专门用来解释该解释器所要实现的功能
  • TerminalExpression:终结符解释器,用来实现语法规则中和终结符相关的操作,不再包含其他的解释器,如果用组合模式来构建抽象语法树的话,就相当于组合模式中的叶子对象,可以有多种终结符解释器
  • NonterminalExpression:非终结符解释器,用来实现语法规则中非终结符相关的操作,通常一个解释器对应一个语法规则,可以包含其他解释器,如果用组合模式构建抽象语法树的话,就相当于组合模式中的组合对象。可以有多种非终结符解释器
  • Context:上下文,通常包含各个解释器需要的数据或是公共的功能。这个Context在解释器模式中起着非常重要的作用。一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。
  • Client:客户端,指的是使用解释器的客户端

适用性

  • 当一个语言需要解释执行,并可以将该语言中的句子表示为一个抽象语法树的时候,可以考虑使用解释器模式(如XML文档解释、正则表达式等领域)
  • 一些重复出现的问题可以用一种简单的语言来进行表达
  • 一个语言的文法较为简单.
  • 当执行效率不是关键和主要关心的问题时可考虑解释器模式

优点

  • 易于实现文法:在解释器模式中,一条语法规则用一个解释器对象来解释执行。对于解释器的实现来讲,功能就变得比较简单,只需要考虑这一条语法规则的实现就可以了,其他的都不用管。
  • 易于扩展新的语法。由于解释器采用类来描述语法规则,因此可以通过继承等机制创建相应的解释器对象,在创建抽象语法树的时候使用这个新的解释器对象就可以了

缺点

  • 执行效率较低。由于在解释器模式中使用了大量的循环和递归调用,因此在解释较为复杂的句子时其速度很慢,而且代码的调试过程也比较麻烦
  • 对于复杂文法难以维护。在解释器模式中,每一条规则至少需要定义一个类,因此如果一个语言包含太多文法规则,类的个数将会急剧增加,导致系统难以管理和维护,此时可以考虑使用语法分析程序等方式来取代解释器模式。

例子

class Context:    def __init__(self):        self.input = ""        self.output = ""class AbstractExpression:    def Interpret(self, context):        passclass 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)# 输出terminal interpretNonterminal interpretterminal interpretterminal interpret
原创粉丝点击