解释器模式:语法规则也是类

发布时间 2023-06-13 17:14:39作者: 穆海如枫

解释器模式是一种行为型设计模式,它定义了一种语言并解析该语言中的表达式。这种模式用于将一个表达式文法表示成一个抽象语法树,从而使得我们可以通过对语法树进行遍历来解释整个表达式。

在解释器模式中,包含以下几个角色:

  • 抽象表达式(AbstractExpression):定义了一个抽象的解释操作,具体的终结符和非终结符都要实现这个接口。
  • 终结符表达式(TerminalExpression):实现了抽象表达式接口的终结符表达式,用来实现语法规则中的终结符。
  • 非终结符表达式(NonterminalExpression):实现了抽象表达式接口的非终结符表达式,用来实现语法规则中的非终结符。
  • 环境类(Context):包含解释器需要的信息,通常以 Map 或者 List 的形式存在。

下面是一个简单的示例代码,演示了如何使用解释器模式来解析加减法表达式:

// 抽象表达式
interface Expression {
    int interpret(Context context);
}

// 终结符表达式
class Number implements Expression {
    private int number;

    public Number(int number) {
        this.number = number;
    }

    @Override
    public int interpret(Context context) {
        return number;
    }
}

// 非终结符表达式
class Plus implements Expression {
    private Expression leftExpression;
    private Expression rightExpression;

    public Plus(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }

    @Override
    public int interpret(Context context) {
        return leftExpression.interpret(context) + rightExpression.interpret(context);
    }
}

class Minus implements Expression {
    private Expression leftExpression;
    private Expression rightExpression;

    public Minus(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }

    @Override
    public int interpret(Context context) {
        return leftExpression.interpret(context) - rightExpression.interpret(context);
    }
}

// 环境类
class Context {
    private Map<String, Integer> variables = new HashMap<>();

    public void assign(String variable, int value) {
        variables.put(variable, value);
    }

    public int getValue(String variable) {
        Integer value = variables.get(variable);
        if (value == null) {
            return 0;
        }
        return value;
    }
}

// 测试代码
public class InterpreterTest {
    public static void main(String[] args) {
        // a + b - c 表达式
        Context context = new Context();
        context.assign("a", 5);
        context.assign("b", 3);
        context.assign("c", 2);

        Expression expression = new Minus(
                new Plus(new Number(1), new Number(1)),
                new Number(2)
        );
        int result = expression.interpret(context);
        System.out.println(result); // 输出 0
    }
}

在上面的代码中,我们定义了抽象表达式 Expression 和两个具体的终结符表达式 Number 和非终结符表达式 PlusMinus。我们还定义了一个环境类 Context,用于保存变量和变量的值。

在测试代码中,我们创建了一个 Context 对象,并向其中添加了三个变量及其对应的值。然后,我们使用解释器模式来解析加减法表达式 1 + 1 - 2,并输出结果。

需要注意的是,本例子只是解释器模式的简单示例,并没有完全涵盖所有可能性。在实际应用中,您可能需要根据自己的需求进行一些调整和扩展。