0

0

c++如何实现解释器模式 c++设计模式之Interpreter【实例】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-25 12:11:32

|

779人浏览过

|

来源于php中文网

原创

解释器模式在C++中用于定义语言文法并构建解释器,适用于语法简单、执行频率低但需灵活扩展的场景,如布尔表达式计算;核心由AbstractExpression、TerminalExpression、NonterminalExpression和Context组成,通过递归下降解析器构建表达式树。

c++如何实现解释器模式 c++设计模式之interpreter【实例】

解释器模式(Interpreter Pattern)在 C++ 中用于定义语言的文法,并建立一个解释器来解释该语言中的句子。它适用于语法简单、执行频率不高、但需要灵活扩展语法规则的场景,比如简易表达式计算、配置脚本解析、规则引擎条件表达式等。

核心结构:抽象表达式 + 终结符/非终结符表达式

解释器模式的关键是将每个语法规则映射为一个类,所有表达式类型统一继承自抽象基类 Expression,并实现 interpret() 接口:

  • AbstractExpression:声明解释操作的接口(如 interpret(Context&)
  • TerminalExpression:对应终结符(如数字、变量名),不再分解,直接返回结果
  • NonterminalExpression:对应非终结符(如加、减、括号),内部持有子表达式,递归调用 interpret()
  • Context:封装解释器外部信息(如变量值表、全局状态)

实战示例:简易布尔表达式解释器

支持 ANDORNOT 和布尔字面量(True/False),输入字符串如 "True AND (NOT False)",输出 truefalse

关键代码片段(简化版):

立即学习C++免费学习笔记(深入)”;

羚珑
羚珑

京东推出的一站式AI图像处理平台

下载
class Context {
public:
    std::map variables;
};

class Expression {
public:
    virtual bool interpret(const Context& ctx) const = 0;
    virtual ~Expression() = default;
};

class BooleanLiteral : public Expression {
    bool value;
public:
    explicit BooleanLiteral(bool v) : value(v) {}
    bool interpret(const Context&) const override { return value; }
};

class VariableExpression : public Expression {
    std::string name;
public:
    explicit VariableExpression(const std::string& n) : name(n) {}
    bool interpret(const Context& ctx) const override {
        auto it = ctx.variables.find(name);
        return it != ctx.variables.end() ? it->second : false;
    }
};

class NotExpression : public Expression {
    std::unique_ptr expr;
public:
    explicit NotExpression(std::unique_ptr e) : expr(std::move(e)) {}
    bool interpret(const Context& ctx) const override {
        return !expr->interpret(ctx);
    }
};

class AndExpression : public Expression {
    std::unique_ptr left, right;
public:
    AndExpression(std::unique_ptr l, std::unique_ptr r)
        : left(std::move(l)), right(std::move(r)) {}
    bool interpret(const Context& ctx) const override {
        return left->interpret(ctx) && right->interpret(ctx);
    }
};

配合简易词法/语法分析(如递归下降解析器),即可将字符串构造成表达式树并执行。

如何构建表达式树?——手写递归下降解析器

不依赖第三方库时,可手写轻量解析器。例如对 "a AND NOT b",按优先级(括号 > NOT > AND/OR)分步解析:

  • 先识别标识符或字面量 → 构造 VariableExpressionBooleanLiteral
  • 遇到 NOT → 读取下一个表达式,包装成 NotExpression
  • 遇到 AND → 左侧已解析部分为左操作数,右侧递归解析为右操作数,组合成 AndExpression
  • 或智能指针管理内存(推荐 std::unique_ptr)避免泄漏

注意事项与适用边界

解释器模式不是万能的,需注意:

  • 语法越复杂,类爆炸越严重 —— 超过 5–6 类非终结符就应考虑用 ANTLR 或手写 LL(1) 解析器替代
  • 性能敏感场景慎用 —— 每次执行都走虚函数调用+对象创建,不如编译为字节码或直接生成 C++ 代码
  • 调试困难 —— 表达式树结构隐含在对象关系中,建议添加 toString() 辅助调试
  • 上下文传递要精简 —— 避免把整个环境传入,只传必要数据(如变量表、作用域链)

它真正擅长的是“小而活”:规则常变、语法可控、团队需快速定制逻辑(如运营后台的用户筛选条件)。

相关专题

更多
mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

174

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

267

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

250

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

121

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

246

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

202

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1428

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

606

2023.11.24

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4万人学习

Sass 教程
Sass 教程

共14课时 | 0.7万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号