RFC 5234: ABNF

민정·2025년 8월 7일

Augmented BNF for Syntax Specifications: ABNF

RFC 5234: ABNF

  • 위 RFC 문서를 읽고 정리한 내용이다.
  • ABNF는 프로토콜 메시지 구조나 문법을 정의하기 위해 사용한다.
  • 다른 RFC 문서를 읽기 전 미리 ABNF를 이해하고 읽는 것이 좋다.

2. Rule Definition

2.1 Rule Naming

  • 규칙의 이름은 영문자로 시작해 영문자, 숫자, 하이픈 조합이 뒤따르는 문자열 조합
  • 규칙의 이름은 대소문자를 구분하지 않음
    • <rulename> = <Rulename> = <RULENAME> = <rULENAmE>
  • <>는 필수가 아님
    • 전통적인 BNF는 규칙 이름을 정의할 때 반드시 <>를 사용
    • ABNF는 <>가 필수가 아니므로 rulename = <rulename>
    • ABNF 규칙 이름인지, 일반적인 단어인지 혼동될 때 <>를 사용해 ABNF 규칙으로 인식하도록 도움을 주는 역할

2.2 Rule Form

name =  elements crlf
  • name: 규칙의 이름
  • element: 하나 이상의 규칙 이름, 터미널 사양
  • crlf: 라인 종결자(carriage return + line feed)
  • 등호로 이름과 규칙 정의를 구분

2.3 Terminal Values

b           =  binary
d           =  decimal
x           =  hexadecimal
CR          =  %d13
CR          =  %x0D
  • carriage return에 대한 10진수, 16진수 표현
CRLF        =  %d13.10
  • .을 사용해서 문자 간 연결 및 구분
  • carriage return, line feed를 .으로 구분해 10진수 표현
command     =  "command string"
  • ""로 묶인 리터럴 텍스트 사용 허용
rulename = "abc"
rulename = "aBc"
  • ABNF 문자열은 대소문자를 구분하지 않으며 문자 집합은 US-ASCII로 구성
  • 위의 rulename은 서로 같은 값을 가짐
rulename    =  %d97 %d98 %d99
rulename    =  %d97.98.99
  • 대소문자를 구분하는 규칙을 지정하려면 위와 같이 문자를 모두 개별적으로 지정해야 함

리터럴(literal)을 뭐라고 해석해야 좋을까?

  • 문자 그대로(literally)로 해석
  • 고정된 값으로써 글자 그대로 사용, 변형하지 않음

3. Operators

3.1. Concatenation: Rule1 Rule26

foo         =  %x61           ; a
bar         =  %x62           ; b
mumble      =  foo bar foo
  • 규칙 이름을 나열해 문자열 정의 가능
    • 규칙 이름이 제시된 순서대로 구성된 하나의 문자열 정의 가능
    • ABNF에 정의된 규칙에 따라 연속된 문자 값이 파싱
  • mumble 규칙은 문자열 aba 값을 가짐
  • ABNF는 공백 값에 대한 암묵적인 지정을 제공하지 않음
    • 공백에 대해서는 명시적으로 지정하는 것이 좋음
    • 특히 코어 규칙(부록 B)을 기반으로 제공하는 것이 좋음

3.2. Alternatives: Rule1 / Rule2

foo / bar
  • /로 구분된 요소는 대안
    • 위 규칙은 <foo> 또는 <bar>를 허용
  • ""로 묶인 리터럴 텍스트는 대소문자를 구분하지 않음
    • rulename = "abc"rulename = "abc" / "Abc" / "aBc" ... 등과 같이 동작

3.3. Incremental Alternatives: Rule1 =/ Rule2

ruleset     =  alt1 / alt2
ruleset     =/ alt3
ruleset     =/ alt4 / alt5

ruleset     =  alt1 / alt2 / alt3 / alt4 / alt5
  • =/를 통해 규칙을 확장할 수 있음
  • 기본 프로토콜 사양에 대해 확장 사양을 추가할 때 유용
    • /=를 사용하면 기존의 규칙을 변형하지 않으면서 확장 가능
    • 여러 확장 사양이 기본 규칙을 직접 수정하지 않기 때문에 충돌을 막고 유연하게 확장 가능

