프로그래밍/GoF
[행동 패턴] - 해석자(Interpreter)
MAKGA
2022. 1. 6. 22:50
320x100
구조
#include <iostream>
#include <string>
#include <queue>
#include <list>
class Context
{
};
class AbstractExpression
{
public:
virtual std::string Interpret(Context context) = 0;
};
class TerminalExpression : public AbstractExpression
{
public:
std::string Interpret(Context context) override
{
return "Terminal Expression";
}
};
class NonTerminalExpression : public AbstractExpression
{
private:
std::list<AbstractExpression*> sub_expressions_;
public:
NonTerminalExpression()
{
}
std::string Interpret(Context context) override
{
std::string str = "Non Terminal Expression\n";
for (auto* sub_expression : sub_expressions_)
{
str += "└ " + sub_expression->Interpret(context) + '\n';
}
return str;
}
void AddSubExpression(AbstractExpression* expression)
{
sub_expressions_.push_back(expression);
}
};
사용
int main()
{
Context context = Context();
NonTerminalExpression expression;
expression.AddSubExpression(new TerminalExpression);
expression.AddSubExpression(new TerminalExpression);
std::cout << expression.Interpret(context);
system("pause");
return 0;
}
여러 객체(TerminalExpression)들을 조합해 문법을 정의할 수 있게 한다.
각각의 객체(TerminalExpression)는 특정한 문법에 대해 처리할 수 있게 만들어지고, 이들이 모여 컴포지트 패턴과 같은 복합적인 트리 구조로 이루어지게 된다.
게임에서는 Behavior Tree가 이와 비슷한 패턴으로 만들어진다.
320x100