๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Computer Science

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๊ตฌ๋ฌธ์˜ ํ‘œํ˜„ - BNF, EBNF, ๊ตฌ๋ถ„ ๋„ํ‘œ ํ‘œํ˜„๋ฒ•

by Leica 2019. 10. 16.
๋ฐ˜์‘ํ˜•

BNF ํ‘œํ˜„๋ฒ•

BNF(Backus-Naur Form)๋Š” Algol์˜ ๊ตฌ๋ฌธ์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ์ปค์Šค(Backus)์™€ ๋‚˜์šฐ์–ด(Naur)๊ฐ€ ์‚ฌ์šฉํ•œ ํ‘œํ˜„๋ฒ•์ด๋‹ค.

 

BNF ๊ธฐํ˜ธ

๋ฉ”ํƒ€ ๊ธฐํ˜ธ

BNF๋Š” ์„ธ ๊ฐ€์ง€ ๋ฉ”ํƒ€ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฉ”ํƒ€ ๊ธฐํ˜ธ ์˜๋ฏธ
::= ์ •์˜
| ํƒ์ผ(OR)
<> ๋น„๋‹จ๋ง ๊ธฐํ˜ธ

- BNF์—์„œ ๊ทœ์น™์€ ๋ฉ”ํƒ€ ๊ธฐํ˜ธ ::=๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•œ๋‹ค.

- ::=๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ •์˜ํ•œ๋‹ค.

- ::=์˜ ์™ผ์ชฝ์—๋Š” ํ•˜๋‚˜์˜ ๋น„๋‹จ๋ง ๊ธฐํ˜ธ๊ฐ€, ์˜ค๋ฅธ์ชฝ์—๋Š” ๊ธฐํ˜ธ๋“ค์„ ํ™œ์šฉํ•˜์—ฌ ์ •์˜ํ•˜๋Š” ๋‚ด์šฉ์ด ๋‚˜์™€์•ผ ํ•œ๋‹ค.

 

๋‹จ๋ง/๋น„๋‹จ๋ง ๊ธฐํ˜ธ

๊ธฐํ˜ธ ์˜๋ฏธ ์˜ˆ
๋‹จ๋ง ๊ธฐํ˜ธ ๋ฉ”ํƒ€ ๊ธฐํ˜ธ <>๋กœ ๋ฌถ์ธ ๊ธฐํ˜ธ <identifier>, <letter>, <digit>, ...
๋น„๋‹จ๋ง ๊ธฐํ˜ธ ๋น„๋‹จ๋ง ๊ธฐํ˜ธ ๋ฐ ๋ฉ”ํƒ€ ๊ธฐํ˜ธ๊ฐ€ ์•„๋‹Œ ๊ธฐํ˜ธ A, B, a, b, 0, 1, if, then, +, -, ...

 

BNF์˜ ์˜ˆ

<if๋ฌธ> ::= if <๋…ผ๋ฆฌ์‹> then <๋ฌธ์žฅ>

if๋ฌธ์˜ ์ •์˜๋ฅผ BNF๋กœ ํ‘œํ˜„ํ•œ ๊ทœ์น™์˜ ์˜ˆ์ด๋‹ค. ์ด ๊ทœ์น™์€ ๋น„๋‹จ๋ง ๊ธฐํ˜ธ <if๋ฌธ>์„ ๋‹จ๋ง ๊ธฐํ˜ธ if, then ๊ทธ๋ฆฌ๊ณ  ๋น„๋‹จ๋ง ๊ธฐํ˜ธ <๋…ผ๋ฆฌ์‹>๊ณผ <๋ฌธ์žฅ>์„ ์ด์šฉํ•˜์—ฌ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.

 

<if๋ฌธ> ::= if <๋…ผ๋ฆฌ์‹> then <๋ฌธ์žฅ> else <๋ฌธ์žฅ> | if <๋…ผ๋ฆฌ์‹> then <๋ฌธ์žฅ>

๋ฉ”ํƒ€ ๊ธฐํ˜ธ |์€ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํƒ์ผํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

