美文网首页
解释器模式(为语言创建解释器)

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

作者: 钉某人 | 来源:发表于2017-11-18 21:57 被阅读0次
    源码地址 https://github.com/DingMouRen/DesignPattern
    解释器模式.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()+"");
        }
    
    总结

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

    相关文章

      网友评论

          本文标题:解释器模式(为语言创建解释器)

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