设计模式【23】——解释器模式(Interpreter模式)


前言

一些应用提供了内建(Build-In)的脚本或者宏语言来让用户可以定义他们能够在系统中进行的操作。Interpreter模式的目的就是使用一个解释器为用户提供一个一门定义语言的语法表示的解释器,然后通过解释器来解释语言中的句子。 Interpreter模式提供了一个实现语法解释器的框架。
如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。


一、解释器模式(Interpreter模式)

Interpreter 模式中,提供了 TerminalExpression 和 NonterminalExpression 两种表达式的解释方式,Context 类用于为解释过程提供一些附加的信息。UML图如下:
Interpreter模式示意图


二、具体源码

1.Context.h

代码如下(示例):

#ifndef _CONTEXT_H_ 
#define _CONTEXT_H_ 

#include <iostream>

class Context
{
public:
  Context();
  ~Context();
protected:
private:
};
#endif //_CONTEXT_H_

2.Context.cpp

代码如下(示例):

#include "Context.h" 

Context::Context()
{
}

Context::~Context()
{
}

3.Interpret.h

#pragma once
#ifndef _INTERPRET_H_ 
#define _INTERPRET_H_ 

#include "Context.h" 
#include <string> 

class AbstractExpression
{
public:

  virtual ~AbstractExpression();
  virtual void Interpret(const Context& c);

protected:
  AbstractExpression();
private:
};

class TerminalExpression :public AbstractExpression
{
public:
  TerminalExpression(const std::string& statement);
  ~TerminalExpression();
  void Interpret(const Context& c);

protected:
private:
  std::string _statement;
};

class NonterminalExpression :public AbstractExpression
{
public:
  NonterminalExpression(AbstractExpression* expression, int times);
  ~NonterminalExpression();
  void Interpret(const Context& c);

protected:
private:
  AbstractExpression* _expression;
  int _times;
};

#endif //_INTERPRET_H_

4.Interpret.cpp

#include "Interpret.h" 

AbstractExpression::AbstractExpression()
{
}

AbstractExpression::~AbstractExpression()
{
}

void AbstractExpression::Interpret(const Context& c)
{
}

TerminalExpression::TerminalExpression(const std::string& statement)
{
  this->_statement = statement;
}

TerminalExpression::~TerminalExpression()
{
}

void TerminalExpression::Interpret(const Context& c)
{
  std::cout << this->_statement << " TerminalExpression" << std::endl;
}

NonterminalExpression::NonterminalExpression(AbstractExpression*
  expression, int times)
{
  this->_expression = expression;
  this->_times = times;
}

NonterminalExpression::~NonterminalExpression()
{
}

void NonterminalExpression::Interpret(const Context& c)
{
  for (int i = 0; i < _times; i++)
  {
    this->_expression->Interpret(c);
  }
}

5.main.cpp

#include "Context.h" 
#include "Interpret.h" 

int main(int argc, char* argv[])
{
  Context* c = new Context();
  AbstractExpression* te = new TerminalExpression("hello");
  AbstractExpression* nte = new NonterminalExpression(te, 2);

  nte->Interpret(*c);


  AbstractExpression* te1 = new TerminalExpression("world");
  AbstractExpression* nte1 = new NonterminalExpression(te1, 2);
  nte1->Interpret(*c);

  return 0;
}

三、运行结果

Interpreter模式运行结果如下:
Interpreter模式运行结果

总结

当有部分语句需要解释执行(经常使用),并且可以将该语句表示为一个抽象语法时,可以使用 Interpreter 模式。因此,该模式的可扩展性比较好,而且易于实现简单文法。但是对于复杂的文法,还是比较难维护,也会引起类膨胀。


本文参考《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》,对内容进行整理,方便大家学习。如想学习详细内容,请参考此书。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
解释器模式Interpreter Pattern)是一种行为型设计模式,它定义了一种语言文法的表示,并定义了一个解释器,用于解释语言中的句子。它将一个问题分成两个部分:一部分是语言的文法规则,另一部分是解释器,用来解释规则中的句子。解释器模式可以用于处理一些简单的语言,如数学表达式、正则表达式等。 实现方式: 1. 定义抽象表达式类(AbstractExpression),它是所有表达式类的父类,声明了抽象的解释方法。 2. 定义终结符表达式类(TerminalExpression),它实现了抽象表达式类中的解释方法,用于解释语言中的终结符。 3. 定义非终结符表达式类(NonterminalExpression),它也实现了抽象表达式类中的解释方法,用于解释语言中的非终结符。 4. 定义上下文类(Context),它包含了解释器需要的一些全局信息。 5. 客户端使用时,先创建一个上下文对象,然后将需要解释的语言句子作为参数传入解释器对象中,解释器对象将句子解释成相应的结果。 优点: 1. 可扩展性好,增加新的文法规则只需要添加相应的非终结符表达式类即可。 2. 易于实现语法分析。 缺点: 1. 对于复杂的文法规则,解释器模式的类数量可能会很大,增加程序的复杂性。 2. 执行效率较低,因为需要递归调用解释器对象。 适用场景: 1. 可以用于处理一些简单的语言,如数学表达式、正则表达式等。 2. 当语言的文法规则比较复杂时,可以使用解释器模式进行语法分析。 3. 当需要对语言进行增强时,可以使用解释器模式添加新的文法规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希望早日退休的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值