STUDY/Design Pattern

해석자 패턴(Interpreter pattern)

디리릭 2022. 12. 28. 22:04
728x90

해석자 패턴에서는 사용자가 원하는 다양한 명령을 쉽게 표현할 수 있게 구문을 약속해야 한다. 그리고 해석자에서는 이와 같은 약속 된 구문을 입력 인자로 전달 되었을 때 이를 해석할 수 있어야 한다.

해석자 패턴을 사용하면 사용자가 다양한 명령을 쉬운 표현 방법으로 전달 할 수 있다. 하지만 복잡한 명령은 정규화 과정에 들어가는 비용이 기하급수적으로 커질 수 있으므로 단순화할 수 있는 경우에만 사용하는것 유용하다.

구조

▷ Context : 번역기에 대한 포괄적인 정보 포함

▷ AbstractExpression : 번역에 대한 인터페이스

▷ TerminalExpression : 문법에 정의한 터미널 기호와 관련 된 해석 방법을 구현.

▷ NonTerminalExpression : 모든 기호에 대해서 클래스 정의

구현

 public interface AbstractExpression
    {
        bool interpreter(string con);
    }
    
    ======================================
    
      public class TerminalExpression : AbstractExpression
    {
        private string data;
        public TerminalExpression(string data) 
        {
            this.data = data;
        }
        public bool interpreter(string con)
        {
            if (con.Contains(data))
            {
                return true;
            }
            else 
            {
                return false;
            }
        }
    }
    
    ======================================
    
       //NonTerminalExpression
    public class OrExpression : AbstractExpression
    {
        private AbstractExpression expr1;
        private AbstractExpression expr2;

        public OrExpression(AbstractExpression expr1, AbstractExpression expr2) 
        {
            this.expr1 = expr1;
            this.expr2 = expr2;
        }
        public bool interpreter(string con)
        {
            return expr1.interpreter(con) || expr2.interpreter(con);
        }
    }
    
    ======================================
    
      //NonTerminalExpression
    public class AndExpression : AbstractExpression
    {
        private AbstractExpression expr1;
        private AbstractExpression expr2;

        public AndExpression(AbstractExpression expr1, AbstractExpression expr2) 
        {
            this.expr1 = expr1;
            this.expr2 = expr2;
        }
        public bool interpreter(string con)
        {
            return expr1.interpreter(con) && expr2.interpreter(con);
        }
    }
    
    ======================================
     static void Main(string[] args)
        {
            AbstractExpression person1 = new TerminalExpression("Kushagra");
            AbstractExpression person2 = new TerminalExpression("Lokesh");
            AbstractExpression isSingle = new OrExpression(person1, person2);

            AbstractExpression vikram = new TerminalExpression("Vikram");
            AbstractExpression committed = new TerminalExpression("Committed");
            AbstractExpression isCommitted = new AndExpression(vikram, committed);

            Console.WriteLine(isSingle.interpreter("Kushagra"));
            Console.WriteLine(isSingle.interpreter("Lokesh"));
            Console.WriteLine(isSingle.interpreter("Achint"));

            Console.WriteLine(isCommitted.interpreter("Committed, Vikram"));
            Console.WriteLine(isCommitted.interpreter("Single, Vikram"));

            Console.ReadLine();

        }

RESULT >>>>>

HW)

기술개발할 떄 여기 저기 구문 분석할 일이 있을것이다.

그래서

-XML 파서 만들기

- Json 파서 만들기

-애국가를 기반으로 텍스트 파져 만들기=> (동사, 명사, 조사, 형용사)만 뽑아내기

728x90