当前位置: 首页 > news >正文

解释器模式 行为型模式之五

1.定义

        给定一个语言,定义它的文法的一种表示,并定义一个解释器。比如加减乘除在代码里是一种表示,我们需要翻译成可以阅读的数学公式,并且可以供用户输入数字得到输出结果。

2.组成结构

  1. 抽象表达式(Abstract Expression):定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。
  2. 终结符表达式(Terminal Expression):是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。
  3. 非终结符表达式(Nonterminal Expression):也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。
  4. 上下文(Context):通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。

我们将用示例代码来解释各个组成部分的意义。

3.示例代码

#include <iostream>
#include <map>using namespace std;#define DELETE(pointer) delete pointer; pointer=nullptr
const string key1 = string("s1");
const string key2 = string("s2");
const string key3 = string("s3");
const string key4 = string("s4");class Context
{
public:Context() {datas[key1] = 1;datas[key2] = 2;datas[key3] = 3;datas[key4] = 4;}int getValue(string key) {if (!datas.count(key)){return 0;}return datas[key];}private:std::map<string, int> datas;
};class Expression
{
public:Expression(Expression* left, Expression* right) :left(left), right(right) { }virtual ~Expression() {if (left != nullptr){DELETE(left);}if (right != nullptr){DELETE(right);}}virtual int interpreter(Context* context) = 0;protected:Expression* left;Expression* right;
};class MultiExpression : public Expression
{
public:MultiExpression(Expression* left, Expression* right) : Expression(left, right) { }int interpreter(Context* context) override {if ((left == nullptr) || (right == nullptr)){return 0;}return left->interpreter(context) * right->interpreter(context);}
};class DivisionExpression : public Expression
{
public:DivisionExpression(Expression* left, Expression* right) : Expression(left, right) { }int interpreter(Context* context) override {if ((left == nullptr) || (right == nullptr)){return 0;}return left->interpreter(context) / right->interpreter(context);}
};class TerminalExpression : public Expression
{
public:TerminalExpression(int value) : value(value), Expression(nullptr, nullptr) { }int interpreter(Context* context) {return value;}private:int value;
};void doInterpreter() // 客户端client
{/*   3*4/2==6  对应语法树如下:/   (除法)/ \*  2/ \3   4*/Context context;MultiExpression* multiExpression = new MultiExpression(new TerminalExpression(context.getValue(key3)), new TerminalExpression(context.getValue(key4))); // 终止节点作为叶子结点,非终止节点作为非叶子节点int mutil = multiExpression->interpreter(&context);cout << "mutil==" << mutil << endl;DivisionExpression* divisionExpression = new DivisionExpression(multiExpression, new TerminalExpression(context.getValue(key2))); // 乘法表达式作为左子树 / 右子树int division = divisionExpression->interpreter(&context); // 运行解释器cout << "division==" << division << endl;DELETE(divisionExpression);// 这里注意,不能第二次释放divisionExpression,因为此时它是divisionExpression的左子树//,divisionExpression释放的时候会自动释放左右子树,也就是递归释放,最终只需要释放最后一次嵌套调用的就行
}int main()
{doInterpreter();system("pause");return 1;
}

引用

C++设计模式——解释器模式(interpreter pattern)_c++interpreter模式-CSDN博客

 

 

http://www.lryc.cn/news/187201.html

相关文章:

  • 2023年中国汽车座舱行业发展现状及趋势分析:高级人机交互(HMI)系统将逐步提升[图]
  • 常见的通用型项目管理软件推荐
  • 手机总是提醒系统更新,到底要不要更新呢?
  • 什么是API
  • RedissonClient 分布式锁 处理并发访问共享资源
  • Hadoop-2.5.2平台环境搭建遇到的问题
  • 基于WTMM算法的图像多重分形谱计算matlab仿真
  • VR全景展示带来旅游新体验,助力旅游业发展!
  • Xcode 15 编译出错问题解决
  • 基于指数趋近律的机器人滑模轨迹跟踪控制算法及MATLAB仿真
  • 华为云API自然语言处理的魅力—AI情感分析、文本分析
  • 微擎小程序获取不到头像和昵称解决方案
  • Qt 对界面类重命名的步骤
  • 使用docker搭建nacos单机、集群 + mysql
  • FreeRTOS自我救赎2之基本工程建立
  • 【C++设计模式之解释器模式:行为型】分析及示例
  • 35 WEB漏洞-逻辑越权之找回机制及接口安全
  • 黑豹程序员-架构师学习路线图-百科:JSON替代XML
  • 考研人考研魂——英语单词篇(20231009)
  • 【数据结构】HashSet的底层数据结构
  • 数据结构与算法(七)--使用链表实现栈
  • 分布式事务详解
  • 车载通信架构 —— DDS协议介绍
  • nginx根据不同的客户端设备进行转发请求——筑梦之路
  • 增强LLM:使用搜索引擎缓解大模型幻觉问题
  • WPF向Avalonia迁移(一、一些通用迁移项目)
  • lua学习笔记
  • 修改 ModelScope 默认缓存路径
  • 【ES实战】索引别名的使用说明
  • QT信号与槽机制 和 常用控件介绍