3.3 解释器模式
解释器模式(Interpreter)为一种小语言定义文法,并实现一个解释器来求值它的句子。当你的程序需要反复处理某类结构化表达式——算术公式、布尔规则、查询条件、配置 DSL——解释器把每条文法规则映射成一个类,把句子解析成一棵抽象语法树,再递归求值。
下面的实验让你点击数字和运算符,拼出一个逆波兰(后缀)表达式,看解释器如何用一个栈一步步把它算出来。
正在加载交互实验...
文法即类
解释器的核心是把文法翻译成类层次:
java
interface Expr { boolean interpret(Map<String,Boolean> ctx); }
// 终结符表达式:变量
class Var implements Expr {
private String name;
public boolean interpret(Map<String,Boolean> ctx) { return ctx.get(name); }
}
// 非终结符表达式:组合
class And implements Expr {
private Expr left, right;
public boolean interpret(Map<String,Boolean> ctx) {
return left.interpret(ctx) && right.interpret(ctx); // 递归
}
}- 终结符表达式:文法的叶子,如变量、字面量。
- 非终结符表达式:组合多个子表达式,如
And、Or、Plus。
整个句子就是一棵表达式树,interpret(context) 自顶向下递归求值。下面的实验让你切换 And/Or 并改变变量取值,观察布尔表达式树的求值结果。
正在加载交互实验...
正在加载概念检查...
正在加载概念检查...
现实与边界
解释器在“规则引擎、模板语言、SQL/正则的简化子集、计算器”等场景里很自然。但要清醒:
- 文法一旦复杂,类的数量会迅速膨胀,维护成本高。
- 解释器通常不追求性能。真正的编程语言会用解析器生成器(如 ANTLR)、字节码或 JIT,而不是为每个节点写一个
interpret()。
把它当作“小型领域语言”的入门工具:文法简单、变化频繁、需要可读的对象表示时最合适。
正在加载本节练习...