Skip to content

Commit

Permalink
#6 인터프리터 패턴 BNF 관련 설명 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
soyeon207 committed May 5, 2021
1 parent 8540292 commit ef9e6d4
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 33 deletions.
1 change: 1 addition & 0 deletions _posts/2021-04-22-factory-method-pattern.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ tags: [디자인패턴, 생성패턴]

### 팩토리 메소드 패턴이란?
> **객체 생성 처리**를 서브 클래스로 분리해서 처리하도록 캡슐화 하는 패턴
- 팩토리 메소드 패턴은 디자인패턴에서 **생성패턴**에 속한다
- **[GOF]** 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내리도록 한다
- 어떤 클래스가 자신이 생성해야하는 객체의 클래스를 예측 할수 없을 때 사용
Expand Down
97 changes: 64 additions & 33 deletions _posts/2021-05-02-interpreter-pattern.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,67 @@ tags: [디자인패턴, 행동패턴]
---

### 인터프리터 패턴 (Interpreter Pattern)
> 미니 언어로 쓰여진 프로그램 -> Interpreter(통역) -> 문제 해결
- 문장을 해석할 떄 사용하는 패턴 , 즉 간이언어를 만들기 위한 패턴
- 문법 규칙을 클래스화 한 구조로써 일련의 규칙으로 정의된 언어를 해석하는 패턴
- 문법 규칙이 많아지면 복잡해지고 무거워지기 때문에 그때에는 파서 / 컴파일러를 쓰는게 좋다
- 언어를 해석할 땐 보통 BNF 형태로 나타내는 경우가 많음 -> 인터프리터 패턴도 BNF 구조의 언어를 해석하기 알맞게 디자인 되어있음
- 언어 분석기라고 생각하면 되며, 스크립트나 컴파일러 문법 등이 있을수 있다
- 예로 들어서 SQL 구문이나 Shell 커맨드 해석기 , 통신 프로토콜 등이 있다
- EX) 윈도우 운영체제 운영 프롬포트 : 명령어를 입력하면 여러 작업을 수행할 수 있게 해준다. 명령어는 명령 프롬포트에서 약속된 문법이다 명령어와 같이 약속된 문법을 해석하게 할 수 있는 해석자 패턴을 사용하면 클라이언트가 전달하는 구문을 해석하여 이에 대응되는 처리를 수행할 수 있도록 해 준다.

#### BNF란?
- 배커스-나우어 형식(Backus-Naur Form)의 약어
- 컴퓨터 언어에서 언어의 문법을 수학적인 수식으로 나타낼 때 사용하는 언어 도구

```
<digit> → 0 | 1 | 2 | … | 9
```

=> `<digit>`(구조이름 , LHS, 비단말 기호, Non-Terminal) 가 `0 | 1 | 2 | … | 9`(RHS, 단말 기호, Terminal) 로 정의됨을 의미

EX)
```
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<hex_letter> ::= A | B | C | D | E | F
<hex> ::= <digit> | <hex_letter>
```

**5 + 4 - 3 + 7 - 2**

![dsd](https://miro.medium.com/max/978/1*bbknPwwsOMcU7vLJK1fSdQ.png)

**무선 조정기로 자동차 움직이기**

자동차에게 내릴 수 있는 명령
- 앞으로 1미터 전진(go) / 우회전(right) / 좌회전(left)
- 반복(repeat)

```
program go end // 자동차가 앞으로 감
```

```
program repeat 4 go right end end // 자동차가 네모모양으로 돔
```

```
<program> ::= program <command list>
<command list> ::= <command> * end
<command> ::= <repeat command> | <primitive command>
<repeat command> ::= repeat <number> <command list>
<primitive command> ::= go | right | left
```
- `*` : 앞의 것을 0번 이상 반복한다는 의미
- `|` : 또는 이라는 의미

- terminal expression
- 문법 규칙에서, 더 이상 전개되지 않는 expression
- 문법 규칙의 종착점을 의미함
- go , right , left
- non-terminal expression
- 문법 규칙에서, 계속해서 다시 전개되는 expression
- `<program>` , `<command>`

### 언제 사용할까?
- 정의할 언어의 문법이 간단할 때 (문법이 복잡하면 관리할 클래스가 많아져 복잡해짐)
- 성능이 중요한 문제가 되지 않을 때
Expand All @@ -25,28 +79,6 @@ tags: [디자인패턴, 행동패턴]
- Non-Terminal Expression(Concrete Expression) : 문장의 비종료를 나타내는 해석자 클래스 구현체, Non-Terminal의 interpret()를 구현
- Client : interpreter() 를 호출

#### Non-Terminal Expression - AbstractExpression
- Aggregation (Shared Aggregation, 집합)
- 전체(비어있는 다이아몬드)와 부분의 관계를 가진다
- EX) 전체 : user, 부분 : address

#### Terminal vs Non-Terminal
- Terminal(상수) : id, +, -, *, / , 정의된 언어의 알파벳이나 기호로서 영문자의 소문자나 아라비아 숫자, 연산자 기호 등
- Non-Terminal(함수) : `<expression>`, `<term>`, `<factor>`, 언어에서 문자열을 생성하는 데 사용되는 중간과정의 기호

```
<expression> ::= <expression> + <term>
<expression> ::= <expression> - <term>
<term> ::= <term> * <factor>
<term> ::= <term> / <factor>
<term> ::= <factor>
<factor> ::= id
```

5 + 4 - 3 + 7 - 2
![dsd](https://miro.medium.com/max/978/1*bbknPwwsOMcU7vLJK1fSdQ.png)


### 장점, 단점
#### 장점
- 문법의 추가 및 수정, 구현이 쉬워진다
Expand All @@ -61,12 +93,11 @@ java.util.regex.Pattern : 정규표현식
java.text.Normalizer : 텍스트 정규화 (미리 정의된 규칙에 맞추어 텍스트를 변환하는 작업 )

### 레퍼런스
[https://booolean.tistory.com/471](https://booolean.tistory.com/471)

[https://blackinkgj.github.io/4_Grammar/](https://blackinkgj.github.io/4_Grammar/)

[https://medium.com/design-patterns-in-python/interpreter-pattern-ed521735906b](https://medium.com/design-patterns-in-python/interpreter-pattern-ed521735906b)

[https://copynull.tistory.com/147](https://copynull.tistory.com/147)

[https://beomseok95.tistory.com/288](https://beomseok95.tistory.com/288)
- [BNF란? https://blog.shar.kr/969](https://blog.shar.kr/969)
- [BNF 표기법 https://perfectacle.github.io/2018/08/15/bnf/](https://perfectacle.github.io/2018/08/15/bnf/)
- [Java로 배우는 디자인패턴 입문 http://contents.kocw.or.kr/document/lec/2012/DukSung/ChoiSeungHoon/14.pdf](http://contents.kocw.or.kr/document/lec/2012/DukSung/ChoiSeungHoon/14.pdf)
- [https://booolean.tistory.com/471](https://booolean.tistory.com/471)
- [https://blackinkgj.github.io/4_Grammar/](https://blackinkgj.github.io/4_Grammar/)
- [https://medium.com/design-patterns-in-python/interpreter-pattern-ed521735906b](https://medium.com/design-patterns-in-python/interpreter-pattern-ed521735906b)
- [https://copynull.tistory.com/147](https://copynull.tistory.com/147)
- [https://beomseok95.tistory.com/288](https://beomseok95.tistory.com/288)

0 comments on commit ef9e6d4

Please sign in to comment.