Interpreter - 解释器模式
PRINT MyLanguage: NEXTLINE
LOOP 2
PRINT Hello SPACE
PRINT world!
NEXTLINE- BREAK
- END
class Context {
public:
Context(const string str)
{
m_size = splitStr(str, m_strs);
}
string current()
{
return m_strs[m_size];
}
string next()
{
return m_strs[++m_size];
}
private:
vector<string> m_strs;
int m_size;
}
class AbstractExpression {
public:
virtual void interpret(Context* context) = 0;
virtual void execute() = 0;
}
class IteratorExpression : public AbstractExpression {
public:
virtual void interpret(Context* context);
virtual void execute();
private:
vector<AbstractExpression*> m_exps;
}
void IteratorExpression::interpret(Context* context)
{
while(context->current() != "END")
{
if(context->current() == "LOOP")
{
LoopExpression* loopExp = new LoopExpression(context);
m_exp.insert(loopExp);
}
else
{
CommandExpresion* cmdExp = new CommandExpression(context);
m_exps.insert(cmdExp);
}
}
}
void IteratorExpresion::execute()
{
for(int i = 0; i < m_str.size(); ++i)
m_exps[i]->execute();
}
class LoopExpression : public AbstractExpresion
{
public:
virtual void interpret(Context* context);
virtual void execute();
private:
vector<AbstractExpression*> m_exps;
int m_count;
}
void LoopExpression::interpret(Context* context)
{
while(context->current() != "BREAK")
{
if(context->current() == "LOOP")
{
m_count = context->next().toInt();
}
else
{
CommandExpresion* cmdExp = new CommandExpression(context);
m_exps.insert(cmdExp);
}
}
}
void LoopExpression::execute()
{
for(int i = 0; i < m_count; ++i)
for(int j = 0; j < m_exps.size(); ++j)
m_exps[j]->execute();
}
class CommandExpression : public AbstractExpression
{
public:
virtual void interpret(Context* context);
virtual void execute();
private:
string m_name;
string m_text;
}
void CommandExpression::interpret(Context* context)
{
m_name = context->current();
if(context->current() == "PRINT")
{
m_text = context->next();
}
context->next();
}
void CommandExpression::execute()
{
if(m_name == "PRINT")
cout << m_text;
else if(m_name == "NEXTLINE")
cout << endl;
else if(m_name == "SPACE")
cout << " ";
}
string str = "PRINT MyLanguage: NEXTLINE LOOP 2 PRINT Hello SPACE PRINT world! NEXTLINE BREAK END";
Context* context = new Context(str);
IteratorExpression* iterExp = new IteratorExpression();
iterExp->interpret(context);
iterExp->execute();
MyLauguage:
Hello world!
Hello world!
Interpreter - 解释器模式相关推荐
- Interpreter解释器模式
前言: 关于23种设计模式的所有示例代码请参考:https://github.com/Wuchenwcf/MyCode/tree/master/DP 本文所述代码请参考:https://github. ...
- 浅谈Interpreter解释器模式
一.前言 这是我们23个设计模式中最后一个设计模式了,大家或许也没想到吧,竟然是编译原理上的编译器,这样说可能不对,因为编译器分为几个部分组成呢,比如词法分析器.语法分析器.语义分析器.中间代码优化器 ...
- Interpreter(解释器模式)行为型
解释器模式 一.概述 二.结构 三.实例 四.适用场景 五.优缺点 一.概述 描述:当不懂英文的中国人和不懂中文的外国人交流时会存在沟通障碍.这时有种翻译器能将两种语言进行转换各个对方国家语言,然后进 ...
- [转载] C#面向对象设计模式纵横谈——16 Interpreter解释器模式
主讲:李建忠 来源:http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/CsharpOOD. ...
- 设计模式之解释器模式(Interpreter)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- java interpreter_解释器模式(Interpreter)Java
定义: 解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 结构图: AbstractExpression解释器模式 ...
- 设计模式循序渐进(9)解释器模式 Interpreter
通过解释器模式实现阿拉伯数字与罗马数字的相互转换. 具体的模式分析解说日后补发. Delphi代码: unit uInt2RomeInterpreter; { 单元说明:将整数转换为罗马数字 ...
- 解释器模式(行为模式)
设计模式之Interpreter - 解释器模式 2008-06-24 10:41:46 分类: 项目管理 源地址:http://blog.chinaunix.net/uid- ...
- 解释器模式(interpreter)解析例子
摘要:本文深入浅出的讲述了设计模式中的解释器模式,并给出了简单的示例,例子浅显易懂,并附带源代码. 解释器模式属于行为型模式,其意图是给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该 ...
最新文章
- Kubernetes学习笔记二:Namespace,Cgroups 的隔离与应用
- 脑机交互研究及标准化实践
- futuretask java 并发请求_图文并茂理解 Java 多线程
- ClassLoader工作机制
- Raid技术在Linux下的使用
- 反射型XSS漏洞详解
- lambda表达式_Lambda表达式详解
- 数据结构和数据类型之间的关系
- Java单例模式的七种写法
- Docker精华问答 | Docker vs VM
- 项目中有出现过缓存击穿,简单说说怎么回事?
- JVM 排查问题实战
- 前端 JavaScript 条件语句优化
- springmvc线程安全问题
- 武大高级软件工程2017评分汇总
- html小写数字怎么转换大写,如何将数字123转化成大写的文字 一百二十三 或 一二三?...
- 扩展欧几里得算法——Python详解
- Python软件编程等级考试四级——20210905
- QT visual assist x不能稳定工作
- 解决多个数独重叠联系
热门文章
- python默认数据类型转换_Python 数据类型转换
- java 获取第一帧_java获取视频的第一帧
- paddle中的自动求解梯度 : autograd.backward
- 如何自行绕制所需要的2.2uH的电感?
- 逐飞mini车样品说明
- 电子秤专用模拟/数字(A/D)转换器芯片 HX711
- 简单分解帮助看清复杂问题
- python语言接口_Python-接口自动化(一)
- bs程序在linux下部署,在windows10 Linux (centos7)中安装go golang (够浪) 并测试运行
- mysql高级版本的默认密码_MySQL高版本默认密码查找