ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 인터프리터(Interpreter) 패턴 - 디자인 패턴
    CSE/Design Pattern 2015. 6. 13. 10:42

    Pattern #13  인터프리터 패턴




     간단한 언어의 문법을 정의하고 해석하는데 사용




     패턴 요약 

      - 문법을 재귀적으로 표현

      - 집합 객체에게 그 해석을 패스



     

     동기

      

      당신이 새롭게 맡은 일은 전략게임의 인공지능 부분에 대한 설계와 개발 작업이다. 게임의 인공지능은 수 많은 규칙(rule)들에 그 기반을 두고 있는데, 이러한 규칙들을 분석하고 실행하기 위해서는 논리식을 표현하고 계산할 수 있어야 한다. 변수와 논리곱(and), 논리합(or,) 부정(not), 상수(true, false)로 구성된 기본적인 predicate first logic을 표현하고 계산할 수 있는 논리 시스템을 설계하라. 



     BNF로 문법 표현










     


     BNF Syntax를 클래스다이어그램으로 표현
       - 일반적으로 BNF로 표현된 Syntax의 언어를 분석하면 part-whole 형태의 Tree 구조가 된다. 


     













     의도
     - 특정 언어가 주어졌을 때, 이 언어로 작성된 문장을 해석할 수 있도록, 언어의 문법을 표현하고 해석기능을 지원한다.
     - 간단한 문법에 대한 Interpreter 설계



     적용범위
     - 문법이 간단할 때 => 복잡한 문법의 경우 이를 표현하기 위한 class hierarchy가 비대해지고 관리하기 어려워진다.
     - 성능이 중요한 문제가 되지 않을 때 => Interpreter pattern은 특정 언어로 기술된 문장을 분석해서 객체들의 Tree 구조를 생성하기 때문에 속도나 효율은 떨어질 수 있다.



     결과
     - 문법을 변경하고 확장하기 좋음
     - 문법을 구현하기 쉬움 => Syntax tree의 각 노드들에 표현된 클래스들은 비슷한 구현을 가진다.
     - 복잡한 문법은 유지하기 어려움 => 문법 규칙이 많아질 수록 클래스 수도 따라 증가하여 관리하기 어려워진다.




    예제.


    Expression.java
    1
    2
    3
    4
    5
    6
    7
     
    package interpreter;
     
    public interface Expression {
        public String interpret(InterpreterContext ic);
    }
     
    cs

     



    InterpreterContext.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    package interpreter;
     
    public class InterpreterContext {
        public String getBinaryFormat(int i) {
            return Integer.toBinaryString(i);
        }
     
        public String getHexadecimalFormat(int i) {
            return Integer.toHexString(i);
        }
    }
     
    cs

     



     IntToBinaryExpression.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    package interpreter;
     
    public class IntToBinaryExpression implements Expression {
     
        private int i;
     
        public IntToBinaryExpression(int i) {
            this.i = i;
        }
     
        public String interpret(InterpreterContext ic) {
            return ic.getBinaryFormat(this.i);
        }
     
    }
     
    cs




    IntToHexExpression.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    package interpreter;
     
    public class IntToHexExpression implements Expression {
     
        private int i;
     
        public IntToHexExpression(int i) {
            this.i = i;
        }
     
        public String interpret(InterpreterContext ic) {
            return ic.getHexadecimalFormat(i);
        }
     
    }
     
    cs




    InterpreterMain.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    package interpreter;
     
    public class InterpreterMain {
        public InterpreterContext ic;
     
        public InterpreterMain(InterpreterContext i) {
            this.ic = i;
        }
     
        public String interpret(String str) {
            Expression exp = null;
     
            if (str.contains("Hexdecimal")) {
                exp = new IntToHexExpression(Integer.parseInt(str.substring(0,
                        str.indexOf(" "))));
            } else if (str.contains("Binary")) {
                exp = new IntToBinaryExpression(Integer.parseInt(str.substring(0,
                        str.indexOf(" "))));
            } else {
                return str;
            }
     
            return exp.interpret(ic);
        }
     
        public static void main(String[] args) {
            String str1 = "28 in Binary";
            String str2 = "28 in Hexadecimal";
     
            InterpreterMain ec = new InterpreterMain(new InterpreterContext());
            System.out.println(str1 + "= " + ec.interpret(str1));
            System.out.println(str2 + "= " + ec.interpret(str2));
     
        }
    }
     
    cs








     









     


    댓글

Designed by Tistory.