设计模式C++实现--Interpreter模式
2019独角兽企业重金招聘Python工程师标准>>>
解释器模式
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。
适用性:
在以下情况下可以考虑使用解释器模式:
(1) 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
(2) 一些重复出现的问题可以用一种简单的语言来进行表达。
(3) 一个语言的文法较为简单。
(4) 执行效率不是关键问题。(注:高效的解释器通常不是通过直接解释抽象语法树来实现的,而是需要将它们转换成其他形式,使用解释器模式的执行效率并不高。)
优缺点:
优点:
(1) 易于改变和扩展文法。由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。
(2) 每一条文法规则都可以表示为一个类,因此可以方便地实现一个简单的语言。
(3) 实现文法较为容易。在抽象语法树中每一个表达式节点类的实现方式都是相似的,这些类的代码编写都不会特别复杂,还可以通过一些工具自动生成节点类代码。
(4) 增加新的解释表达式较为方便。如果用户需要增加新的解释表达式只需要对应增加一个新的终结符表达式或非终结符表达式类,原有表达式类代码无须修改,符合“开闭原则”。
缺点:
(1) 对于复杂文法难以维护。在解释器模式中,每一条规则至少需要定义一个类,因此如果一个语言包含太多文法规则,类的个数将会急剧增加,导致系统难以管理和维护,此时可以考虑使用语法分析程序等方式来取代解释器模式。
(2) 执行效率较低。由于在解释器模式中使用了大量的循环和递归调用,因此在解释较为复杂的句子时其速度很慢,而且代码的调试过程也比较麻烦。
总论:
尽量不要在重要模块中使用解释器模式,因为维护困难。在项目中,可以使用脚本语言来代替解释器模式。
实现
抽象表达式角色(AbstractExpression): 声明一个抽象的解释操作,这个接口为所有具体表达式角色都要实现的。
终结符表达式角色(TerminalExpression): 实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例对应不同的终结符,
终结符就是语言中用到的基本元素,一般不能再被分解,如: x -> xa, 这里a是终结符,因为没有别的规则可以把a变成别的符号,不过x可以变成别的符号,所以x是非终结符。
非终结符表达式角色(NonterminalExpression): 文法中的每条规则对应于一个非终结表达式, 非终结表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式。
环境角色(Context):包含解释器之外的一些全局信息。
步骤 1
创建上下文
class Contex{
private:map<string,int> _valueMap;public:int getValue(const string & key){return _valueMap[key];}void addValue( const string & key,int value){_valueMap.insert(pair<string,int>(key,value));}
};
步骤 2
创建抽象表达式接口
class AbstractExpression{
public:virtual ~ AbstractExpression(){}virtual int interpreter(Contex & contex) = 0;
};
步骤 3
创建两种非终结表达式
class AddNonterminalExpression : public AbstractExpression{
private:AbstractExpression * _left;AbstractExpression * _right;
public:AddNonterminalExpression(AbstractExpression * left,AbstractExpression * right):_left(left),_right(right){}int interpreter(Contex &contex) override {return _left->interpreter(contex) + _right->interpreter(contex);}
};class SubNonterminalExpression : public AbstractExpression{
private:AbstractExpression * _left;AbstractExpression * _right;
public:SubNonterminalExpression(AbstractExpression *_left, AbstractExpression *_right) : _left(_left), _right(_right) {}int interpreter(Contex &contex) override {return _left->interpreter(contex) - _right->interpreter(contex);}
};
步骤 4
创建终结表达式实现
class TerminalExpresiion : public AbstractExpression{
private:int _i;//终结符不能再切割
public:TerminalExpresiion(int i) : _i(i) {}int interpreter(Contex &contex) override {return _i;}
};
步骤 5
验证
Contex contex;contex.addValue("a",1);contex.addValue("b",2);contex.addValue("c",3);AbstractExpression * sub_left = new TerminalExpresiion(contex.getValue("a"));AbstractExpression * sub_right = new TerminalExpresiion(contex.getValue("b"));AbstractExpression * subvalue = new SubNonterminalExpression(sub_left,sub_right);AbstractExpression * add_right = new TerminalExpresiion(contex.getValue("c"));AbstractExpression * addvalue = new AddNonterminalExpression(subvalue,add_right);std::cout << addvalue->interpreter(contex) << std::endl;delete(addvalue);delete(add_right);delete(subvalue);delete(sub_right);delete(sub_left);
输出结果
2
转载于:https://my.oschina.net/fileoptions/blog/1823480
设计模式C++实现--Interpreter模式相关推荐
- 设计模式--解析器(Interpreter)模式
模式定义 给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子 类图 要点总结 Interpreter模式的应用场合是Interpreter模式应用中的难点, ...
- 设计模式学习笔记——解释器(Interpreter)模式
设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...
- 设计模式之略见一斑(解释器模式Interpreter)
解释器模式是一种比较难理解的模式,但如果你对Command(命令模式)和Composite(组合模式)很了解的话,你会发现其实解释器模式就是这两种的组合.为何要使用解释器模式,如何用解释器模式呢,这就 ...
- 设计模式之15 - 解释器模式Interpreter
1. 解释器模式(Interpreter Pattern)的定义 (1)定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. ①文法:即语法规则.在解 ...
- 设计模式(Java)—Interpreter模式
在Interpreter模式中,程序要解决的问题会被用非常简单的"迷你语言"表述出来,即用"迷你语言"编写的"迷你程序"把具体问题表述出来. ...
- 【白话设计模式二】外观模式(Facade)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- 【白话设计模式八】命令模式(Command)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- fcq java_Java设计模式百例 - 解释器模式
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文. 解释器模式在我们开发过程中并不常用 ...
- 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...
最新文章
- 3D场景高级合成技术学习
- NeurIPS 2021 | 通过寻找平坦最小值,克服小样本增量学习中的灾难性遗忘
- C#:导入Excel通用类(CSV格式)
- JVM学习笔记之-方法区,栈、堆、方法区的交互关系,方法区的理解,设置方法区大小与OOM,方法区的内部结构,方法区使用举例
- Consul入门04 - Consul集群 1
- Redis的3个高级数据结构
- PHP5.5中新增的参数跳跃和生成器功能介绍
- 【Android笔记】Unable to execute dex: Multiple dex files define 解决方法
- PHP AJAXFORM提交图片上传并显示图片源代码
- Harbor 使用 Helm 一键安装
- C#使用SetWindowsHookEx时报错“类型的已垃圾回收委托进行了回调”
- 程序员面试金典——7.4加法运算替代
- C#基础第六天-作业-利用面向对象的思想去实现名片
- 计算机取证程序论文,计算机取证论文参考文献推荐 计算机取证论文参考文献哪里找...
- LAMP兄弟连ThinkPHP笔记
- matlab中的semilogy,matlabsemilogy用法
- 基于Java后台(Springboot框架)+前端小程序(MINA框架)+Mysql数据库的在线电子书阅读小程序系统设计与实现
- OSPF ASBR及4类LSA研究
- mysql 5.7 group replication 之五 [ERROR] Plugin group_replication reported: 'Table tmp_t0 does not hav
- 开源java 状态机_Java架构师方案——状态机(附完项目代码)
热门文章
- python数字图像处理(四) 频率域滤波
- LINQ根据某字段GroupBy
- ORA-01925:maximum of 80 enabled roles exceeded
- 1130 - Host ‘win7' is not allowed to connect to this mysql server
- Ubuntu 10.04 lucid 安装 MariaDB 5.5
- 思科路由和交换限制用户出外网的几种策略
- Happy Birthday
- 给缺少Python项目实战经验的人
- stm32数据手册boot_STM32的ISP下载的原理是什么呢?
- Nginx基础配置实例需求分析