C++实现设计模式---解释器模式 (Interpreter Pattern)

ops/2025/1/21 14:18:24/

解释器模式 (Interpreter Pattern)

解释器模式 是一种行为型设计模式,它提供了一个语言的语法表示,并定义了一个解释器来处理这个语言的语法。通过解释器模式,可以实现对特定语法或表达式的解析和执行。


意图

  • 定义一种语言的文法,并提供一个解释器来处理语言中的语句。
  • 通过解析和解释特定语言的表达式,实现灵活的扩展和动态计算。

使用场景

  1. 需要解析特定语法或表达式
    • 如计算器的表达式求值。
  2. 语言规则相对简单,且可扩展
    • 规则可以使用组合模式表达。
  3. 需要对用户输入的语句进行解析并执行
    • 如脚本语言解析器。

参与者角色

  1. 抽象表达式 (Expression)
    • 定义解释操作的接口。
  2. 终结符表达式 (TerminalExpression)
    • 实现与文法中的终结符相关的解释操作。
  3. 非终结符表达式 (NonTerminalExpression)
    • 实现文法中的非终结符的解释操作,通常是其他表达式的组合。
  4. 上下文 (Context)
    • 包含解释器需要的全局信息。
  5. 客户端 (Client)
    • 构建文法树,并通过调用解释器来解释表达式。

示例代码

以下代码展示了解释器模式的实现,用于解析和计算简单的数学表达式。

