美文网首页
设计模式(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