📜  设计模式-解释器模式(1)

📅  最后修改于: 2023-12-03 15:28:08.763000             🧑  作者: Mango

设计模式-解释器模式

简介

解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了一种语言并定义它的文法表示,使用该文法解释一些句子,它可以用来实现编译器、表达式计算等应用。

模式结构

解释器模式包含以下组件:

  • 抽象表达式(Abstract Expression):定义一个接口,用于解释上下文中的语句。
  • 终结符表达式(Terminal Expression):实现抽象表达式的接口,用于解释一个终结符。
  • 非终结符表达式(Nonterminal Expression):实现抽象表达式的接口,用于解释一个非终结符。
  • 上下文(Context):包含解释器需要的一些全局信息。
  • 客户端(Client):在运行时构建表示语法规则的抽象语法树,并调用解释操作。
示例代码

以下示例代码演示了如何使用解释器模式解释一个简单的加减乘除表达式:

from abc import ABC, abstractmethod


class Context:
    def __init__(self):
        self.variable_values = {}


class AbstractExpression(ABC):
    @abstractmethod
    def interpret(self, context: Context):
        pass


class TerminalExpression(AbstractExpression):
    def __init__(self, variable):
        self.variable = variable

    def interpret(self, context: Context):
        if self.variable not in context.variable_values:
            value = input(f"输入 {self.variable} 的值:")
            context.variable_values[self.variable] = int(value)
        return context.variable_values[self.variable]


class NonterminalExpression(AbstractExpression):
    def __init__(self, operator, left_expression, right_expression):
        self.operator = operator
        self.left_expression = left_expression
        self.right_expression = right_expression

    def interpret(self, context: Context):
        left_value = self.left_expression.interpret(context)
        right_value = self.right_expression.interpret(context)
        if self.operator == "+":
            return left_value + right_value
        elif self.operator == "-":
            return left_value - right_value
        elif self.operator == "*":
            return left_value * right_value
        elif self.operator == "/":
            return left_value / right_value


if __name__ == "__main__":
    context = Context()
    a = TerminalExpression("a")
    b = TerminalExpression("b")
    c = TerminalExpression("c")
    d = TerminalExpression("d")
    expression = NonterminalExpression("-",
                                       NonterminalExpression("+", a, b),
                                       NonterminalExpression("*", c, d))
    print(f"结果:{expression.interpret(context)}")

上述代码定义了 Context 类,用于存储表达式中的变量值;AbstractExpression 抽象类,定义了解释器需要实现的 interpreter 方法;TerminalExpressionNonterminalExpression 分别实现了终结符和非终结符的解释方法;客户端代码则可通过创建终结符和非终结符来构建整个表达式并计算其结果。