C++ 设计模式-解释器模式

news/2025/2/22 6:06:07

数学表达式解释器

示例需求

  1. 支持数字、变量、加减乘除运算
  2. 支持函数调用(如 max(2,3)
  3. 能够处理嵌套表达式(如 (x + 5) * max(y,10)

完整代码实现

#include <iostream>
#include <memory>
#include <unordered_map>
#include <vector>
#include <sstream>
#include <cctype>
#include <cmath>

// ====================== 解释器核心组件 ======================
class Context {
   
public:
    std::unordered_map<std::string, double> variables;
    double getVariable(const std::string& name) const {
   
        auto it = variables.find(name);
        if (it == variables.end()) throw std::runtime_error("Undefined variable: " + name);
        return it->second;
    }
};

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

// ====================== 终结符表达式 ======================
class Number : public Expression {
   
    double value;
public:
    Number(double v) : value(v) {
   }
    double interpret(const Context&) const override {
    return value; }
};

class Variable : public Expression {
   
    std::string name;
public:
    Variable(std::string n) : name(std::move(n)) {
   }
    double interpret(const Context& ctx) const override {
   
        return ctx.getVariable(name);
    }
};

// ====================== 非终结符表达式 ======================
class AddExpr : public Expression {
   
    std::unique_ptr<Expression> left, right;
public:
    AddExpr(Expression* l, Expression* r) : left(l), right(r) {
   }
    double interpret(const Context& ctx) const override {
   
        return left->interpret(ctx) + right->interpret(ctx);
    }
};

class MultiplyExpr : public Expression {
   
    std::unique_ptr<Expression> left, right;
public:
    MultiplyExpr(Expression

http://www.niftyadmin.cn/n/5861731.html

相关文章

工业级无人机手持地面站技术详解

工业级无人机手持地面站是无人机系统的核心组成部分&#xff0c;它集控制、通信、数据处理于一体&#xff0c;为无人机的安全飞行和任务执行提供全面支持。以下是对工业级无人机手持地面站技术的详细解析&#xff1a; 一、硬件构成 1. 处理器与操作系统&#xff1a; 工业级手…

清华大学102页PPT 《deepseek从入门到精通》

最近有一份资料传疯了——《DeepSeek&#xff1a;入门到精通》&#xff0c;据说是清华大学的高材生出品的。 没来及的细看&#xff0c;扫了一眼&#xff0c;感觉质量杠杠滴&#xff01;不亏是高材生。文件也整理好了&#xff0c;自取&#xff01; DeepSeek从入门到精通完整版手…

Elasticsearch实战应用:从“搜索小白”到“数据侦探”的进阶之路

引言&#xff1a;Elasticsearch——数据世界的“福尔摩斯” 大家好&#xff0c;今天我们要聊的是一个在数据世界中扮演“福尔摩斯”角色的工具——Elasticsearch。如果你曾经为海量数据的搜索和分析头疼不已&#xff0c;那Elasticsearch就是你的救星&#xff01;它不仅能帮你快…

GoLang 协程泄漏的原因可能是什么?

今天面试遇到的一个问题&#xff0c;记录一下 文章目录 1. 无限循环3. 等待不可能发生的条件4. 未正确关闭通道&#xff08;Channel&#xff09;5. 错误的Context管理6. 资源未正确释放7. 全局变量或数据结构的意外引用8. 协程内部发生Panic9. HTTP请求未关闭响应体10. 循环引用…

深入学习 XML:语法、约束、解析及相关技术

一、引言 在当今的软件开发领域&#xff0c;数据的存储和交换至关重要。XML&#xff08;Extensible Markup Language&#xff09;作为一种可扩展的标记语言&#xff0c;以其灵活的数据表示方式和良好的跨平台性&#xff0c;在程序配置、数据交换等方面发挥着重要作用。本文将详…

Vue2是如何利用Object.property实现数据的双向绑定?

我们之前说道过Object.defineProperty方法有一关键特性&#xff0c;就是数据劫持&#xff0c;通过get/set 拦截属性的读取和修改操作。Vue主要是通过数据劫持结合发布-订阅模式来实现的&#xff0c;利用Object.defineProperty来劫持各个属性的setter和getter&#xff0c;在数据…

HTTPS 证书交换流程

HTTPS 的密钥交换过程是基于 TLS&#xff08;Transport Layer Security&#xff09;协议实现的&#xff0c;其核心目标是通过加密和认证机制确保通信双方的安全性。以下是详细的 HTTPS 密钥交换过程的时序图&#xff0c;包括具体加密算法和细节。 HTTPS 密钥交换过程详细时序图…

Jenkins整合Jmeter实现接口自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、安装jmeter 下载&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本&#xff0c;启动前修改j…