模式特点
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
- 将每个文法规则映射为一个类
- 通过组合规则类来构建抽象语法树
- 递归地解释和执行语法树
- 易于扩展新的文法规则
类图
应用场景
- Qt 中 QRegularExpression 的正则表达式引擎
- 机器人示教器图形化编程:解析运动指令表达式
- SQL 解析器:将 SQL 语句解析为执行计划
- 配置文件解析:规则引擎解析条件表达式
- 计算器表达式求值:解析数学表达式
示例代码(C++)
class Context { public: std::map<std::string, bool> variables; }; // 抽象表达式 class Expression { public: virtual bool interpret(Context& ctx) = 0; virtual ~Expression() = default; }; // 终结符表达式 - 变量 class VariableExpr : public Expression { std::string m_name; public: VariableExpr(const std::string& n) : m_name(n) {} bool interpret(Context& ctx) override { return ctx.variables[m_name]; } }; // 非终结符 - AND class AndExpr : public Expression { Expression* m_e1; Expression* m_e2; public: AndExpr(Expression* e1, Expression* e2) : m_e1(e1), m_e2(e2) {} bool interpret(Context& ctx) override { return m_e1->interpret(ctx) && m_e2->interpret(ctx); } }; // 构建表达式树: (安全IO AND 归零完成) Expression* expr = new AndExpr( new VariableExpr("safety_io"), new VariableExpr(" homed") ); Context ctx; ctx.variables["safety_io"] = true; ctx.variables["homed"] = true; bool result = expr->interpret(ctx); // true: 允许启动