简介
解释器模式的定义是对于指定的语言,定义它的语法,并定义一个解释器,使用该语法来解释句子。解释器模式的使用的范围比较小,因此使用并不多见。多常用于词法解析,例如sql语句解析,正则表达式解析,编译器语法解析,计算表达式解析等。
UML类图
示例
使用计算表达式来说明解释器模式,其中变量是终结符表达式,加法和减法是非终结符表达式。CContext类中存放了变量的值。
解释器相关类,interpreter.h
#ifndef INTERPRETER_H
#define INTERPRETER_H
#include <map>
using namespace std;
class CContext;
class CExpression
{
public:
virtual int Interpret(CContext* pContext) = 0;
};
class CVariable:public CExpression
{
public:
bool operator <(const CVariable& var) const
{
return false;
}
int Interpret(CContext* pContext);
};
class CAddInterpreter:public CExpression
{
public:
CAddInterpreter(CExpression* pExprLeft, CExpression* pExprRight)
{
m_pExprLeft = pExprLeft;
m_pExprRight = pExprRight;
}
int Interpret(CContext* pContext);
private:
CExpression* m_pExprLeft;
CExpression* m_pExprRight;
};
class CSubtractInterpreter:public CExpression
{
public:
CSubtractInterpreter(CExpression* pExprLeft, CExpression* pExprRight)
{
m_pExprLeft = pExprLeft;
m_pExprRight = pExprRight;
}
int Interpret(CContext* pContext);
private:
CExpression* m_pExprLeft;
CExpression* m_pExprRight;
};
class CContext
{
public:
void SetValue(CExpression* pVar, int nValue)
{
m_map.insert(make_pair(pVar, nValue));
}
int GetValue(CExpression* pVar)
{
return m_map[pVar];
}
private:
map<CExpression*, int> m_map;
};
#endif
解释器相关实现,interpreter.cpp
#include "interpreter.h"
int CVariable::Interpret(CContext* pContext)
{
return pContext->GetValue(this);
}
int CAddInterpreter::Interpret(CContext* pContext)
{
return m_pExprLeft->Interpret(pContext) + m_pExprRight->Interpret(pContext);
}
int CSubtractInterpreter::Interpret(CContext* pContext)
{
return m_pExprLeft->Interpret(pContext) - m_pExprRight->Interpret(pContext);
}
客户端调用,main.cpp
#include "interpreter.h"
#include <iostream>
#define SAFE_DELETE(p) if(p){delete (p); (p) = NULL;}
int main(int argc, char* argv[])
{
CContext* pContext = new CContext;
CExpression* pVar1 = new CVariable;
CExpression* pVar2 = new CVariable;
pContext->SetValue(pVar1, 10);
pContext->SetValue(pVar2, 30);
CExpression* pVarSub = new CSubtractInterpreter(pVar2, pVar1);
CExpression* pExpr = new CAddInterpreter(pVar1, pVarSub);
cout<<pExpr->Interpret(pContext)<<endl;
SAFE_DELETE(pVar1);
SAFE_DELETE(pVar2);
SAFE_DELETE(pVarSub);
SAFE_DELETE(pExpr);
SAFE_DELETE(pContext);
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。