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
'STUDY > Design Pattern' 카테고리의 다른 글
반복자 패턴 (Iterator Pattern) (0) | 2022.12.28 |
---|---|
명령패턴 (Command Pattern) (0) | 2022.12.28 |
책임 연쇄 패턴(Chain of Responsibility Pattern) (0) | 2022.12.28 |
프록시 패턴(Proxy Pattern) (0) | 2022.12.19 |
경량 패턴(Flyweight Pattern) (0) | 2022.12.19 |