3.4. Value Range Alternatives: %c##-##

DIGIT       =  %x30-39
DIGIT       =  "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"
  • 숫자 값의 범위는 -를 사용해 지정 가능
  • 숫자 값은 .으로 구분하거나 -로 범위를 지정해 표현 가능

3.5. Sequence Group: (Rule1 Rule2)

elem (foo / bar) blat

elem foo / bar blat
  • ()로 묶인 요소는 그룹화되어 단일 요소로 처리
  • elem (foo / bar) blat(elem foo blat) 또는 (elem bar blat)으로 해석
  • elem foo / bar blat(elem foo) 또는 (bar blat)으로 해석
    • 이는 사용자가 이해하기 쉽도록 (elem foo) / (bar blat)로 작성하는 것이 권장

3.6. Variable Repetition: *Rule

<a>*<b>element
  • *은 반복을 나타냄
  • <a><b>는 10진수 값으로 element의 최소 <a>회 및 최대 <b>회 발생을 나타냄
    • 기본값은 0과 무한대
    • *<element>: 0을 포함한 모든 횟수의 반복 허용
    • 1*<element>: 최소 1번 반복
    • 3*3<element>: 정확히 3번 반복
    • 1*2<element>: 최소 1번, 최대 2번 반복 허용

3.7. Specific Repetition: nRule

<n>element
  • <n>element<n>*<n>element과 같음
    • 정확히 <element><n>번 반복
  • 2DIGIT는 2자리 숫자, 3ALPHA는 알파벳 3개로 구성된 문자열(코어 규칙)

3.8. Optional Sequence: [RULE]

[foo bar]
  • 선택적 요소 시퀀스를 묶음
  • [foo bar]*1[foo bar]과 같음
    • 없거나, 1번 사용

3.9. Comment: ; Comment

  • ;으로 주석 표현

3.10. Operator Precedence

  • 위의 연산자는 우선 순위를 가짐
  • 아래는 연산자 우선순위가 높은 순대로 정렬
    • 규칙 이름, prose-val, 터미널 값
    • 주석 ;
    • 값 범위 -
    • 반복 <a>*<b> <n>
    • 그룹화 () []
    • 연결 .
    • 대안 /

4. ABNF Definition of ABNF

  • ABNF로 설명하는 ABNF 전체 문법

구성 요소

rulelist

rulelist = 1*( rule / (*c-wsp c-nl) )
  • ABNF 문법으로 작성한 파일 전체를 표현
  • 하나 이상의 rule, 주석, 빈 줄로 작성

rule

rule = rulename defined-as elements c-nl
       ; continues if next line starts with white space
  • 다음 줄이 공백으로 시작하면 현재 규칙의 내용이 다음 줄로 이어짐

rulename

rulename = ALPHA *(ALPHA / DIGIT / "-")
  • 알파벳으로 시작
  • 알파벳, 숫자, -만 규칙 이름으로 사용 가능

define-as

defined-as = *c-wsp ("=" / "=/") *c-wsp
             ; basic rules definition and incremental alternatives
  • 규칙 이름과 내용을 구분하는 연산자 그 자체를 의미함
  • 연산자 앞 뒤로 0개 이상의 공백(*c-wsp)이 올 수 있음
  • ==/로 규칙 정의 및 확장

c-wsp

c-wsp = WSP / (c-nl WSP)
  • 공백문자 WSP 또는 줄바꿈 뒤 공백문자

c-nl

c-nl = comment / CRLF
       ; comment or newline
  • 주석 또는 줄바꿈

comment

comment = ";" *(WSP / VCHAR) CRLF
  • ;으로 시작
  • 공백이나 인쇄 가능한 문자 VCHAR가 0개 이상 반복
  • 줄바꿈 CRLF로 마무리

elements, alternation, concatenation, repetition, repeat

elements      = alternation *c-wsp

alternation   = concatenation *(*c-wsp "/" *c-wsp concatenation)
                ; / 연산자가 포함되어 대안 선택 가능