#include <iostream>
#include <string>
#include <memory>
#include <unordered_map>// 抽象表达式
class Expression {
public:virtual ~Expression() = default;// 解释方法virtual int interpret(const std::unordered_map<std::string, int>& context) const = 0;
};// 终结符表达式:变量
class VariableExpression : public Expression {
private:std::string name;public:explicit VariableExpression(std::string name) : name(std::move(name)) {}int interpret(const std::unordered_map<std::string, int>& context) const override {auto it = context.find(name);if (it != context.end()) {return it->second; // 返回变量的值}throw std::runtime_error("变量未定义: " + name);}
};// 终结符表达式:常量
class ConstantExpression : public Expression {
private:int value;public:explicit ConstantExpression(int value) : value(value) {}int interpret(const std::unordered_map<std::string, int>& context) const override {return value; // 返回常量值}
};// 非终结符表达式:加法
class AddExpression : public Expression {
private:std::shared_ptr<Expression> left;std::shared_ptr<Expression> right;public:AddExpression(std::shared_ptr<Expression> left, std::shared_ptr<Expression> right): left(std::move(left)), right(std::move(right)) {}int interpret(const std::unordered_map<std::string, int>& context) const override {return left->interpret(context) + right->interpret(context); // 加法操作}
};// 非终结符表达式:减法
class SubtractExpression : public Expression {
private:std::shared_ptr<Expression> left;std::shared_ptr<Expression> right;public:SubtractExpression(std::shared_ptr<Expression> left, std::shared_ptr<Expression> right): left(std::move(left)), right(std::move(right)) {}int interpret(const std::unordered_map<std::string, int>& context) const override {return left->interpret(context) - right->interpret(context); // 减法操作}
};// 客户端代码
int main() {// 构建表达式: (x + 10) - yauto x = std::make_shared<VariableExpression>("x");auto y = std::make_shared<VariableExpression>("y");auto constant = std::make_shared<ConstantExpression>(10);auto addExpr = std::make_shared<AddExpression>(x, constant); // x + 10auto subtractExpr = std::make_shared<SubtractExpression>(addExpr, y); // (x + 10) - y// 上下文std::unordered_map<std::string, int> context = {{"x", 5}, {"y", 3}};// 解释表达式std::cout << "表达式结果: " << subtractExpr->interpret(context) << "
"; // 输出结果: 12return 0;
}

代码解析

1. 抽象表达式 (Expression)
  • 定义了解释操作的接口,所有具体表达式类都需要实现此接口。
class Expression {
public:virtual ~Expression() = default;virtual int interpret(const std::unordered_map<std::string, int>& context) const = 0;
};
2. 终结符表达式
  • VariableExpression:表示变量,解释时从上下文中获取变量的值。
  • ConstantExpression:表示常量,解释时直接返回常量值。
class VariableExpression : public Expression {int interpret(const std::unordered_map<std::string, int>& context) const override {return context.at(name);}
};
3. 非终结符表达式
  • AddExpressionSubtractExpression 实现了抽象表达式接口。
  • 它们通过组合其他表达式实现复杂的语法结构。
class AddExpression : public Expression {int interpret(const std::unordered_map<std::string, int>& context) const override {return left->interpret(context) + right->interpret(context);}
};
4. 客户端代码
  • 客户端通过组合表达式构建语法树,并传入上下文解析表达式。

优缺点

优点
  1. 扩展性强
    • 可以轻松扩展新的表达式类型。
  2. 语法清晰
    • 将语言的语法结构化,易于维护和扩展。
  3. 灵活性
    • 通过组合模式,可以灵活构造复杂的语法。
缺点
  1. 性能开销
    • 每个表达式都是一个对象,可能导致较大的内存开销。
  2. 复杂性高
    • 对于复杂语法,类的数量可能急剧增加。
  3. 适用范围有限
    • 适用于简单语法,复杂语言解析时不适合。

适用场景

  1. 需要解释语言或语法
    • 如编译器、计算器等。
  2. 需要灵活扩展表达式的语法规则
    • 通过组合表达式动态扩展语法。

总结

解释器模式通过定义语言的文法和解释器,提供了一种解析和执行表达式的机制。它适用于简单语言或语法的解析场景,但对于复杂语言解析可能并不适合。


http://www.ppmy.cn/ops/151928.html

相关文章

废品回收小程序,数字化回收时代

随着科技的不断创新发展&#xff0c;废品回收在各种技术的支持下也在不断地创新&#xff0c;提高了市场的发展速度&#xff0c;不仅能够让回收效率更加高效&#xff0c;还能够让居民更加便捷地进行回收&#xff0c;推动废品回收行业的发展。 回收市场机遇 目前&#xff0c;废…

WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测

WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测 目录 WOA-CNN-GRU-Attention、CNN-GRU-Attention、WOA-CNN-GRU、CNN-GRU四模型对比多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于WOA-CNN-GRU-Attention、…

LLM大语言模型的分类

从架构和功能的角度来看&#xff0c;LLM&#xff08;Large Language Model&#xff0c;大语言模型&#xff09;主要可以分为以下几种类型&#xff1a; **1. 基础语言模型&#xff1a;** * **定义:** 通过在大规模文本数据上进行预训练&#xff0c;学习语言的规律和模式&#…

基于 Spring Cloud 、Spring Boot、 OAuth2 的 RBAC 企业快速开发平台

系统说明 基于 Spring Cloud 、Spring Boot、 OAuth2 的 RBAC 企业快速开发平台&#xff0c; 同时支持微服务架构和单体架构提供对 Spring Authorization Server 生产级实践&#xff0c;支持多种安全授权模式提供对常见容器化方案支持 Kubernetes、Rancher2 、Kubesphere、EDA…

qml OpacityMask详解

1、概述 OpacityMask是QML&#xff08;Qt Meta-Object Language&#xff09;中的一种图形效果&#xff0c;它使用另一个项目&#xff08;通常是一个图像或图形项&#xff09;作为遮罩来控制源项目的透明度。这种效果允许开发者通过遮罩的alpha通道来精确地控制源项目中哪些部分…

EXTI外部中断

68个中断源&#xff0c;这个是F1系列最多的中断数量&#xff0c;对于一个具体的型号&#xff0c;可能没有这么多中断&#xff0c;所以这个数量看看就行&#xff0c;具体以对应型号的数据手册为准。接着STM32的中断包含EXTI外部中断&#xff0c;TIM定时器&#xff0c;ADC模数转换…

Golang学习笔记_27——单例模式

Golang学习笔记_24——泛型 Golang学习笔记_25——协程Golang学习笔记_25——协程 Golang学习笔记_26——通道 文章目录 单例模式1. 介绍2. 应用场景3. 实现3.1 饿汉式3.2 懒汉模式 源码 单例模式 1. 介绍 单例模式是一种创建型设计模式&#xff0c;它确保一个类只有一个实例…

数据结构——链表和单向链表

1、链表的介绍 &#xff08;1&#xff09;定义 链表是一种链式存储的线性表 链表是一种基本的数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含一个值和指向下一个节点的指针 节点如下图所示&#xff1a; 与数组不同&#xff0c;链表中的节点不一定是连续的…