github地址:https://github.com/cheesezh/python_design_patternspython
解释器模式,给定一个语言,定一个它的文法的一种表示,并定一个一个解释器,这个解释器使用该表示来解释语言中的橘子。git
解释其模式须要解决的是,若是一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的橘子。这样就能够构建一个解释器,该解释器经过解释这些橘子来解决该问题。github
好比说,咱们经常会在字符串中搜索匹配的字符或者判断一个字符串是否符合咱们的规定格式,此时咱们通常会用正则表达式技术。由于匹配字符串的需求在不少地方都会用到,并且行为相似,与其为每个特定需求都写一个算法函数,不如使用一种通用的搜索算法来解释执行一个正则表达式,该正则表达式定义了待匹配字符串的集合。正则表达式
正则表达式就是解释器模式的一种用用,解释器为正则表达式定义了一个文法,如何表示一个特定的正则表达式,以及如何解释这个正则表达式。算法
解释器模式主要包含如下几个类:app
from abc import ABCMeta, abstractmethod class AbstractExpression(): """ 抽象表达式类,声明一个抽象的解释操做,这个接口为抽象语法树中全部的节点所共享 """ __metaclass__ = ABCMeta @abstractmethod def interpret(self, context): pass class TerminalExpression(AbstractExpression): """ 终结符表达式,实现与文法中的终结符相关联的解释操做。实现抽象表达式中所要求的接口,主要是一个interpret()方法。 文法中的每个终结符都有一个具体终结符表达式与之相对应。 """ def interpret(self, context): print("终结符表达式") class NontermialExpression(AbstractExpression): """ 非终结符表达式,为文法中的非终结符实现解释操做。对文法中每一条规则R1,R2,...Rn都须要一个具体的非终结符表达式类。 经过实现抽闲表达式的interpret()方法实现解释操做。解释操做以递归的方式调用上 main所提到的表明R1,R2,...Rn中各 个符号的实例变量。 """ def interpret(self, context): print("非终结符表达式") class Context(): """ 上下文类,包含解释器以外的一些全局信息 """ def __init__(self): self.input = None self.output = None def main(): """ 客户端代码,构建表示该文法定义的语言中一个特定的句子的抽象语法树。 """ context = Context() exp_list = [] exp_list.append(TerminalExpression()) exp_list.append(NontermialExpression()) exp_list.append(TerminalExpression()) exp_list.append(NontermialExpression()) for exp in exp_list: exp.interpret(context) main()
终结符表达式 非终结符表达式 终结符表达式 非终结符表达式
当有一个语言须要解释执行,而且你可将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式[DP]。函数
用了解释器模式,就意味着能够很容易的改变和扩展文法,由于该模式使用类来表示文法规则,你可使用继承来改变或扩展该文法。也比较容易实现文法,由于定义抽象语法树中各个节点的类的实现大致相似,这些类都易于直接便携。code
解释器模式也有不足,解释器模式为文法中每一条规则至少定义了一个类,所以包含许多规则的文法可能难以管理和维护。建议当文法很是复杂时,使用其余技术,如语法分析程序或者编译器生成器来处理[DP]。继承