解释器模式(为语言创建解释器)

源码地址 https://github.com/DingMouRen/DesignPattern
解释器模式(为语言创建解释器)_第1张图片
解释器模式.png
  • AbstractExperssion 抽象表达式。声明一个抽象的解释操作父类,并定义一个抽象的解释方法,其具体的实现在各个具体的子类解释器中完成。
  • TerminalExpression 终结符表达式。实现文法中与终结符有关的解释器操作。文法中每一个终结符都有一个具体的终结表达式与之对应。
  • NoterminalExpression 非终结符表达式。实现文法中与非终结符有关的解释器操作。
  • Context 上下文环境类 。包含解释器之外的全局信息
定义

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

使用场景

当一个语言需要解释执行,并且可将该语言中的句子表示为一个抽象语法树,可使用解释器模式。

举个例子

算术表达式就是一种文法,我们可以对算术表达式进行解释。例子中没有使用Context类存储全局信息,这里直接使用了。

//抽象解释器 对应AbstractExpression
public abstract class ArithmetExpression {
    //抽象的解析方法
    public abstract int interpret();
}
//具体解释器:数字解释器-》目的是为了解释数字
public class NumExpression extends ArithmetExpression {
   private int num;

    public NumExpression(int num) {
        this.num = num;
    }

    @Override
    public int interpret() {
        return num;

    }
}
//抽象解释器:运算符号的抽象解释器
public class OperatorExpression extends ArithmetExpression {
    //声明两个成员变量并存储运算符号两边的数字解释器
   protected ArithmetExpression expression1,expression2;

    public OperatorExpression(ArithmetExpression expression1, ArithmetExpression expression2) {
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

    @Override
    public int interpret() {
        return 0;
    }
}
//具体解释器:加法运算解释器
public class AdditionExpression extends OperatorExpression {
    public AdditionExpression(ArithmetExpression expression1, ArithmetExpression expression2) {
        super(expression1, expression2);
    }

    @Override
    public int interpret() {
        return expression1.interpret() + expression2.interpret();
    }
}

使用
public static void main(String[] args) {
        Calculator calculator = new Calculator("1 + 1 + 1 - 2");
        System.out.println(calculator.calulate()+"");
    }
总结

解释器模式可以很灵活的对文法规则进行扩展,增加相应的解释器,但是对于过于复杂的语法,会生成大量的类,后期会很难维护,所以解释器模式不适合复杂文法的实现。

你可能感兴趣的:(解释器模式(为语言创建解释器))