concatenation = repetition *(1*c-wsp repetition)

repetition    = [repeat] element

repeat        = 1*DIGIT / (*DIGIT "*" *DIGIT)
                ; 반복 횟수 표현
  • elements는 대안, 반복을 포함할 수 있는 요소
    • 대안 안에 반복이 포함될 수 있는 구조

element

element = rulename / group / option / char-val / num-val / prose-val
  • element는 규칙, 문자열, 숫자 등 여러 타입으로 구성될 수 있음
group = "(" *c-wsp alternation *c-wsp ")"

option = "[" *c-wsp alternation *c-wsp "]"

char-val = DQUOTE *(%x20-21 / %x23-7E) DQUOTE
           ; quoted string of SP and VCHAR without DQUOTE

num-val = "%" (bin-val / dec-val / hex-val)

bin-val = "b" 1*BIT [ 1*("." 1*BIT) / ("-" 1*BIT) ]
dec-val = "d" 1*DIGIT [ 1*("." 1*DIGIT) / ("-" 1*DIGIT) ]
hex-val = "x" 1*HEXDIG [ 1*("." 1*HEXDIG) / ("-" 1*HEXDIG) ]

prose-val = "<" *(%x20-3D / %x3F-7E) ">"
            ; bracketed string of SP and VCHAR without angles
            ; prose description, to be used as last resort
  • groupoptionalternation을 포함할 수 있음
    • groupoption과 달리 구성 요소가 필수적
  • char-val는 큰 따옴표로 묶인 공백 + 인쇄 가능한 문자값
  • num-val은 숫자 값으로 2, 10, 16진수 포함
  • prose-val<>로 묶인 설명
    • ABNF 문법으로 정확히 표현하기 어려울 때 주로 사용
    • ABNF parser는 이 내용을 이해할 필요가 없으며 주석이나 설명으로 간주

B.1. Core Rules

CHAR           =  %x01-7F
                      ; any 7-bit US-ASCII character,
                      ;  excluding NUL

VCHAR          =  %x21-7E
                      ; visible (printing) characters

ALPHA          =  %x41-5A / %x61-7A   ; A-Z / a-z

DQUOTE         =  %x22
                      ; " (Double Quote)
  • CHAR: 널 문자(%x00)를 제외한 7비트 US-ASCII 문자 전체
  • VCHAR: CHAR에서 출력 가능한 문자 전체
  • ALPHA: 알파벳 대소문자 A-Z, a-z
  • DQOUTE: 큰 따옴표(")
BIT            =  "0" / "1"

OCTET          =  %x00-FF
                      ; 8 bits of data

DIGIT          =  %x30-39
                      ; 0-9

HEXDIG         =  DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
  • BIT: 1과 0
  • OCTET: 8비트로 표현 가능한 모든 데이터 값
  • DIGIT: 십진수 숫자 0-9
  • HEXDIG: 16진수 숫자 0-9와 알파벳 A-F
CR             =  %x0D
                      ; carriage return

LF             =  %x0A
                      ; linefeed

CRLF           =  CR LF
                      ; Internet standard newline
  • CRLF: 인터넷 표준에서 사용되는 줄바꿈(CR + LF), 라인 종결자 역할
SP             =  %x20

HTAB           =  %x09
                      ; horizontal tab

WSP            =  SP / HTAB
                      ; white space

LWSP           =  *(WSP / CRLF WSP)
                      ; Use of this linear-white-space rule
                      ;  permits lines containing only white
                      ;  space that are no longer legal in
                      ;  mail headers and have caused
                      ;  interoperability problems in other
                      ;  contexts.
                      ; Do not use when defining mail
                      ;  headers and use with caution in
                      ;  other contexts.
  • LWSP는 현대 프로토콜에서 잘 사용하지 않음
CTL            =  %x00-1F / %x7F
                      ; controls
  • CTL: 화면에 인쇄되지 않고 장치를 제어하는 모든 제어 문자들.
profile
시스템 + 리눅스 + 클라우드

0개의 댓글