-----------------------------------------------------------------------------
[Interpreter]
의도:
어떤 언어는 문법에 대한 표현을 정의하면서 그 언어로 기술된 문장을 해석하는 기법을 표현하기
위해서 인터프리터도 함께 정의하는 경우가 있다.
-----------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
//
// A Behavioral part of GoF's Design Patterns
//
// - Interpreter
//
/////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <tchar.h>
#include <string>
#include <list>
#include <deque>
#include <vector>
#include <map>
#include <iostream>
/////////////////////////////////////////////////////////////////////////////
//
// Interpreter
//
//
/////////////////////////////////////////////////////////////////////////////
class Context
{
public:
std::map<std::string, bool> Variables_;
};
class AbstractExpression
{
public:
virtual bool Interpret(Context&) = 0;
};
class TerminalExpression_Variable: public AbstractExpression
{
public:
explicit TerminalExpression_Variable (std::string n) : Name_(n)
{
}
public:
virtual bool Interpret(Context& context)
{
return context.Variables_[Name_];
}
private:
std::string Name_;
};
class NonterminalExpression_And: public AbstractExpression
{
public:
NonterminalExpression_And (AbstractExpression* p1, AbstractExpression* p2) :
Operand1_(p1),
Operand2_(p2)
{
}
public:
virtual bool Interpret(Context& context)
{
return Operand1_->Interpret(context) && Operand2_->Interpret(context);
}
private:
AbstractExpression* Operand1_;
AbstractExpression* Operand2_;
};
class NonterminalExpression_Or: public AbstractExpression
{
public:
NonterminalExpression_Or (AbstractExpression* p1, AbstractExpression* p2) :
Operand1_(p1),
Operand2_(p2)
{
}
public:
virtual bool Interpret(Context& context)
{
return Operand1_->Interpret(context) || Operand2_->Interpret(context);
}
private:
AbstractExpression* Operand1_;
AbstractExpression* Operand2_;
};
/////////////////////////////////////////////////////////////////////////////
//
// Startup
//
//
/////////////////////////////////////////////////////////////////////////////
bool _tmain(bool argc, _TCHAR* argv[])
{
Context context;
context.Variables_["A"] = 1;
context.Variables_["B"] = 1;
context.Variables_["C"] = 0;
TerminalExpression_Variable a("A");
TerminalExpression_Variable b("B");
TerminalExpression_Variable c("C");
NonterminalExpression_Or exp1 (&a, &b);
NonterminalExpression_And exp2 (&exp1, &c);
bool result = exp2.Interpret(context);
std::cout << "result=" << result << std::endl;
return 0;
};
-----------------------------------------------------------------------------
result=0