设计模式解释器模式(InterpreterPattern)

核心模块:抽象表达符、非终结表达符、终结表达符、环境类

所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git

使用场景:正则表达式,自定义语言,计算器;
优点:易于扩展,增加新的符号只用增加新的表达式即可;
缺点:复杂的文法难以维护, 存在大量循环和递归操作,复杂的句子,速度很慢
注意:

1,每一个非终结符号都对应一个非终结表达式;


/**
 * Created by tory on 2017/12/7.
 * //解释器模式,
 * 1,来解释该语言中的句子
 * 使用场景:1,正则表达式,2,计算器,3,自定义语言
 * 2,每一个非终结符都有一个具体的非终结表达式与之相对
 */
public class InterpreterPattern {
    public static void main(String[] args) {
        String express = "3 + 2 - 5 / 6";
        int val = new Calculator().build(express).compute();
        System.out.println("out->"+val);
    }

}

//Context 环境类
class Calculator {
    //环境类里面要么是map要么是stack之类的存放表达式的容器
    Expression expression = null;

    Calculator build(String expStr) {
        String[] expArry = expStr.split(" ");
        Stack<Expression> stack = new Stack<>();
        Expression left = null;
        Expression right = null;
        for (int iLoop = 0; iLoop < expArry.length; iLoop++) {
            switch (expArry[iLoop]) {
                //处理各个非终结符,都有一个对应的非终结表达式
                case "+":
                    left = stack.pop();
                    right = new ValExpression(Integer.parseInt(expArry[++iLoop]));
                    stack.push(new AddExpression(left, right));
                    break;
                case "-":
                    left = stack.pop();
                    right = new ValExpression(Integer.parseInt(expArry[++iLoop]));
                    stack.push(new SubExpression(left, right));
                    break;
                case "*":
                    left = stack.pop();
                    right = new ValExpression(Integer.parseInt(expArry[++iLoop]));
                    stack.push(new MulExpression(left, right));
                    break;
                case "/":
                    left = stack.pop();
                    right = new ValExpression(Integer.parseInt(expArry[++iLoop]));
                    stack.push(new DivExpression(left, right));
                    break;
                case "%":
                    left = stack.pop();
                    right = new ValExpression(Integer.parseInt(expArry[++iLoop]));
                    stack.push(new ModExpression(left, right));
                    break;
                default:
                    stack.push(new ValExpression(Integer.parseInt(expArry[iLoop])));
                    break;
            }
        }
        expression = stack.pop();
        return this;
    }

    int compute() {
        if (null != expression) {
            return expression.interpreter();
        }

        return Integer.MIN_VALUE;
    }
}

//Expression抽象表示符
interface Expression {
    int interpreter();
}

//SymbleExpression符号表示符,非终结表示符
abstract class SymbleExpression implements Expression {
    Expression left;
    Expression right;

    SymbleExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }
}

//TerminalExpression 终结表示符
class ValExpression implements Expression {
    int val;

    ValExpression(int val) {
        this.val = val;
    }

    @Override
    public int interpreter() {
        return val;
    }
}

//具体的非终结表示符+
class AddExpression extends SymbleExpression {
    AddExpression(Expression left, Expression right) {
        super(left, right);
    }

    @Override
    public int interpreter() {
        return left.interpreter() + right.interpreter();
    }
}

//具体的非终结表示符-
class SubExpression extends SymbleExpression {
    SubExpression(Expression left, Expression right) {
        super(left, right);
    }

    @Override
    public int interpreter() {
        return left.interpreter() - right.interpreter();
    }
}

//具体的非终结表示符*
class MulExpression extends SymbleExpression {
    MulExpression(Expression left, Expression right) {
        super(left, right);
    }

    @Override
    public int interpreter() {
        return left.interpreter() * right.interpreter();
    }
}

//具体的非终结表示符/
class DivExpression extends SymbleExpression {
    DivExpression(Expression left, Expression right) {
        super(left, right);
    }

    @Override
    public int interpreter() {
        return left.interpreter() / right.interpreter();
    }
}

//具体的非终结表示符%
class ModExpression extends SymbleExpression {
    ModExpression(Expression left, Expression right) {
        super(left, right);
    }

    @Override
    public int interpreter() {
        return left.interpreter() % right.interpreter();
    }
}


内容打印
Hello World!
out->6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值