BNF๋กœ ์‹๋ณ„์ž๋ฅผ ์ •์˜ํ•ด ๋ณด์ž. ์‹๋ณ„์ž๋Š” ๋ฌธ์ž์™€ ์ˆซ์ž๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ์ฒซ ๊ธ€์ž๋Š” ๋ฌธ์ž์—ฌ์•ผ ํ•œ๋‹ค. ๋ฌธ์ž๋Š” ๋Œ€๋ฌธ์ž ์•ŒํŒŒ๋ฒณ๊ณผ ์†Œ๋ฌธ์ž ์•ŒํŒŒ๋ฒณ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ˆซ์ž๋Š” 0๋ถ€ํ„ฐ 9๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, BNF ํ‘œํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

<identifier> ::= <letter> | <identifier><letter> | <identifier><digit>
<letter> ::= A | B | C | ... | X | Y | Z | a | b | ... | z |
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

 

BNF์˜ ํ™•์žฅ - EBNF ํ‘œํ˜„๋ฒ•

EBNF(Extended BNF)๋Š” BNF์— ๋ฉ”ํƒ€ ๊ธฐํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ทœ์น™์„ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™•์žฅ๋œ BNF์ด๋‹ค. 4๊ฐ€์ง€ ๋ฉ”ํƒ€ ๊ธฐํ˜ธ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

๊ตฌ๋ถ„
๋ฉ”ํƒ€ ๊ธฐํ˜ธ ์˜๋ฏธ
BNF
::= ์ •์˜
BNF
| ํƒ์ผ(OR)
BNF
<> ๋น„๋‹จ๋ง ๊ธฐํ˜ธ
EBNF [ ]
์ƒ๋žต ๊ฐ€๋Šฅ
EBNF { } 0๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต
EBNF ( )

ํ•œ์ •๋œ ๋ฒ”์œ„์˜ ํƒ์ผ

|์™€ ํ•จ๊ป˜ ์“ฐ์ž„

EBNF ' ' ๋ฉ”ํƒ€ ๊ธฐํ˜ธ ์ž์ฒด๋ฅผ ๋‹จ๋ง ๊ธฐํ˜ธ๋กœ ์‚ฌ์šฉ

 

๋ฉ”ํƒ€ ๊ธฐํ˜ธ [ ]์˜ ์˜ˆ

์˜๋ฏธ : ์ƒ๋žต ๊ฐ€๋Šฅ

์•ž์—์„œ ๋ณด์•˜๋˜ <if๋ฌธ> ์ •์˜ ๊ทœ์น™์˜ BNF ํ‘œํ˜„์„ EBNF๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

BNF
<if๋ฌธ> ::= if <๋…ผ๋ฆฌ์‹> then <๋ฌธ์žฅ> else <๋ฌธ์žฅ> | if <๋…ผ๋ฆฌ์‹> then <๋ฌธ์žฅ>

EBNF
<if๋ฌธ> ::= if <๋…ผ๋ฆฌ์‹> then <๋ฌธ์žฅ> [ else <๋ฌธ์žฅ> ]

 

๋ฉ”ํƒ€ ๊ธฐํ˜ธ { }์˜ ์˜ˆ

์˜๋ฏธ : 0๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต

๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜(unsigned integer)๋ฅผ BNF์™€ EBNF๋กœ ๊ฐ๊ฐ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

BNF
<unsigned integer> ::= <digit> | <unsigned integer><digit>

EBNF
<unsigned integer> ::= <digit> { <digit> }

 

์œ„ BNF ํ‘œํ˜„์€ ๋ฐ˜๋ณต์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด |์™€ ์žฌ๊ท€์ ์ธ ํ‘œํ˜„ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

EBNF ํ‘œํ˜„์—์„œ ๋น„๋‹จ๋ง ๊ธฐํ˜ธ <unsigned integer>๋Š” ๋ฉ”ํƒ€ ๊ธฐํ˜ธ { }๋กœ ๋ฌถ์ธ '<digit>'์„ 0๋ฒˆ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ƒฅ ํ•œ ์ž๋ฆฌ ์ˆ˜์ธ <digit>์ด ๋  ์ˆ˜๋„ ์žˆ๊ณ  ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ์ž๋ฆฌ ์ˆ˜์ธ <digit><digit>์ด ๋  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ ๊ทธ ์ด์ƒ์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

 

