美文网首页设计模式
解释器模式(Interpreter)

解释器模式(Interpreter)

作者: 秀儿2020 | 来源:发表于2020-07-24 11:19 被阅读0次

定义

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

本质

分离实现,解释执行。

解释器模式使用解释器对象来表示和处理相应的语法规则,一般一个解释器处理一条语法规则。

只要能用解释器对象把符合语法的表达式表示出来,而且能够抽象成语法树,那都可以用解释器模式来处理。

登场角色

  • AbstractExpression(抽象表达式)

    定义了语法树节点的共同接口

  • TerminalExpression(终结表达式)

    用来实现语法规则中和终结符相关的操作。

  • NonterminalExpression(非终结符表达式)

    用来实现语法规则中非终结符相关的操作

  • Context(文脉、上下文)

    包含各个解释器需要的数据伙食公共的功能。

  • Client(请求者)

    使用解释器的客户端。

示例代码

/**
 * 抽象的算数运算解释器
 */
public abstract class ArithmeticExpression {
    public abstract int interpret();
}

/**
 * 数字解释器
 */
public class NumExpression extends ArithmeticExpression{
    private int num;

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

    @Override
    public int interpret() {
        return num;
    }
}


/**
 * 运算符号抽象解释器
 */
public abstract class OperatorExpression extends ArithmeticExpression{
    public ArithmeticExpression exp1,exp2;

    public OperatorExpression(ArithmeticExpression exp1, ArithmeticExpression exp2) {
        this.exp1 = exp1;
        this.exp2 = exp2;
    }
}


/**
 * 加法运算抽象解释器
 */
public class AdditionExpression extends OperatorExpression{
    public AdditionExpression(ArithmeticExpression exp1, ArithmeticExpression exp2) {
        super(exp1, exp2);
    }

    @Override
    public int interpret() {
        return exp1.interpret() + exp2.interpret();
    }
}


public class Calculator {
    //申明栈存储并操作所有相关的解释器
    private Stack<ArithmeticExpression> mExpStack = new Stack<>();
    public Calculator(String expression){
        ArithmeticExpression exp1,exp2;
        String[] elements = expression.split(" ");
        //循环遍历表达式元素数组
        for(int i=0;i<elements.length;i++){
            switch (elements[i].charAt(0)){
                case '+':
                    ///将栈中的解释器弹出作为运算符号左边的解释器
                    exp1 = mExpStack.pop();
                    //
                    exp2 = new NumExpression(Integer.valueOf(elements[++i]));

                    mExpStack.push(new AdditionExpression(exp1,exp2));
                    break;
                default:
                    mExpStack.push(new NumExpression(Integer.valueOf(elements[i])));
                    break;
            }
        }
    }

    public int calculate(){
        return mExpStack.pop().interpret();
    }
}


public class Client {
    public static void main(String[] args){
        Calculator c = new Calculator("1 + 2 + 3 + 4");
        System.out.println(c.calculate());
    }
}

运行结果

10

优点

  • 易于实现语法。在解释器模式中,一条语法规则用一个解释器对象来解释执行。对于解释器的实现来讲,功能就变得比较简单,只需要考虑这一条语法规则的实现就可以了, 其他的不用管。
  • 易于扩展新的语法。
  • 正是由于采用一个解释器对象负责一条语法规则的方式,使得扩展新的语法非常容易。扩展了新的语法,只需要创建相应的解释器对象,在创建抽象语法树的时候使用这个新的解释器对象就可以了。

缺点

  • 不适合复杂的语法。

相关文章

网友评论

    本文标题:解释器模式(Interpreter)

    本文链接:https://www.haomeiwen.com/subject/xxljlktx.html