大话设计模式之解释器模式

server/2024/12/22 14:08:17/

解释器模式是一种行为设计模式,它用于解释语言的语法或表达式,将其转换为可执行的程序或操作。这种模式通常用于处理类似编程语言或规则引擎中的问题。

解释器模式中,通常有两种角色:

  1. 解释器(Interpreter):定义了一个接口或抽象类,其中包含了解释表达式的方法。通常会有多个不同的具体解释器来实现不同的语法规则或表达式解释。

  2. 终结符表达式(Terminal Expression):实现了解释器接口的具体类,用于表示语法规则中的终结符,例如变量、常量等。

  3. 非终结符表达式(Non-terminal Expression):也是实现了解释器接口的具体类,用于表示语法规则中的非终结符,例如加法、减法等。

解释器模式的核心思想是将一个复杂的语法规则分解成简单的表达式,然后逐步解释执行。这种模式通常适用于对于特定语法规则进行解析和处理的场景,例如编程语言的解释执行、规则引擎的实现等。

一个简单的例子是一个简单的四则运算表达式解释器,其中加法、减法、乘法、除法等操作符都可以作为非终结符表达式,而数字则是终结符表达式。通过将表达式拆分成不同的语法单元,然后逐步解释执行,可以实现对复杂表达式的解析和计算。

#include <iostream>
#include <stack>
#include <string>
#include <unordered_map>// 抽象解释器接口
class Expression {
public:virtual int interpret(std::unordered_map<char, int>& context) = 0;
};// 终结符表达式类 - 变量表达式
class VariableExpression : public Expression {
private:char variable;public:VariableExpression(char var) : variable(var) {}int interpret(std::unordered_map<char, int>& context) override {return context[variable];}
};// 非终结符表达式类 - 加法表达式
class AddExpression : public Expression {
private:Expression *leftOperand;Expression *rightOperand;public:AddExpression(Expression *left, Expression *right) : leftOperand(left), rightOperand(right) {}int interpret(std::unordered_map<char, int>& context) override {return leftOperand->interpret(context) + rightOperand->interpret(context);}
};// 上下文环境类
class Context {
private:std::unordered_map<char, int> variables;public:void setVariable(char var, int value) {variables[var] = value;}int getVariableValue(char var) {return variables[var];}
};int main() {// 构建解释器上下文Context context;context.setVariable('a', 5);context.setVariable('b', 10);// 构建表达式:a + bExpression *exp = new AddExpression(new VariableExpression('a'), new VariableExpression('b'));// 解释并计算表达式的值int result = exp->interpret(context.getVariables());std::cout << "Result: " << result << std::endl;delete exp;return 0;
}/*
在这个例子中,我们定义了抽象解释器接口 Expression,以及两种具体的表达式类:
终结符表达式 VariableExpression(用于表示变量),和非终结符表达式 AddExpression(用于表示加法表达式)。
我们还定义了一个上下文环境类 Context,用于存储变量的值。在 main 函数中,我们构建了一个简单的四则运算表达式 a + b,然后解释并计算其值。
*/

觉得有帮助的话,打赏一下呗。。

           


http://www.ppmy.cn/server/3633.html

相关文章

鸿蒙开发快速入门

基本概念 ArkTS 因为ArkTS是基于Type Script扩展而来&#xff0c;是Type Script的超集&#xff0c;所以也可以关注一下Type Script的语法来理解ArkTS的语法 ArkUI HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架…

Jenkins打包app并通过openssh上传到服务器

目录 1、下载安装openssh 2、配置openssh根目录 3、安装Jenkins Build Steps配置 Post-build Actions配置 4、运行 1、下载安装openssh 网上很多教程&#xff0c;包括开端口的&#xff0c;可以搜下 2、配置openssh根目录 进入C:\ProgramData\ssh打开文件sshd_config&am…

Sentinel

目录 Sentinel流量控制 1. 雪崩问题 ​2. 服务保护技术对比 3. 认识Sentinel 4. 安装启动Sentinel 5. 微服务整合sentinel 6. 限流规则-直接模式 7. jmeter测试工具 8. 限流规则-关联模式 9. 限流规则-链路模式 10. 流控效果-预热模式 11. 流控效果-排队等待 12. …

现代软件为什么要采用微服架构

现代软件采用微服务架构是为了解决传统单体架构在开发、部署和维护大型应用时面临的一系列问题。以下是采用微服务架构的主要优势&#xff1a; 1. **模块化和组件化**&#xff1a;微服务通过将应用拆分为一系列小型、松耦合的服务来提高模块化水平。每个服务都是围绕特定的业务…

【深度学习实战(12)】训练之模型参数初始化

在深度学习模型的训练中&#xff0c;权重的初始值极为重要。一个好的初始值&#xff0c;会使模型收敛速度提高&#xff0c;使模型准确率更精确。一般情况下&#xff0c;我们不使用全0初始值训练网络。为了利于训练和减少收敛时间&#xff0c;我们需要对模型进行合理的初始化。 …

Oracle21C 引入HR实例(linux)

1、下载资源 https://github.com/oracle-samples/db-sample-schemas点击code&#xff08;代码&#xff09;下载 2、上传Sql文件 解压之后将human_resources里的文件复制到demo\schema\目录&#xff08;具体目录前面的路径是你安装的路径&#xff09;下&#xff0c;如下图 3、…

MaxCompute 近实时增全量处理一体化新架构和使用场景介绍

随着当前数据处理业务场景日趋复杂&#xff0c;对于大数据处理平台基础架构的能力要求也越来越高&#xff0c;既要求数据湖的大存储能力&#xff0c;也要求具备海量数据高效批处理能力&#xff0c;同时还可能对延时敏感的近实时链路有强需求&#xff0c;本文主要介基于 MaxComp…

59.网络游戏逆向分析与漏洞攻防-基础数据分析筛选-角色上线过程数据逻辑分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…