解释器模式
用来定义语言的语法规则,并解释符合该语法的语句。
适用的场景
开发脚本语言、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()); // ➜ 8GDScript示例
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