zoukankan      html  css  js  c++  java
  • 解释器模式

    解释器模式

    一、简介

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

    该模式涉及的编程语言理论知识较多,实际运用并不常见。主要用在 SQL 解析、符号处理引擎等

    二、简单实现

    这里以对算数表达式的解释为例。

    //抽象解释器
    public abstract class ArithmeticExpression{
        public abstract int interpret();
    }
    
    //数字解释器
    public class NumberExpression extends ArithmeticExpression{
        private int num;
    
        public NumberExpression(int num) {
            this.num = num;
        }
    
        @Override
        public int interpret() {
            return num;
        }
    }
    //运算符抽象解释器
    public abstract class OperatorExpression extends ArithmeticExpression{
        protected ArithmeticExpression exp1,exp2;
    
        public OperatorExpression(ArithmeticExpression exp1, ArithmeticExpression exp2) {
            this.exp1 = exp1;
            this.exp2 = exp2;
        }
    }
    
    //加法解释器
    public class AddExpression extends OperatorExpression{
    
        public AddExpression(ArithmeticExpression exp1, ArithmeticExpression exp2) {
            super(exp1, exp2);
        }
    
        @Override
        public int interpret() {
            return exp1.interpret()+exp2.interpret();
        }
    }
    
    public class Calculator{
        private Stack<ArithmeticExpression> stack=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=stack.pop();
                        exp2=new NumberExpression(Integer.valueOf(elements[++i]));
                        stack.push(new AddExpression(exp1,exp2));
                        break;
                    default:
                        stack.push(new NumberExpression(Integer.valueOf(elements[i])));
                        break;
                }
            }
        }
        
        public int calculate(){
            return stack.pop().interpret();
        }
    }
    
  • 相关阅读:
    docker 容器管理常用命令
    第一章 入门示例
    rsyslog 日志服务器端配置
    如何利用一个按钮绑定两个事件
    select下拉框有了空行怎么办
    如何设置select下拉禁止选择
    mysql utf8 中文
    数据化决策的魅力
    数据化决策的魅力
    minor.major version 详解
  • 原文地址:https://www.cnblogs.com/Robin132929/p/13794965.html
Copyright © 2011-2022 走看看