美文网首页
设计模式(python实现)--解释器模式(Interprete

设计模式(python实现)--解释器模式(Interprete

作者: 远行_2a22 | 来源:发表于2020-02-01 12:01 被阅读0次

    Interpreter

    动机(Motivation)

    • 如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。
    • 在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。

    模式定义

    给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。
    ——《设计模式》GoF

    要点总结

    • Interpreter模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的结构不断重复出现,
      并且容易抽象为语法规则的问题”才适合使用Interpreter模式。
    • 使用Interpreter模式来表示文法规则,从而可以使用面向对象技巧来方便地“扩展”文法。
    • Interpreter模式适合简单的文法表示,对于复杂的文法表示需要求助语法分析器标准工具。

    例子

    # -*- coding:utf-8 -*-
    
    
    class Expression(object):
    
        def interpreter(self, key, value):
            pass
    
    
    class VarExpression(Expression):
        def __init__(self, key):
            self.key = key
    
        def interpreter(self, var_map):
            return var_map.get(self.key)
    
    class SymbolExpression(Expression):
        def __init__(self, left, right):
            self.left, self.right = left, right
    
    
    # 加法运算
    class AddExpression(SymbolExpression):
        def interpreter(self, var_map):
            result = self.left.interpreter(var_map) + self.right.interpreter(var_map)
            return result
    
    
    # 加法运算
    class SubExpression(SymbolExpression):
        def interpreter(self, var_map):
            result = self.left.interpreter(var_map) - self.right.interpreter(var_map)
            return result
    
    def analyse(exp_str):
        exp_stack = []
        #for i in range(len(exp_str)):
        i = 0
        while i < len(exp_str):
            if exp_str[i] == '+':
                left = exp_stack[-1]
                i += 1
                right = VarExpression(exp_str[i])
                exp_stack.append(AddExpression(left, right))
            elif exp_str[i] == '-':
                left = exp_stack[-1]
                i += 1
                right = VarExpression(exp_str[i])
                exp_stack.append(SubExpression(left, right))
            else:
                # 变量表达式
                exp_stack.append(VarExpression(exp_str[i]))
    
            print('exp_str[i]:', exp_str[i])
            i += 1
        return exp_stack[-1]
    
    
    if __name__ == '__main__':
    
        expStr = "a+b-c+d-e"
        var_map = {'a': 5, 'b': 2, 'c': 1, 'd': 6, 'e': 10}
    
        expression = analyse(expStr)
    
        result = expression.interpreter(var_map)
        print('result:', result)
    

    例子中将简单的四则运算作为了一个解释器,当该运算频繁出现的时候,直接调用解释器即可获得结果。

    相关文章

      网友评论

          本文标题:设计模式(python实现)--解释器模式(Interprete

          本文链接:https://www.haomeiwen.com/subject/huogthtx.html