解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释该语言中的句子。
适用于:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实力表述为一个简单语言中的句子。这样就可以构建一个解释器:该解释器通过解释这些句子来解决该问题。
当有一个语言需要解释执行时,并且你可将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式。
好处:很容易改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用集成来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类都易于直接编写。
缺点:为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理。
说白了,就是将一句话,转变成实际的命令执行。
实例:正则表达式的解析。
AbstractExpression(抽象表达式),生命一个抽象的解释操作,这个借口为抽象语法树中所有的节点所共享。
TerminalExpression(终结符表达式):实现与文法中的终结符相关联的解释操作。实现抽象表达式中所要求的借口,主要是interpret()方法。文法中每一个终结符都有一个具体终结表达式与之相对应。
NonterminalExpression(非终结符表达式):为文法中的非终结符实现解释操作,对文法中的每一条规则R1,R2,…,Rn都需要一个具体的非终结符表达式类。通过实现抽象表达式的interpret()方法实现解释操作。解释操作以递归方式调用上面所提到的代表R1,R2,…,Rn中各个符号的实例变量。
main.cpp
#include <iostream>
#include <stdlib.h>
#include <vector>
#include <memory>
#include "Context.h"
#include "AbstractExpression.h"
using namespace std;
void process()
{
Context context;
vector< shared_ptr<AbstractExpression> > vecExpression;
vecExpression.push_back(shared_ptr<AbstractExpression>(new TerminalExpression()));
vecExpression.push_back(shared_ptr<AbstractExpression>(new NonterminalExpression()));
vecExpression.push_back(shared_ptr<AbstractExpression>(new TerminalExpression()));
vecExpression.push_back(shared_ptr<AbstractExpression>(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 <string>
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 <iostream>
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;
}