샤르의 잡동사니 창고

[프로그래밍 언어론] BNF (Backus-Naur Form) 란?

컴퓨터 2011. 3. 20. 12:05
* 이 포스트는 이전에 공부하면서 보고서로 작성한 것을 그대로 포스팅 한 것입니다.
* 참조교재 : 프로그래밍 언어론 (한빛미디어)

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

1959년 파리에서 개최된 유네스코 학술회의에서 존 배커스(John Backus)는 ALGOL 58에 대한 논문을 발표하였고, 1년 후에 피터 나우어(Peter Naur)가 그 내용을 보완하여 ALGOL 60을 기술하여 지금의 형태로 만들었습니다.

이것이 중요한 이유는 프로그래밍 언어의 구문을 기술하는 데 매우 자연스러운 표기법으로, C, Java, PHP 등을 포함한 대부분의 프로그래밍 언어의 정의에 가장 널리 사용되기 때문입니다.

한 언어의 구문을 기술하는 BNF는 생성 규칙들의 집합으로, 배정문에 대한 생성 규칙의 예는 다음과 같습니다.
<digit> → 0 | 1 | 2 | … | 9

이는 <digit>가 0 | 1 | 2 | … | 9 로 정의됨을 의미하며, 여기에서 화살표를 기준으로 왼쪽에 위치한 <digit>은 정의되고 있는 구문 구조의 이름으로, LHS(left hand side)라 부르며, 우측에 위치한 0 | 1 | 2 | … | 9 은 RHS(right hand side) 라고 부릅니다.

RHS에서 수의 표기에 사용 된 | 는 논리 OR 을 의미하며, 하나의 구문 구조에서 두 개 이상의 다른 정의를 가질 때 이를 이용하면 하나의 규칙으로 표현하는 것이 가능합니다.

또한, <digit> 와 같이 '<>'로 묶인 기호를 비단말 기호(non-terminal symbol)라 하고, 0, 1, 2와 같이 직접 나타낼 수 있는 기호를 단말 기호(terminal symbol)라 하며, →, | 와 같이 BNF 표기에서 사용되는 특수한 기호들을 메타 기호(meta symbol) 라 합니다.


언어의 문장들은 BNF의 규칙을 적용해가며 생성되는데, 시작 기호(start symbol)라 불리는 비단말 기호에서 시작되며, 이러한 문장 생성 과정을 유도(derivation) 라 합니다.

<number> → <number><digit>    ────── ➀
                  | <digit>               ────── ➁
<digit> → 0 | 1 | 2 | … | 9            ────── ➂

이러한 수에 대한 문법이 있다면, 123 을 다음과 같이 유도할 수 있습니다.

<number> ⇒ <number><digit>                 ─ ➀ 에 의해 <number>를 <number><digit>로 대치
                 ⇒ <number><digit><digit>     ─ ➀ 에 의해 <number>를 <number><digit>로 대치
                 ⇒ <digit><digit><digit>         ─ ➁ 에 의해 <number>를 <digit>로 대치
                 ⇒ 1<digit><digit>                ─ ➂ 에 의해 <digit>를 수 1로 대치합니다.
                 ⇒ 12<digit>                        ─ ➂ 에 의해 <digit>를 수 2로 대치합니다.
                 ⇒ 123                               ─ ➂ 에 의해 <digit>를 수 3으로 대치합니다.

여기에서 시작 기호는 <number> 이며, ⇒ 는 '유도 한다'고 읽습니다.

'컴퓨터' 카테고리의 다른 글

파이어폭스4 정식 출시  (0) 2011.03.23
[SQL] SELECT 구문의 기본  (0) 2011.03.21
[프로그래밍 언어론] 구문분석의 모호성  (0) 2011.03.20
[프로그래밍 언어론] 구문 분석 방법  (2) 2011.03.20
[프로그래밍 언어론] 파스트리(Parse tree)의 개요  (2) 2011.03.20
Base64 인코딩에 대한 잡설  (0) 2011.03.20
[Java] Conversion과 Casting  (0) 2011.03.19
[Java] Primitive data type (원시 자료형)  (0) 2011.03.19
[Flash] Base64 Encoder & Decoder for flash  (0) 2011.03.18
[Flash] 플래시 슬라이드 이미지 뷰어 (AS3)  (0) 2011.03.18
현재 브라우저에서는 댓글을 표시할 수 없습니다.
IE9 이상으로 브라우저를 업그레이드하거나, 크롬, 파이어폭스 등 최신 브라우저를 이용해주세요.
블로그 이미지

안드로이드 앱 개발을 업으로 삼고있는 헬조선 컴돌이의 잡동사니 창고

by Selnis

카운터

Total
Today
Yesterday

최근에 올라온 글

  • 더 보기

최근 댓글

방명록 : 관리자 : 글쓰기
Selnis's Blog is powered by daumkakao
Skin ⓘ material T Mark1 by 뭐하라

ⓒ 2015. Selnis all rights reserved.

favicon

샤르의 잡동사니 창고

안드로이드 앱 개발을 업으로 삼고있는 헬조선 컴돌이의 잡동사니 창고

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • 전체 (322)
    • 공지 (4)
    • 잡담 (35)
    • 게임 (150)
    • 컴퓨터 (123)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바