Skip to content

解释器模式是 23 种里最冷门的一个:为一种语言/文法定义解释器,解析并执行表达式。正则引擎、计算器就是它的思想来源。这篇简单介绍它是什么、以及为什么实际很少手写。

一、解决什么问题:解析和执行一种"语言"

有些场景需要解析一种特定的表达式/语法,比如计算 1 + 2 * 3、匹配正则、解析配置文件格式。

解释器模式:把语法规则拆成一个个"表达式类",每个类负责解释一部分语法,组合起来解析整句

二、核心结构(简单计算器)

java
// 抽象表达式:每个表达式都能"解释"出一个结果
interface Expression {
    int interpret();
}

// 终结符表达式:数字
class NumberExpression implements Expression {
    private int number;
    NumberExpression(int n) { this.number = n; }
    public int interpret() { return number; }
}

// 非终结符表达式:加法(组合两个子表达式)
class AddExpression implements Expression {
    private Expression left, right;
    AddExpression(Expression l, Expression r) { left = l; right = r; }
    public int interpret() { return left.interpret() + right.interpret(); }
}

// 使用:1 + 2 = 3
Expression expr = new AddExpression(new NumberExpression(1), new NumberExpression(2));
expr.interpret();   // 3

关键:每个语法规则是一个类(数字、加法、减法……),用"组合"的方式拼出整句表达式,递归解释。

三、为什么实际很少手写

解释器模式有个致命缺点:语法规则一多,类就爆炸(每个规则一个类),且手写的解释器性能差、难维护。

所以实际中,解析表达式/语法基本都用现成的工具

  • 正则表达式Pattern/Matcher,Java 内置的解释器
  • 表达式计算:SpEL(Spring 表达式)、Aviator、QLExpress 等现成引擎
  • 配置文件解析:用 JSON/YAML 库,而不是手写解释器

四、实际应用

解释器模式本身很少手写,但它的思想到处都是:正则引擎、SQL 解析、SpEL、模板引擎(Thymeleaf 解析模板表达式)。

小结

  • 解释器为语法规则定义"表达式类",组合起来解析执行
  • 缺点:规则多则类爆炸,实际很少手写
  • 思想落地:正则、SpEL、模板引擎都是现成的"解释器"

相关:23 种里最冷门,实际用现成引擎即可,了解思想就够。