- 위 RFC 문서를 읽고 정리한 내용이다.
- ABNF는 프로토콜 메시지 구조나 문법을 정의하기 위해 사용한다.
- 다른 RFC 문서를 읽기 전 미리 ABNF를 이해하고 읽는 것이 좋다.
<rulename> = <Rulename> = <RULENAME> = <rULENAmE><>는 필수가 아님<>를 사용<>가 필수가 아니므로 rulename = <rulename><>를 사용해 ABNF 규칙으로 인식하도록 도움을 주는 역할name = elements crlf
name: 규칙의 이름element: 하나 이상의 규칙 이름, 터미널 사양crlf: 라인 종결자(carriage return + line feed)b = binary
d = decimal
x = hexadecimal
CR = %d13
CR = %x0D
CRLF = %d13.10
.을 사용해서 문자 간 연결 및 구분.으로 구분해 10진수 표현command = "command string"
""로 묶인 리터럴 텍스트 사용 허용rulename = "abc"
rulename = "aBc"
rulename은 서로 같은 값을 가짐rulename = %d97 %d98 %d99
rulename = %d97.98.99
리터럴(literal)을 뭐라고 해석해야 좋을까?
- 문자 그대로(literally)로 해석
- 고정된 값으로써 글자 그대로 사용, 변형하지 않음
foo = %x61 ; a
bar = %x62 ; b
mumble = foo bar foo
mumble 규칙은 문자열 aba 값을 가짐foo / bar
/로 구분된 요소는 대안<foo> 또는 <bar>를 허용""로 묶인 리터럴 텍스트는 대소문자를 구분하지 않음rulename = "abc"는 rulename = "abc" / "Abc" / "aBc" ... 등과 같이 동작ruleset = alt1 / alt2
ruleset =/ alt3
ruleset =/ alt4 / alt5
ruleset = alt1 / alt2 / alt3 / alt4 / alt5
=/를 통해 규칙을 확장할 수 있음/=를 사용하면 기존의 규칙을 변형하지 않으면서 확장 가능DIGIT = %x30-39
DIGIT = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"
-를 사용해 지정 가능.으로 구분하거나 -로 범위를 지정해 표현 가능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)로 작성하는 것이 권장<a>*<b>element
*은 반복을 나타냄<a>와 <b>는 10진수 값으로 element의 최소 <a>회 및 최대 <b>회 발생을 나타냄*<element>: 0을 포함한 모든 횟수의 반복 허용1*<element>: 최소 1번 반복3*3<element>: 정확히 3번 반복1*2<element>: 최소 1번, 최대 2번 반복 허용<n>element
<n>element는 <n>*<n>element과 같음<element>가 <n>번 반복2DIGIT는 2자리 숫자, 3ALPHA는 알파벳 3개로 구성된 문자열(코어 규칙)[foo bar]
[foo bar]는 *1[foo bar]과 같음;으로 주석 표현;-<a>*<b> <n>() []./rulelist = 1*( rule / (*c-wsp c-nl) )
rule, 주석, 빈 줄로 작성rule = rulename defined-as elements c-nl
; continues if next line starts with white space
rulename = ALPHA *(ALPHA / DIGIT / "-")
defined-as = *c-wsp ("=" / "=/") *c-wsp
; basic rules definition and incremental alternatives
*c-wsp)이 올 수 있음=나 =/로 규칙 정의 및 확장c-wsp = WSP / (c-nl WSP)
WSP 또는 줄바꿈 뒤 공백문자c-nl = comment / CRLF
; comment or newline
comment = ";" *(WSP / VCHAR) CRLF
;으로 시작VCHAR가 0개 이상 반복CRLF로 마무리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 = 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
group과 option은 alternation을 포함할 수 있음group은 option과 달리 구성 요소가 필수적char-val는 큰 따옴표로 묶인 공백 + 인쇄 가능한 문자값num-val은 숫자 값으로 2, 10, 16진수 포함prose-val은 <>로 묶인 설명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-zDQOUTE: 큰 따옴표(")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과 0OCTET: 8비트로 표현 가능한 모든 데이터 값DIGIT: 십진수 숫자 0-9HEXDIG: 16진수 숫자 0-9와 알파벳 A-FCR = %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: 화면에 인쇄되지 않고 장치를 제어하는 모든 제어 문자들.