Skip to content

解释器模式

用来定义语言的语法规则,并解释符合该语法的语句

适用的场景

  • 开发脚本语言、DSL、规则引擎、解析视觉小说剧本

  • 数学表达式解析器

  • 简易的自然语言命令解析

  • SQL、正则表达式、搜索过滤式的解析

基本结构

python
Client
  └──> Expression(抽象表达式)
         ├──> TerminalExpression(终结符:变量/数字)
         └──> NonTerminalExpression(非终结符:运算符)
  • 语法规则(表达式)

  • 解析器(解释器本体)

示例

实现一个简单的加法表达式解释器,比如解释 "5 + 3" 的结果是 8

csharp
// 抽象表达式
interface IExpression 
{
    int Interpret();
}

// 数字(终结符)
class Number : IExpression 
{
    private int _value;
    public Number(int value) => _value = value;
    public int Interpret() => _value;
}

// 加法(非终结符)
class Add : IExpression
{
    private IExpression _left, _right;
    public Add(IExpression left, IExpression right) 
    {
        _left = left;
        _right = right;
    }
    public int Interpret() => _left.Interpret() + _right.Interpret();
}

// 使用
var expr = new Add(new Number(5), new Number(3));
Console.WriteLine(expr.Interpret()); // ➜ 8

GDScript示例

gdscript
# 抽象表达式
class MathExpression:
    func interpret() -> int:
        return 0

# 数字(终结)
class NumberExpr extends MathExpression:
    var value: int
    func _init(v): value = v
    func interpret() -> int:
        return value

# 加法(非终结)
class AddExpr extends MathExpression:
    var left: MathExpression
    var right: MathExpression
    func _init(l, r):
        left = l
        right = r
    func interpret() -> int:
        return left.interpret() + right.interpret()

# 使用
func _ready():
    var expr = AddExpr.new(NumberExpr.new(5), NumberExpr.new(3))
    print(expr.interpret()) # ➜ 8