[设计模式] 设计模式课程(二十二)--解析器模式
时间:2021-07-29
本文章向大家介绍[设计模式] 设计模式课程(二十二)--解析器模式 ,主要包括[设计模式] 设计模式课程(二十二)--解析器模式 使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化
- 在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解析器来解释这样的句子,从而解决问题
- GoF:给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子
- Interpreter模式的应用场合:业务规则频繁变化,且类似的结构不断重复出现,并容易抽象为语法规则的问题(如将大写数字转换为数字)
- 使用Interpreter来表示文法规则,从而可使用面向对象技巧来方便地“扩展”文法
- 适用于简单的文法表示,对于复杂的文法表示,Interpreter会产生比较大的层次结构,需要借助于语法分析生成器这样的标准工具
- 适合小而简单的问题,问题复杂就不好用,实际开发中使用有限
Interpreter.cpp
1 #include <iostream> 2 #include <map> 3 #include <stack> 4 5 using namespace std; 6 7 class Expression { 8 public: 9 virtual int interpreter(map<char, int> var)=0; 10 virtual ~Expression(){} 11 }; 12 13 //变量表达式 14 class VarExpression: public Expression { 15 16 char key; 17 18 public: 19 VarExpression(const char& key) 20 { 21 this->key = key; 22 } 23 24 int interpreter(map<char, int> var) override { 25 return var[key]; 26 } 27 28 }; 29 30 //符号表达式 31 class SymbolExpression : public Expression { 32 33 // 运算符左右两个参数 34 protected: 35 Expression* left; 36 Expression* right; 37 38 public: 39 SymbolExpression( Expression* left, Expression* right): 40 left(left),right(right){ 41 42 } 43 44 }; 45 46 //加法运算 47 class AddExpression : public SymbolExpression { 48 49 public: 50 AddExpression(Expression* left, Expression* right): 51 SymbolExpression(left,right){ 52 53 } 54 int interpreter(map<char, int> var) override { 55 return left->interpreter(var) + right->interpreter(var); 56 } 57 58 }; 59 60 //减法运算 61 class SubExpression : public SymbolExpression { 62 63 public: 64 SubExpression(Expression* left, Expression* right): 65 SymbolExpression(left,right){ 66 67 } 68 int interpreter(map<char, int> var) override { 69 return left->interpreter(var) - right->interpreter(var); 70 } 71 72 }; 73 74 Expression* analyse(string expStr) { 75 76 stack<Expression*> expStack; 77 Expression* left = nullptr; 78 Expression* right = nullptr; 79 for(int i=0; i<expStr.size(); i++) 80 { 81 switch(expStr[i]) 82 { 83 case '+': 84 // 加法运算 85 left = expStack.top(); 86 right = new VarExpression(expStr[++i]); 87 expStack.push(new AddExpression(left, right)); 88 break; 89 case '-': 90 // 减法运算 91 left = expStack.top(); 92 right = new VarExpression(expStr[++i]); 93 expStack.push(new SubExpression(left, right)); 94 break; 95 default: 96 // 变量表达式 97 expStack.push(new VarExpression(expStr[i])); 98 } 99 } 100 101 Expression* expression = expStack.top(); 102 103 return expression; 104 } 105 106 void release(Expression* expression){ 107 108 //释放表达式树的节点内存... 109 } 110 111 int main(int argc, const char * argv[]) { 112 113 string expStr = "a+b-c+d-e"; 114 map<char, int> var; 115 var.insert(make_pair('a',5)); 116 var.insert(make_pair('b',2)); 117 var.insert(make_pair('c',1)); 118 var.insert(make_pair('d',6)); 119 var.insert(make_pair('e',10)); 120 121 Expression* expression= analyse(expStr); 122 123 int result=expression->interpreter(var); 124 125 cout<<result<<endl; 126 127 release(expression); 128 129 return 0; 130 }
原文地址:https://www.cnblogs.com/cxc1357/p/12324959.html
- 客户关系管理系统
- 016 Java中的动态代理
- JSON就是这么简单
- 017 Java中的静态代理、JDK动态代理、cglib动态代理
- 我的学习、归纳方法(以学习 Maven 为例)
- JDBC面试题都在这里
- 018 final 关键字的用途
- 04-01.总结switch,for,while,do。while跳转语句
- JDBC【介绍JDBC、使用JDBC连接数据库、简单的工具类】
- 019 单例模式的5种写法
- 图书管理系统【部署开发环境、解决分类、图书、前台页面模块】
- 图书管理系统【用户、购买、订单模块、添加权限】
- 04-02.总结switch,for,while,do。while跳转语句
- 图书管理系统【总结】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 骚操作,Python操作PPT,你会吗?
- 用了这个jupyter插件,我已经半个月没打开过excel了
- Mística:一款支持任意协议的应用程序通信工具
- 为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?
- 原创 | codefroces中的病毒,这题有很深的trick,你能解开吗?
- 原创 | git的远程分支是干啥的,和本地的有什么区别?
- 京东技术主导:全新架构的分布式事务Hmily 2.1.1发布
- iOS音视频接入-TRTC接入前期key、秘钥等准备
- 你一定不知道的 Linux 使用技巧
- 当 Python 爬虫搭配起 Bilibili 唧唧,奇怪的生产力出现了
- 一个简单的小技巧,监控网页所有动态标签创建的调用处
- SAP Spartacus storefrontapp index.html的design time和runtime
- OS开发爱好者福利来了:树莓派上编译C语言,顺便掌握一波硬件知识
- 一个简单易用的图标字体库和CSS框架fontawesome
- OLAP 数据平台 Druid 第一步,编写 Spec 配置