简介

解释器模式的定义是对于指定的语言,定义它的语法,并定义一个解释器,使用该语法来解释句子。解释器模式的使用的范围比较小,因此使用并不多见。多常用于词法解析,例如sql语句解析,正则表达式解析,编译器语法解析,计算表达式解析等。

UML类图

clipboard.png

示例

使用计算表达式来说明解释器模式,其中变量是终结符表达式,加法和减法是非终结符表达式。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;
}

one_piece
26 声望8 粉丝

« 上一篇
命令模式
下一篇 »
迭代器模式