解释器模式
字数: 0 字 时长: 0 分钟
简介
解释器模式(Interpreter Pattern)的核心思想是:为特定类型的语言提供解释执行的方法。适合用户自定义表达式配置、DSL、表达式解析等场景。
基本结构
- 抽象表达式:定义所有解释器的通用接口,负责解释和计算表达式
- 终结符表达式:实现抽象表达式的接口,表示具体的语法元素,这些元素是无法再分解的最小单位
- 非终结符表达式:与终结符表达式不同,它们表示语言中的组合元素,可以包含子元素
- 上下文:包含解释过程的一些全局信息,比如变量的值
实现示例
实现如 5 + (10 - 3) * 2
的数学表达式解析器:
java
// 1. 抽象表达式
interface MathExpression {
int interpret(Context context);
}
// 2. 终结符表达式: 数字
class NumberExpression implements MathExpression {
private final int number;
public NumberExpression(int number) {
this.number = number;
}
@Override
public int interpret(Context context) {
return number; // 直接返回数字值
}
}
// 3. 终结符表达式: 变量
class VariableExpression implements MathExpression {
private final String variableName;
public VariableExpression(String name) {
this.variableName = name;
}
@Override
public int interpret(Context context) {
return context.getValue(variableName); // 从上下文获取变量值
}
}
// 4. 非终结符表达式: 加法
class AddExpression implements MathExpression {
private final MathExpression left;
private final MathExpression right;
public AddExpression(MathExpression left, MathExpression right) {
this.left = left;
this.right = right;
}
@Override
public int interpret(Context context) {
return left.interpret(context) + right.interpret(context);
}
}
// 5. 非终结符表达式: 乘法
class MultiplyExpression implements MathExpression {
// 实现类似AddExpression
}
// 6. 非终结符表达式: 括号(优先权实现)
class GroupExpression implements MathExpression {
private final MathExpression expression;
public GroupExpression(MathExpression exp) {
this.expression = exp;
}
@Override
public int interpret(Context context) {
return expression.interpret(context); // 优先计算括号内表达式
}
}
// 7. 上下文环境(存储变量)
class Context {
private final HashMap<String, Integer> variables = new HashMap<>();
public void setVariable(String name, int value) {
variables.put(name, value);
}
public int getValue(String name) {
return variables.getOrDefault(name, 0);
}
}
// 8. 语法解析器(核心)
class ExpressionParser {
public MathExpression parse(String input) {
// 语法解析逻辑...
// 返回完整的表达式树
}
}
// 9. 客户端使用
public class InterpreterDemo {
public static void main(String[] args) {
// 构建上下文(设置变量)
Context context = new Context();
context.setVariable("x", 5);
context.setVariable("y", 10);
// 手动构建语法树: (x + 2) * (y - 3)
MathExpression expr = new MultiplyExpression(
new GroupExpression(
new AddExpression(
new VariableExpression("x"),
new NumberExpression(2)
)
),
new GroupExpression(
new AddExpression(
new VariableExpression("y"),
new NumberExpression(-3) // 减法特例
)
)
);
int result = expr.interpret(context);
System.out.println("(x+2)*(y-3) = " + result); // 输出: (5+2)*(10-3)=7*7=49
// 使用解析器动态构建
ExpressionParser parser = new ExpressionParser();
MathExpression parsedExpr = parser.parse("5 + (10 - 3) * 2");
int result2 = parsedExpr.interpret(new Context());
System.out.println("5 + (10-3)*2 = " + result2); // 输出: 5 + 7*2 = 19
}
}