设计模式:27 其实你不懂老板的心_解释器模式

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释该语言中的句子。

 

适用于:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实力表述为一个简单语言中的句子。这样就可以构建一个解释器:该解释器通过解释这些句子来解决该问题。

当有一个语言需要解释执行时,并且你可将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式。

 

好处:很容易改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用集成来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类都易于直接编写。

 

缺点:为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理。

 

 

说白了,就是将一句话,转变成实际的命令执行。

 

实例:正则表达式的解析。

设计模式:27 其实你不懂老板的心_解释器模式_第1张图片

AbstractExpression(抽象表达式),生命一个抽象的解释操作,这个借口为抽象语法树中所有的节点所共享。

 

TerminalExpression(终结符表达式):实现与文法中的终结符相关联的解释操作。实现抽象表达式中所要求的借口,主要是interpret()方法。文法中每一个终结符都有一个具体终结表达式与之相对应。

 

NonterminalExpression(非终结符表达式):为文法中的非终结符实现解释操作,对文法中的每一条规则R1,R2,…,Rn都需要一个具体的非终结符表达式类。通过实现抽象表达式的interpret()方法实现解释操作。解释操作以递归方式调用上面所提到的代表R1,R2,…,Rn中各个符号的实例变量。

 

main.cpp

#include 
#include 
#include 
#include 
#include "Context.h"
#include "AbstractExpression.h"

using namespace std;

void process()
{
	Context context;
	vector< shared_ptr > vecExpression;
	vecExpression.push_back(shared_ptr(new TerminalExpression()));
	vecExpression.push_back(shared_ptr(new NonterminalExpression()));
	vecExpression.push_back(shared_ptr(new TerminalExpression()));
	vecExpression.push_back(shared_ptr(new TerminalExpression()));

	for(unsigned ui = 0 ; ui < vecExpression.size() ; ui++)
	{
		vecExpression[ui]->interpret(context);
	}
}

int main(int argc,char* argv[])
{
	process();
	system("pause");
	return 0;
}


Context.h

#ifndef CONTEXT_H
#define CONTEXT_H

#include 

using namespace std;

class Context
{
public:
	Context(void);
	~Context(void);
public:
	string _sInput;
	string _sOutput;
};
#endif


Context.cpp

#include "Context.h"


Context::Context(void)
{
}


Context::~Context(void)
{
}


AbstractExpression.h

#ifndef ABSTACTEPRESSION_H
#define ABSTACTEPRESSION_H

class Context;

//抽象表达式
class AbstractExpression
{
public:
	AbstractExpression(void);
	virtual ~AbstractExpression(void);
	virtual void interpret(const Context& context);
};

//终结符表达式
class TerminalExpression : public AbstractExpression
{
public:
	void interpret(const Context& context);
};

//非终结符表达式
class NonterminalExpression : public AbstractExpression
{
public:
	void interpret(const Context& context);
};

#endif


AbstractExpression.cpp

#include "AbstractExpression.h"
#include 

using namespace std;


AbstractExpression::AbstractExpression(void)
{
}


AbstractExpression::~AbstractExpression(void)
{
}

void AbstractExpression::interpret(const Context& context)
{
}


void TerminalExpression::interpret(const Context& context)
{
	cout << "终端解释器" << endl;
}

void NonterminalExpression::interpret(const Context& context)
{
	cout << "非终端解释器" << endl;
}


 

你可能感兴趣的:(设计模式)