본문 바로가기
Theory/Design Pattern

Interpreter Pattern

by y.j 2022. 5. 14.
728x90

Interpreter Pattern

자연어에서 문법에 따라 문장을 해석하는 역할을 한다.

문법은 언어의 구조를 표현하는 방법을 의미한다. Interpreter는 언어의 문장을 통역하는 규칙의 리스트를 가지고 있다. 언어의 모든 문장은 abstract syntax tree(AST)를 통해 class들을 instance하고 있다.

 

Solution

1. Expression class hierarchy구조로 문법을 정의한다.

 -  expression을 해석할 수 있는 interface를 정의한다. 

public abstract class AbstractExpression {
    private String name;
    public AbstractExpression(String name) {
        this.name = name;
    }
    public abstract void interpret(Context context);

    public String getName() {
        return name;
    }

    public boolean add(AbstractExpression e) {
        return false;
    }
}

 - interpret을 구현 할 수 있는 class를 정의한다.

public class TerminalExpression extends AbstractExpression {
    public TerminalExpression(String name) {
        super(name);
    }

    @Override
    public void interpret(Context context) {

    }
}

 

2. AST로 언어의 문장을 표현한다.

 - expression object는 재귀적으로 composite/tree구조로 구성되어져 있다.

public void interpreterPatternTest() {
    AbstractExpression ntExpr2 = new NonTerminalExpression("ntExpr2");
    ntExpr2.add(new TerminalExpression(" tExpr3"));
    ntExpr2.add(new TerminalExpression(" tExpr4"));
    ntExpr2.add(new TerminalExpression(" tExpr5"));
    AbstractExpression ntExpr1 = new NonTerminalExpression("ntExpr1");
    ntExpr1.add(new TerminalExpression("tExpr1"));
    ntExpr1.add(ntExpr2);
    ntExpr1.add(new TerminalExpression("tExpr2"));
    Context context = new Context();
    ntExpr1.interpret(context);
}

3. AST구조에서 interpet을 호출함으로써 문장을 해석한다.

 

Advantages

• 문법을 쉽게 수정 할 수 있다.

 - 문법 규칙을 AST구조를 통해서 정의하기 때문에 수정하기 쉽다.

 - Client는 AbstractExpression 인터페이스를 참조하여 구현에 독립적이다.

 - Client입장에서는 terminal or nonterminal expression 클래스를 추가하는데 변경되는 부분은 없다.
• 새로운 종류의 interpret operation을 추가하는 것이 쉽다.

 - expression의 구조를 변경하지 않고 interpret operation의 새로운 정의를 하는데 Visitor패턴이 사용될 수 있다.

Disadvantages 

• 복잡한 문법들을 표현하기 어렵다.

 - interpreter패턴은 문법 규칙을 표현하는 클래스가 적어도 한개는 사용해야 한다.

   그래서 문법이 복잡하면 할 수록 class의 구조를 커지고 유지보수하기 어렵다.

   Parser generator가 대안책이 될 수 있다.

 

[전체코드]

https://github.com/jKyounju/adapterPatterns/tree/master/src/BehavioralPattern/InterpreterPattern

https://github.com/jKyounju/adapterPatterns/blob/master/test/BehavioralPattern/InterpreterPatternTest.java

728x90

'Theory > Design Pattern' 카테고리의 다른 글

Mediator Pattern  (0) 2022.05.15
Iterator Pattern  (0) 2022.05.15
Command Pattern  (0) 2022.05.12
Chain Of Responsibility Pattern  (0) 2022.05.10
Flyweight Pattern  (0) 2022.05.09

댓글