【每日一记】设计模式——解释器模式

本文详细介绍了解释器模式的概念及其应用场景,通过实现一个简单的解释器,展示了如何定义语言的文法并构建解释器来解析该语言中的句子。文章还讨论了模式的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

  • 定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子
  • 适用场景:
    1. 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树
    2. 一些重复出现的问题可以用一种简单的语言来进行表达
    3. 一个简单语法需要解释的场景

实现

// 表达式接口
public interface Expression {
    boolean interpret(Context ctx);
}

// 与
public class And implements Expression {
    private Expression left;
    private Expression right;

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

    @Override
    public boolean interpret(Context ctx) {
        return left.interpret(ctx) && right.interpret(ctx);
    }

    @Override
    public String toString() {
        return "(" + left.toString() + " && " + right.toString() + ")";
    }

}

// 或
public class Or implements Expression {
    private Expression left;
    private Expression right;

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

    @Override
    public boolean interpret(Context ctx) {
        return left.interpret(ctx) || right.interpret(ctx);
    }

    @Override
    public String toString() {
        return "(" + left.toString() + " || " + right.toString() + ")";
    }

}

// 非
public class Not implements Expression {
    private Expression ex;

    public Not(Expression ex) {
        this.ex = ex;
    }

    @Override
    public boolean interpret(Context ctx) {
        return !ex.interpret(ctx);
    }

    @Override
    public String toString() {
        return "!(" + ex + ")";
    }

}

// 变量
public class Variable implements Expression {
    private String name;

    public Variable(String name) {
        this.name = name;
    }

    @Override
    public boolean interpret(Context ctx) {
        return ctx.lookup(this);
    }

    @Override
    public int hashCode() {
        return toString().hashCode();
    }

    @Override
    public boolean equals(Object o) {
        if (o != null && o instanceof Variable) {
            return this.name.equals(((Variable) o).name);
        }
        return false;
    }

    @Override
    public String toString() {
        return name;
    }

}

// 常量
public class Constant implements Expression {
    private boolean b;

    public Constant(boolean b) {
        this.b = b;
    }

    @Override
    public boolean interpret(Context ctx) {
        return b;
    }

    @Override
    public String toString() {
        return String.valueOf(b);
    }

}
// 上下文,存储变量
public class Context {
    private Map<Variable, Boolean> m = new HashMap<>();

    public void assign(Variable var, boolean value) {
        m.put(var, new Boolean(value));
    }

    public boolean lookup(Variable var) {
        return m.get(var);
    }
}
// 客户端
public class Client {
    public static void main(String[] args) throws Exception {
        Context ctx = new Context();
        Variable a = new Variable("a");
        Variable b = new Variable("b");
        ctx.assign(a, true);
        ctx.assign(b, false);
        Constant c1 = new Constant(true);
        Constant c2 = new Constant(false);
        Expression ex = new Or(new And(a, new And(c2, b)), new Not(c1));
        System.out.println(ex);
        System.out.println(ex.interpret(ctx));
    }
}

输出结果
((a && (false && b)) || !(true))
false

解释器模式带来了良好的扩展性,修改语法规则只要修改相应的非终结符表达式,若扩展语法,则只需增加非终结符类,但是由于大量的循环和递归可能会引发一定的效率问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值