一、核心概念与结构
- 定义
解释器模式通过抽象表达式类定义语法规则,并通过组合终结符和非终结符表达式构建语法树,最终由解释器递归解析表达式。它适用于语言解析、规则引擎、简单计算引擎等场景。 - 核心角色
- 抽象表达式(Abstract Expression):声明解释操作接口(如
interpret()
方法),所有具体表达式类需实现此接口。 - 终结符表达式(Terminal Expression):表示文法中的终结符(如数字、变量),直接返回具体值。
- 非终结符表达式(Non-terminal Expression):表示文法中的运算符或规则组合(如加法、减法),通过递归调用子表达式完成解析。
- 上下文(Context):存储全局共享数据(如变量值映射)。
- 客户端(Client):构建语法树并调用解释操作。
- 抽象表达式(Abstract Expression):声明解释操作接口(如
二、实现示例
示例1:简单加法解释器
// 抽象表达式
interface Expression {
int interpret(Context context);
}
// 终结符:数字
class NumberExpression implements Expression {
private int number;
public NumberExpression(int number) { this.number = number; }
@Override
public int interpret(Context context) { return number; }
}
// 非终结符:加法
class AddExpression implements Expression {
private Expression left, right;
public AddExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}
@Override
public int interpret(Context context) {
return left.interpret(context) + right.interpret(context);
}
}
// 上下文(可存储变量)
class Context {
// 示例中未使用,实际可扩展
}
// 客户端使用
Context context = new Context();
Expression expr = new AddExpression(
new NumberExpression(1),
new AddExpression(new NumberExpression(2), new NumberExpression(3))
);
int result = expr.interpret(context); // 输出6
示例2:变量表达式解释器
通过上下文动态绑定变量值:
// 终结符:变量
class VariableExpression implements Expression {
private String name;
public VariableExpression(String name) { this.name = name; }
@Override
public int interpret(Context context) {
return context.getVariable(name); // 从上下文获取变量值
}
}
// 上下文实现
class Context {
private Map variables = new HashMap<>();
public void setVariable(String name, int value) { variables.put(name, value); }
public int getVariable(String name) { return variables.getOrDefault(name, 0); }
}
// 使用示例
Context context = new Context();
context.setVariable("x", 5);
context.setVariable("y", 10);
Expression expr = new AddExpression(new VariableExpression("x"), new VariableExpression("y"));
System.out.println(expr.interpret(context)); // 输出15
三、适用场景与优缺点
- 适用场景
- 简单语言解析:如算术表达式计算、正则表达式匹配、SQL解析。
- 动态规则扩展:需频繁修改语法规则的场景(如配置文件驱动的规则引擎)。
- 领域特定语言(DSL):自定义脚本语言解析。
- 优缺点
- 优点:
- 扩展性强:通过新增表达式类即可扩展语法规则。
- 灵活性高:支持动态组合表达式,适合语法树结构清晰的场景。
- 缺点:
- 性能较低:递归调用和大量类实例化导致效率问题。
- 类膨胀风险:复杂文法需定义大量表达式类,增加维护成本。
四、与其他模式的对比
与组合模式:均涉及树形结构,但组合模式关注对象组合,解释器模式关注语法规则解析。
- 与策略模式:策略模式封装算法,解释器模式封装语法规则的解释逻辑。
五、总结
解释器模式通过抽象语法树和分角色协作实现语言解析,适用于小规模、需动态扩展的场景。但在性能敏感或复杂文法场景中,需谨慎评估是否采用。实际开发中,正则表达式、编译器工具(如ANTLR)等已封装了解释器模式的核心思想,可优先复用现有库。