解析器模式(Interpreter Pattern)

提供了评估语言的语法或表达式的方式,它属于行为模式。这种模式实现了一个表达式接口,该接口解析一个特定的上下文。这种模式被用在SQL解析、符号处理引擎等。

核心思想

  • 将语言中的每个语法规则映射为一个类。
  • 构建抽象语法树(AST),由这些类的实例组成。
  • 使用递归调用解释整个表达式。

角色组成

角色 说明
AbstractExpression 定义解释操作的公共接口
TerminalExpression 实现文法中与终结符相关的解释操作
NonterminalExpression 实现文法中与非终结符相关的解释操作
Context 包含解释器所需的全局信息
Client 构建表示某一句子的抽象语法树并调用解释方法

适用场景

  • 需要解释执行某种小型语言或表达式(如数学表达式、规则引擎中的条件判断)。
  • 文法规则相对稳定且不复杂。
  • 开发脚本引擎、DSL解析器、配置规则解释器等。

代码示例:布尔表达式解释器

抽象表达式Expression

1
2
3
public interface Expression {
boolean interpret(String context);
}

终结符表达式TerminalExpression

1
2
3
4
5
6
7
8
9
10
public class TerminalExpression implements Expression {
private String data;
public TerminalExpression(String data) {
this.data = data;
}
@Override
public boolean interpret(String context) {
return context.contains(data);
}
}

非终结符表达式AndExpression

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class AndExpression implements Expression {
private Expresion expr1;
private Expression expr2;

public AndExpression(Expression expr1, Expression expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}

@Override
public boolean interpret(String context) {
return expr1.interpret(context) && expr2.interpret(context);
}
}

客户端使用

1
2
3
4
5
6
7
8
val context = "John is happy today."

val john = TerminalExpression("John")
val happy = TerminalExpression("happy")

val expression = AndExpression(john, happy)

expression.interpret(context))