解釋器模式為語言文法定義表達式並提供解釋器,適用於「文法簡單、需頻繁擴充規則」的場景(如 SQL 解析、規則引擎、四則運算)。本文完整展示抽象表達式、終結符/非終結符表達式、Context 環境角色,並以 (a*b)/(a-b+2) 為例實作完整解析樹與計算邏輯。
interpret(Context) 抽象方法。Map)。// Context:變數值存儲
class Context {
private final Map<Variable, Integer> values = new HashMap<>();
void assign(Variable v, int val) { values.put(v, val); }
int lookup(Variable v) { return values.get(v); }
}
// 抽象表達式
abstract class Expression { abstract int interpret(Context ctx); }
// 終結符:常數
class Constant extends Expression {
private final int value;
Constant(int v) { value = v; }
int interpret(Context ctx) { return value; }
}
// 終結符:變數
class Variable extends Expression {
int interpret(Context ctx) { return ctx.lookup(this); }
}
// 非終結符:加減乘除
class Add extends Expression {
private final Expression left, right;
Add(Expression l, Expression r) { left = l; right = r; }
int interpret(Context ctx) { return left.interpret(ctx) + right.interpret(ctx); }
}
class Subtract extends Expression { /* 類似,left - right */ }
class Multiply extends Expression { /* 類似,left * right */ }
class Division extends Expression {
int interpret(Context ctx) {
try { return left.interpret(ctx) / right.interpret(ctx); }
catch (ArithmeticException e) { System.out.println("除數為零"); return -11111; }
}
}
// Client:建構 (a*b)/(a-b+2)
public class Test {
public static void main(String[] args) {
Context ctx = new Context();
Variable a = new Variable(), b = new Variable();
Constant two = new Constant(2);
ctx.assign(a, 5); ctx.assign(b, 7);
Expression exp = new Division(
new Multiply(a, b),
new Add(new Subtract(a, b), two)
);
System.out.println("結果:" + exp.interpret(ctx)); // (5*7)/(5-7+2) = 35/0 → 例外處理
}
}
| 優點 | 缺點 |
|---|---|
| 擴充文法規則只需新增非終結符類別 | 規則複雜時類別爆炸,維護困難 |
| 文法表示清晰,易於理解 | 遞迴調用效能差,不適合高效能場景 |
適用:簡單 SQL 解析、正則表達式引擎、數學公式計算器、DSL 解釋器。
不適用:複雜程式語言編譯器、高頻交易計算路徑。