프로그래밍/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