<unsigned integer> = <digit>

<unsigned integer> = <digit><digit>

<unsigned integer> = <digit><digit><digit>

<unsigned integer> = <digit><digit><digit><digit><digit><digit>, ...

 

๋ฉ”ํƒ€ ๊ธฐํ˜ธ ( )์˜ ์˜ˆ

์˜๋ฏธ : ๋ฒ”์œ„ ์ค‘ ํƒ์ผ

์‚ฌ์น™ ์—ฐ์‚ฐ ์ˆ˜์‹์„ BNF์™€ EBNF๋กœ ๊ฐ๊ฐ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

BNF
<์ˆ˜์‹> ::= <์ˆ˜์‹> + <์ˆ˜์‹> | <์ˆ˜์‹> - <์ˆ˜์‹> | <์ˆ˜์‹> * <์ˆ˜์‹> | <์ˆ˜์‹> / <์ˆ˜์‹>

EBNF
<์ˆ˜์‹> ::= <์ˆ˜์‹> ( + | - | * | / ) <์ˆ˜์‹>

 

EBNF ํ‘œํ˜„์—์„œ ( )๋กœ ๋ฌถ์€ ๋ฒ”์œ„, ์ฆ‰ +, -, *, / ์ค‘ ํ•œ ๊ฐ€์ง€ ์—ฐ์‚ฐ์ž๋งŒ ํƒ์ผํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ทœ์น™์ด๋‹ค.

 

๋ฉ”ํƒ€ ๊ธฐํ˜ธ ' '์˜ ์˜ˆ

์˜๋ฏธ : ๋ฉ”ํƒ€ ๊ธฐํ˜ธ ์ž์ฒด๋ฅผ ๋‹จ๋ง ๊ธฐํ˜ธ๋กœ ์‚ฌ์šฉ

BNF ๊ทœ์น™์„ ::=๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ตฌ์„ฑ๋จ์„ EBNF๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

<BNF ๊ทœ์น™> ::= <์™ผ์ชฝ ๋ถ€๋ถ„> '::=' <์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„>

 

๋ฉ”ํƒ€ ๊ธฐํ˜ธ ::=๋ฅผ ' '๋กœ ๋ฌถ์Œ์œผ๋กœ์จ ํ•˜๋‚˜์˜ ๋‹จ๋ง ๊ธฐํ˜ธ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๋งŒ์ผ ๋ฉ”ํƒ€ ๊ธฐํ˜ธ ' '๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ทœ์น™์˜ ์ •์˜๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋ฉ”ํƒ€ ๊ธฐํ˜ธ๊ฐ€ ๋˜์–ด ์ž˜๋ชป๋œ ํ‘œํ˜„์ด ๋œ๋‹ค.

 

๊ตฌ๋ฌธ ๋„ํ‘œ(Syntax Diagram)

๊ตฌ๋ฌธ ๋„ํ‘œ๋Š” ์ˆœ์„œ๋„์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๊ทธ๋ฆผ(๋„ํ‘œ)์œผ๋กœ ๊ตฌ๋ฌธ์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ดˆ๊ธฐ Pascal์˜ ์‚ฌ์šฉ์ž ์„ค๋ช…์„œ์— ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.

 

๊ตฌ๋ฌธ ๋„ํ‘œ์˜ ๊ธฐ๋ณธ ๋‹จ์œ„

๋„ํ˜• ์˜๋ฏธ
โ–ก (์‚ฌ๊ฐํ˜•)
๋น„๋‹จ๋ง ๊ธฐํ˜ธ
โ—‹ (์›) ๋‹จ๋ง ๊ธฐํ˜ธ
(ํ™”์‚ดํ‘œ) ๊ธฐํ˜ธ ์—ฐ๊ฒฐ

