解釋器模式:給定一個語言,定義其文法的表示,並定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。
模式包含四大元素:
| 角色 | 類別/介面 | 職責 |
|---|---|---|
| AbstractExpression | 介面 | 宣告 interpret(Context) 抽象操作 |
| TerminalExpression | 實作類 | 實現終結符(詞彙、常數、變數)的解釋邏輯 |
| NonterminalExpression | 實作類 | 實現非終結符(文法規則、運算式)的解釋邏輯,遞迴組合子表達式 |
| Context | 類別 | 包含解釋器之外的全域資訊(輸入字串、符號表、狀態等) |
public interface AbstractExpression {
void interpret(Context context);
}
public class Context {
private String input;
private int position;
private Map variables = new HashMap<>();
// getter/setter 略
}
public class TerminalExpression implements AbstractExpression {
private String name; // 變數名或常數值
public TerminalExpression(String name) { this.name = name; }
@Override
public void interpret(Context context) {
// 從上下文查找變數值或直接返回常數
Object value = context.getVariable(name);
context.setResult(value);
}
}
public class NonterminalExpression implements AbstractExpression {
private AbstractExpression left;
private AbstractExpression right;
private String operator; // +, -, *, /, if, while...
public NonterminalExpression(AbstractExpression left, AbstractExpression right, String operator) {
this.left = left; this.right = right; this.operator = operator;
}
@Override
public void interpret(Context context) {
left.interpret(context);
Object leftVal = context.getResult();
right.interpret(context);
Object rightVal = context.getResult();
// 根據運算子執行邏輯
Object result = compute(leftVal, rightVal, operator);
context.setResult(result);
}
private Object compute(Object a, Object b, String op) { /* 實作運算邏輯 */ }
}
| 適用 | 不適用 |
|---|---|
| 簡單語法規則(正則表達式、數學運算式、SQL WHERE 子句、規則引擎 DSL) | 複雜程式語言編譯器(需語法分析樹、優化、錯誤恢復等) |
| 文法規則數量少、穩定 | 文法頻繁變動、規模龐大 |
| 效能要求不極致(解釋執行較慢) | 高效能關鍵路徑 |
解釋器模式提供了一種結構化表示與執行文法規則的方法。雖然在企業級應用中較少直接手寫完整解釋器,但理解其「抽象語法樹 + 遞迴下降解釋」的核心思想,有助於掌握規則引擎、配置解析、查詢語言等領域的底層原理。實務上,優先考慮成熟的解析庫,僅在極簡輕量場景下手寫。