CS-Junior/프로그래밍언어론
BNF란 무엇인가?
김형준
2026. 3. 22. 20:24
반응형
> 정의
BNF(Backus–Naur Form)는 프로그래밍 언어 및 형식 언어의 문법(Grammar)을 형식적으로 기술하기 위한 표기법이다.
문자열이 어떤 규칙을 만족할 때 “올바른 문장인지”를 판단할 수 있도록, 언어의 구조를 수학적으로 명확하게 정의한다.
BNF는 주로 컴파일러 설계, 파서(Parser) 구현, 언어 명세 작성에서 사용되며, 문장의 생성 규칙을 집합 형태로 표현한다.
> 구성 요소
BNF는 다음 세 가지 핵심 요소로 구성된다.
- 비단말 기호 (Non-terminal symbol)
- 다른 기호로 치환될 수 있는 추상적인 기호
- 보통 꺾쇠(< >)로 표현
- 예:
,
- 단말 기호 (Terminal symbol)
- 더 이상 분해되지 않는 실제 문자 또는 토큰
- 예: +, if, a, 1
- 생산 규칙 (Production rule)
- 비단말 기호를 어떤 형태로 치환할지 정의
- ::= 기호 사용
- 예:
::= +
> 기본 문법 형태
BNF의 기본 구조는 다음과 같다.
- <비단말> ::= 표현식
여기서 표현식은 다음을 포함할 수 있다.
- 단말 기호
- 비단말 기호
- 선택( | ) 연산자
> 간단한 예시 1 (산술 표현식)
<expr> ::= <expr> + <term> | <term>
<term> ::= <term> \* <factor> | <factor>
<factor> ::= ( <expr> ) | number설명
는 덧셈 구조를 정의 은 곱셈 구조를 정의 는 가장 기본 단위 (숫자 또는 괄호식)
이 구조는 연산 우선순위까지 반영한다.
- 곱셈이 덧셈보다 먼저 처리됨
> 간단한 예시 2 (문장 구조)
<sentence> ::= <subject> <verb> <object>
<subject> ::= I | You
<verb> ::= eat | like
<object> ::= apple | banana설명
- 문장은 주어 + 동사 + 목적어로 구성됨
- 가능한 문장 예:
- I eat apple
- You like banana
> 파생(derivation) 개념
BNF는 단순 정의가 아니라 문장을 생성하는 과정까지 포함한다.
예를 들어:
<sentence>
→ <subject> <verb> <object>
→ I <verb> <object>
→ I eat <object>
→ I eat apple이 과정을 **유도(derivation)**라고 한다.
> 특징 및 장점
- 명확성
- 자연어보다 훨씬 엄밀하게 문법 표현 가능
- 구조적 표현
- 계층적 문장 구조를 표현 가능
- 컴파일러 구현에 적합
- 파서 생성의 기반이 됨
> 한계
- 의미(Semantics)는 표현 불가
- 문법만 정의 가능 (의미는 별도 정의 필요)
- 가독성 문제
- 복잡한 언어일수록 규칙이 매우 길어짐
> 정리
BNF는
“문장이 어떻게 만들어지는가”를 규칙 기반으로 정의하는 형식 문법 표기법이며,
프로그래밍 언어의 구조를 기술하고 파싱하기 위한 핵심 도구이다.
반응형