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

2020-02-01  本文已影响0人  远行_2a22

Interpreter

动机(Motivation)

模式定义

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

要点总结

例子

# -*- 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)

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

上一篇 下一篇

猜你喜欢

热点阅读