Qt C++ interpreter模式 (解譯器模式)

來源:互聯網
上載者:User

這個模式常用於Regex等

interpreter.h

#pragma once

#include <QDebug>

class CVariable;

class CVarientContext
{
public:
CVarientContext(){}
virtual ~CVarientContext(){}
virtual void addVarient(CVariable* key,int val) = 0;
virtual void removeVarient(CVariable* key) = 0;
virtual void setVarient(CVariable* key,int val) = 0;
virtual int getVarient(CVariable* key) const = 0;

protected:
QMap<CVariable* ,int> m_mapVar;
};

class CDataVarient : public CVarientContext
{
public:
CDataVarient(){}
virtual ~CDataVarient(){}
void addVarient(CVariable* key,int val)
{
m_mapVar.insert(key,val);
}
void removeVarient(CVariable* key)
{
m_mapVar.remove(key);
}
void setVarient(CVariable* key,int val)
{
m_mapVar.insert(key,val);
}
int getVarient(CVariable* key) const
{
return m_mapVar.value(key);
}
};

class CAbstractMathExpress
{
public:
virtual int interpret(CVarientContext *varient) = 0;
};

class CContext : public CAbstractMathExpress
{
public:
CContext(int k):m_k(k){}
virtual ~CContext(){}
int interpret(CVarientContext *varient){return m_k;}
private:
int m_k;
};

class CVariable : public CAbstractMathExpress
{
public:
CVariable(QString name):m_name(name){}
virtual ~CVariable(){}
QString getName() const{return m_name;}

int interpret(CVarientContext *varient);

private:
QString m_name;
};

class CAddExpress : public CAbstractMathExpress
{
public:
CAddExpress(CAbstractMathExpress* left,CAbstractMathExpress* right)
:m_left(left),m_right(right){}

int interpret(CVarientContext *varient);
private:
CAbstractMathExpress *m_left;
CAbstractMathExpress *m_right;

};

class CSubExpress : public CAbstractMathExpress
{
public:
CSubExpress(CAbstractMathExpress* left,CAbstractMathExpress* right)
:m_left(left),m_right(right){}

int interpret(CVarientContext *varient);
private:
CAbstractMathExpress *m_left;
CAbstractMathExpress *m_right;

};

class CMulExpress : public CAbstractMathExpress
{
public:
CMulExpress(CAbstractMathExpress* left,CAbstractMathExpress* right)
:m_left(left),m_right(right){}

int interpret(CVarientContext *varient);
private:
CAbstractMathExpress *m_left;
CAbstractMathExpress *m_right;

};

class CDivExpress : public CAbstractMathExpress
{
public:
CDivExpress(CAbstractMathExpress* left,CAbstractMathExpress* right)
:m_left(left),m_right(right){}

int interpret(CVarientContext *varient);
private:
CAbstractMathExpress *m_left;
CAbstractMathExpress *m_right;

};


interpreter.cpp

#include "interpreter.h"

int CVariable::interpret(CVarientContext *varient)
{
return varient->getVarient(this);
}

int CAddExpress::interpret(CVarientContext *varient)
{
return m_left->interpret(varient) + m_right->interpret(varient);
}

int CSubExpress::interpret(CVarientContext *varient)
{
return m_left->interpret(varient) - m_right->interpret(varient);
}

int CMulExpress::interpret(CVarientContext *varient)
{
return m_left->interpret(varient) * m_right->interpret(varient);
}

int CDivExpress::interpret(CVarientContext *varient)
{
return m_left->interpret(varient) / m_right->interpret(varient);
}


main.cpp

#include <QApplication>
#include "interpreter.h"

int main(int argc,char **argv)
{
QApplication app(argc,argv);

CVarientContext *context = new CDataVarient();

CVariable *a = new CVariable("A");
CVariable *b = new CVariable("B");
context->addVarient(a,20);
context->addVarient(b,10);
CAbstractMathExpress *exp = new CAddExpress(a,b);

int value = exp->interpret(context);

return app.exec();
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.