| 角色 | 職責 |
| AbstractExpression(抽象表達式) | 聲明 interpret(Context) 抽象方法。 |
| TerminalExpression(終結符表達式) | 實現文法中終結符的解釋。 |
| NonterminalExpression(非終結符表達式) | 為文法中非終結符實現解釋,遞歸調用子表達式。 |
| Context(上下文) | 包含解釋器所需的全局信息。 |
| Client(客戶端) | 構建 AST,調用解釋操作。 |
4. 代碼示例:簡易加減法解釋器(Java)
// 抽象表達式
interface Expression {
int interpret(Context ctx);
}
// 終結符:變量/常數
class NumberExpression implements Expression {
private int value;
public NumberExpression(int v) { value = v; }
public int interpret(Context ctx) { return value; }
}
// 非終結符:加法
class PlusExpression implements Expression {
private Expression left, right;
public PlusExpression(Expression l, Expression r) { left = l; right = r; }
public int interpret(Context ctx) { return left.interpret(ctx) + right.interpret(ctx); }
}
// 非終結符:減法
class MinusExpression implements Expression {
private Expression left, right;
public MinusExpression(Expression l, Expression r) { left = l; right = r; }
public int interpret(Context ctx) { return left.interpret(ctx) - right.interpret(ctx); }
}
// 上下文(本例簡單,無狀態)
class Context {}
// 構建 AST: 9 + 2 - 8
public class Test {
public static void main(String[] args) {
Expression expr = new MinusExpression(
new PlusExpression(new NumberExpression(9), new NumberExpression(2)),
new NumberExpression(8)
);
System.out.println(expr.interpret(new Context())); // 輸出 3
}
}
5. 相關模式
- Composite:AST 本質是組合模式。
- Flyweight:共享終結符節點(如變量名)。
- Iterator:遍歷 AST 結構。
- Visitor:在單獨類中維護節點行為(如類型檢查、代碼生成)。
6. 實戰場景
- 正則表達式引擎:文法 → NFA/DFA → 匹配。
- SQL 解析器:WHERE 子句條件表達式解釋。
- 配置文件解析:簡易腳本語言(如 Nginx 配置、遊戲腳本)。
- 數學表達式計算器:四則運算、函數調用。
7. 優缺點
| 優點 | 缺點 |
| 易擴展文法(新增表達式類) | 復雜文法類爆炸,維護困難 |
| 易實現新解釋方式(Visitor) | 效率低,非高性能場景適用 |
| 符合開閉原則 | 不適用於動態/上下文敏感文法 |
- 上一篇文章: UVA 10515:求 m^n 的個位數 — 規律 + 大數取模
- 下一篇文章: HDU 2686 Matrix:最大費用流解矩陣往返路徑最大和
Copyright ©
程式碼之家 All Rights Reserved