์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ if์™€ then์€ ๋‹จ๋ง ๊ธฐํ˜ธ, ๋…ผ๋ฆฌ์‹๊ณผ ๋ฌธ์žฅ์€ ๋น„๋‹จ๋ง ๊ธฐํ˜ธ์ด๋‹ค. ๊ทœ์น™์€ ํ™”์‚ดํ‘œ๋ฅผ ๋”ฐ๋ผ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ด๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ •์˜๋œ๋‹ค. ํ™”์‚ดํ‘œ๋Š” ๋‚˜๋ˆ„์–ด์ง€๊ฑฐ๋‚˜ ํ•ฉ์ณ์ง€๊ธฐ๋„ ํ•˜๊ณ  ๋˜๋Œ์•„๊ฐ€๊ธฐ๋„ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ํ†ตํ•ด ํƒ์ผ, ๋ฐ˜๋ณต์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ ๊ตฌ๋ฌธ์ด ์ ์šฉ๋  ๋•Œ ํ•œ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

 

if๋ฌธ์˜ ๊ตฌ๋ฌธ ๋„ํ‘œ

  • BNF : <if๋ฌธ> ::= if <๋…ผ๋ฆฌ์‹> then <๋ฌธ์žฅ> | if <๋…ผ๋ฆฌ์‹> then <๋ฌธ์žฅ> else <๋ฌธ์žฅ>
  • EBNF : <if๋ฌธ> ::= if <๋…ผ๋ฆฌ์‹> then <๋ฌธ์žฅ> [ else <๋ฌธ์žฅ> ]

 

๊ตฌ๋ฌธ ๋„ํ‘œ์˜ ์˜ˆ

์‚ฌ์น™ ์—ฐ์‚ฐ ์ˆ˜์‹์˜ ๊ตฌ๋ฌธ ๋„ํ‘œ

  • BNF : <์ˆ˜์‹> ::= <์ˆ˜์‹> + <์ˆ˜์‹> | <์ˆ˜์‹> - <์ˆ˜์‹> | <์ˆ˜์‹> * <์ˆ˜์‹> | <์ˆ˜์‹> / <์ˆ˜์‹>
  • EBNF : <์ˆ˜์‹> ::= <์ˆ˜์‹> ( + | - | * | / ) <์ˆ˜์‹>

 

๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜์˜ ๊ตฌ๋ฌธ ๋„ํ‘œ

BNF : <unsigned integer> ::= <digit> | <unsigned integer><digit>

EBNF : <unsigned integer> ::= <digit> { <digit> }

 

ํ‘œํ˜„ ๋ฐฉ๋ฒ•์˜ ์ƒํ˜ธ ๋ณ€ํ™˜

BNF, EBNF, ๊ตฌ๋ฌธ ๋„ํ‘œ ํ‘œํ˜„์€ ์ƒํ˜ธ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

BNF EBNF ๊ตฌ๋ฌธ ๋„ํ‘œ
| [ ] ํ™”์‚ดํ‘œ๋ฅผ ๋‚˜๋ˆ”
( )์˜ ๋ฐ”๊นฅ ๋ถ€๋ถ„์„ ๋ฐ˜๋ณตํ•˜์—ฌ ํ‘œํ˜„ ( ) ํ™”์‚ดํ‘œ๋ฅผ ๋‚˜๋ˆ”
{ }๋กœ ๋ฌถ์ธ ๋ถ€๋ถ„์ด 0๋ฒˆ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์™€ ํ•œ ๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ์žฌ๊ท€์ ์œผ๋กœ ํ‘œํ˜„ { } ํ™”์‚ดํ‘œ๋ฅผ ๋˜๋Œ์•„๊ฐ€๊ฒŒ ํ•จ

 

์‹๋ณ„์ž(identifier)์˜ ์ •์˜๋ฅผ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ‘œํ˜„ํ•ด ๋ณด์ž. ๋ฌธ์ž(letter)์™€ ์ˆซ์ž(digit)๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ์ฒซ ๊ธ€์ž๋Š” ๋ฌธ์ž๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ํŽธ์˜์ƒ ๋ฌธ์ž์™€ ์ˆซ์ž์— ๋Œ€ํ•œ ์ •์˜๋Š” ์ƒ๋žตํ•œ๋‹ค.

 

  • BNF

<identifier> ::= <letter> | <identifier><letter> | <identifier><digit>

 

  • EBNF

<identifier> ::= <letter> { <letter> | <digit> }

 

  • ๊ตฌ๋ฌธ ๋„ํ‘œ

 

ํฌ์ŠคํŒ… ๋งˆ์นจ.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€