CS-Junior/프로그래밍언어론

BNF란 무엇인가?

김형준 2026. 3. 22. 20:24
반응형

> 정의

BNF(Backus–Naur Form)는 프로그래밍 언어 및 형식 언어의 문법(Grammar)을 형식적으로 기술하기 위한 표기법이다.
문자열이 어떤 규칙을 만족할 때 “올바른 문장인지”를 판단할 수 있도록, 언어의 구조를 수학적으로 명확하게 정의한다.

BNF는 주로 컴파일러 설계, 파서(Parser) 구현, 언어 명세 작성에서 사용되며, 문장의 생성 규칙을 집합 형태로 표현한다.


> 구성 요소

BNF는 다음 세 가지 핵심 요소로 구성된다.

  1. 비단말 기호 (Non-terminal symbol)
    • 다른 기호로 치환될 수 있는 추상적인 기호
    • 보통 꺾쇠(< >)로 표현
    • 예: ,
  2. 단말 기호 (Terminal symbol)
    • 더 이상 분해되지 않는 실제 문자 또는 토큰
    • 예: +, if, a, 1
  3. 생산 규칙 (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)**라고 한다.


> 특징 및 장점

  1. 명확성
    • 자연어보다 훨씬 엄밀하게 문법 표현 가능
  2. 구조적 표현
    • 계층적 문장 구조를 표현 가능
  3. 컴파일러 구현에 적합
    • 파서 생성의 기반이 됨

> 한계

  1. 의미(Semantics)는 표현 불가
    • 문법만 정의 가능 (의미는 별도 정의 필요)
  2. 가독성 문제
    • 복잡한 언어일수록 규칙이 매우 길어짐

> 정리

BNF는
“문장이 어떻게 만들어지는가”를 규칙 기반으로 정의하는 형식 문법 표기법이며,
프로그래밍 언어의 구조를 기술하고 파싱하기 위한 핵심 도구이다.

반응형