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

C++中的解释器模式

目录

解释器模式(Interpreter Pattern)

实际应用

算术表达式解释器

布尔表达式解释器

总结


解释器模式(Interpreter Pattern)

解释器模式是一种行为设计模式,它定义了一种语言的文法表示,并使用解释器来解释这些文法。该模式适用于那些有特定语法规则的场景,比如编译器、正则表达式引擎和计算器。

实际应用

算术表达式解释器

算术表达式解释器 -- 可以解析和计算包含加法和减法的算术表达式。

#include <iostream>
#include <string>
#include <stack>
#include <memory>
#include <unordered_map>// 抽象表达式
class Expression {
public:virtual ~Expression() = default;virtual int interpret(const std::unordered_map<char, int>& context) = 0;
};// 终结符表达式(变量)
class VariableExpression : public Expression {
private:char name;
public:VariableExpression(char name) : name(name) {}int interpret(const std::unordered_map<char, int>& context) override {return context.at(name);}
};// 非终结符表达式(加法)
class AddExpression : public Expression {
private:std::shared_ptr<Expression> left, right;
public:AddExpression(std::shared_ptr<Expression> left, std::shared_ptr<Expression> right) : left(left), right(right) {}int interpret(const std::unordered_map<char, int>& context) override {return left->interpret(context) + right->interpret(context);}
};// 非终结符表达式(减法)
class SubtractExpression : public Expression {
private:std::shared_ptr<Expression> left, right;
public:SubtractExpression(std::shared_ptr<Expression> left, std::shared_ptr<Expression> right) : left(left), right(right) {}int interpret(const std::unordered_map<char, int>& context) override {return left->interpret(context) - right->interpret(context);}
};// 客户端代码:解析并计算表达式
int main() {std::string expr = "a+b-c";std::unordered_map<char, int> context = {{'a', 5}, {'b', 3}, {'c', 2}};std::stack<std::shared_ptr<Expression>> stack;for (char token : expr) {if (isalpha(token)) {stack.push(std::make_shared<VariableExpression>(token));} else if (token == '+') {auto right = stack.top(); stack.pop();auto left = stack.top(); stack.pop();stack.push(std::make_shared<AddExpression>(left, right));} else if (token == '-') {auto right = stack.top(); stack.pop();auto left = stack.top(); stack.pop();stack.push(std::make_shared<SubtractExpression>(left, right));}}auto expression = stack.top();int result = expression->interpret(context);std::cout << "Result: " << result << std::endl;return 0;
}

布尔表达式解释器

布尔表达式解释器 -- 可以解析和计算包含与(AND)和或(OR)的布尔表达式。

#include <iostream>
#include <string>
#include <stack>
#include <memory>
#include <unordered_map>// 抽象表达式
class Expression {
public:virtual ~Expression() = default;virtual bool interpret(const std::unordered_map<std::string, bool>& context) = 0;
};// 终结符表达式(变量)
class VariableExpression : public Expression {
private:std::string name;
public:VariableExpression(const std::string& name) : name(name) {}bool interpret(const std::unordered_map<std::string, bool>& context) override {return context.at(name);}
};// 非终结符表达式(与操作)
class AndExpression : public Expression {
private:std::shared_ptr<Expression> left, right;
public:AndExpression(std::shared_ptr<Expression> left, std::shared_ptr<Expression> right) : left(left), right(right) {}bool interpret(const std::unordered_map<std::string, bool>& context) override {return left->interpret(context) && right->interpret(context);}
};// 非终结符表达式(或操作)
class OrExpression : public Expression {
private:std::shared_ptr<Expression> left, right;
public:OrExpression(std::shared_ptr<Expression> left, std::shared_ptr<Expression> right) : left(left), right(right) {}bool interpret(const std::unordered_map<std::string, bool>& context) override {return left->interpret(context) || right->interpret(context);}
};// 客户端代码:解析并计算布尔表达式
int main() {std::string expr = "a AND b OR c";std::unordered_map<std::string, bool> context = {{"a", true}, {"b", false}, {"c", true}};std::stack<std::shared_ptr<Expression>> stack;std::istringstream iss(expr);std::string token;while (iss >> token) {if (token == "a" || token == "b" || token == "c") {stack.push(std::make_shared<VariableExpression>(token));} else if (token == "AND") {auto right = stack.top(); stack.pop();auto left = stack.top(); stack.pop();stack.push(std::make_shared<AndExpression>(left, right));} else if (token == "OR") {auto right = stack.top(); stack.pop();auto left = stack.top(); stack.pop();stack.push(std::make_shared<OrExpression>(left, right));}}auto expression = stack.top();bool result = expression->interpret(context);std::cout << "Result: " << std::boolalpha << result << std::endl;return 0;
}

总结

解释器模式可以帮助我们定义和解释特定语言的语法规则,并将这些规则应用于不同的上下文。

相关文章:

  • Java -jar 运行 报 MalformedInputException: Input length = 1
  • Mongodb数据库基本操作
  • jeecg快速启动(附带本地运行可用版本下载)
  • 可穿戴设备:苹果“吃老底”、华为“忙复苏”、小米“再扩容”
  • Java数据类型及运算符及数组(与C语言对比)
  • 数据治理:让数据提取更高效、更准确的关键
  • 综述:光学测量技术趋势
  • 辛弃疾,笔墨剑影的一生
  • UDP协议详解
  • Linux网络-HttpServer的实现
  • DP读书:半导体物理考试重点
  • 数据库中存储过程,看这一篇就够了!!
  • 从ES的JVM配置起步思考JVM常见参数优化
  • 亚马逊跟卖ERP系统,怎样提升新手卖家选品的质量与效率!
  • 短视频配曲排行:四川鑫悦里文化传媒有限公司
  • 【EOS】Cleos基础
  • C++入门教程(10):for 语句
  • Java反射-动态类加载和重新加载
  • node学习系列之简单文件上传
  • Python 基础起步 (十) 什么叫函数?
  • SpiderData 2019年2月25日 DApp数据排行榜
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 分享几个不错的工具
  • 每天一个设计模式之命令模式
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 实现简单的正则表达式引擎
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 物联网链路协议
  • 小李飞刀:SQL题目刷起来!
  • Mac 上flink的安装与启动
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • #、%和$符号在OGNL表达式中经常出现
  • #php的pecl工具#
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #职场发展#其他
  • $NOIp2018$劝退记
  • %check_box% in rails :coditions={:has_many , :through}
  • (03)光刻——半导体电路的绘制
  • (06)金属布线——为半导体注入生命的连接
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .Net Core 中间件验签
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET微信公众号开发-2.0创建自定义菜单
  • .net下简单快捷的数值高低位切换
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @angular/cli项目构建--Dynamic.Form
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [BFS广搜]迷阵
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数
  • [C++]C++类基本语法