Rozšířená Backusova–Naurova forma
Rozšířená Backusova–Naurova forma (anglicky Augmented Backus-Naur form, ABNF) je metajazyk používaný v informatice pro definici komunikačních protokolů. Podobá se Backusově–Naurově formě (BNF), má však odlišnou syntaxi a zápis odvozovacích pravidel. ABNF je definována jako Internetový Standard 68 ("STD 68") a je použita pro definici několika komunikačních protokolů IETF.[1][2]
Definice ABNF byla původně součástí dokumentu RFC 733, resp. RFC 822 definujícího formát e-mailových zpráv, později byla publikována samostatně, po řadě jako RFC 2234, RFC 4234 a RFC 5234[3] a doplněna RFC 7405, kde je definován zápis pro rozlišování malých a velkých písmen v řetězcových literálech.
Úvod
Gramatika se v ABNF zapisuje v kódování ASCII jako sada pravidel tvaru
Jmeno-pravidla = prvky ; komentar CRLF
V terminologii ABNF se nerozlišuje jméno neterminálního symbolu a odvozovací pravidlo, které jej definuje. Ve jménech symbolů se nerozlišují malá a velká písmena: nerozlišuje se <Jmeno-pravidla>
, <jmeno-pravidla>
, <JMENO-PRAVIDLA>
a <jMEno-PRAviDla>
. Jména pravidel musí začínat písmenem a mohou obsahovat písmena, číslice a pomlčky (tvořené ASCII znakem minus).
Na rozdíl od BNF se jména symbolů nepíší v lomených závorkách (<
, >
); lomené závorky se však často používají ve vysvětlujícím textu pro odlišení jména symbolu od okolního textu.
Terminální hodnoty
Terminální symboly lze zapisovat jako textové literály nebo pomocí kódů jednotlivých znaků.
Zápis kódů znaků začíná znakem procento %
následovaným symbolem základu číselné soustavy (b
= dvojková, d
= desítková a x
= šestnáctková) a hodnotou nebo zřetězením hodnot (oddělených znakem .
). Například znak návrat vozíku lze zapsat %d13
v desítkové nebo %x0D
v šestnáctkové soustavě. Konec řádku tvořený znakem návrat vozíku následovaným znakem nový řádek lze zadat pomocí zřetězení jako %d13.10
.
Textový literál se zadává jako ASCII řetězec uzavřený v uvozovkách ("
). V řetězcích se nerozlišují malá a velká písmena; zápisu "abc"
tedy bude vyhovovat „abc“, „Abc“, „aBc“, „abC“, „ABc“, „AbC“, „aBC“ i „ABC“. Rozlišování malých velkých písmen v řetězci bylo možné vynutit zápisem kódů jednotlivých znaků: pro jednoznačný zápis řetězce „aBc“ bylo nutné psát %d97.66.99
. RFC 7405 rozšířilo zápis řetězců o možnost stanovit, zda se mají rozlišovat malá a velká písmena: při použití prefixu %i
(např. %i"abc"
) se malá a velká písmena nerozlišují, naopak při použití prefixu %s
se rozlišují.
Operátory
Bílé znaky
Bílé znaky oddělují prvky definice; pokud má být mezera rozpoznána jako oddělovač, musí být uvedena explicitně. Explicitní přítomnost jednoho bílého znaku zajistí symbol WSP
(anglicky white-space, bílý znak); symbol LWSP
se používá pro žádný, jeden nebo více bílých znaků s možností použít konec řádku. Definice LWSP
v RFC 5234 není bez problémů,[4] protože pro oddělení dvou polí je nutný alespoň jeden bílý znak.
Zápis pravidla musí začínat na začátku řádku. Pokud pravidlo zabírá více řádků (kvůli lepší čitelnosti), musí pokračovací řádky začínat bílým znakem.
Komentář
; komentář
Středník (;
) uvozuje komentář, který pokračuje do konce řádku.
Zřetězení
Prvek1 Prvek2
Pravidlo lze definovat zapsáním posloupnosti jmen pravidel.
Pro zadání řetězce „aba“ lze použít následující pravidla:
fu = %x61 ;
bar = %x62 ; b
mumble = fu bar fu
Podle RFC 7405 lze psát:
mumble = %s"aba"
Alternativa
Alternativa1 / Alternativa2
Pravidlo lze definovat seznamem alternativ oddělených znakem lomítko (/
).
Pro přijetí možnosti fu nebo možnosti bar lze použít následující pravidlo:
fubar = fu / bar
Inkrementální alternativy
Pravidlo1 =/ prvky
Alternativy je možné přidávat použitím =/
místo =
mezi jménem pravidla a prvky; pravidlo
Symbol = alt1 / alt2 / alt3 / alt4 / alt5
je ekvivalentní s
Symbol = alt1 / alt2
Symbol =/ alt3
Symbol =/ alt4 / alt5
Číselný interval
%c##-##
Číselný interval lze zadat pomocí pomlčky (-
).
pravidlo
OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"
je ekvivalentní s
OCTAL = %x30-37
Použití závorek
(Pravidlo1 Pravidlo2)
Pořadí vyhodnocování definice lze určit použitím kulatých závorek.
Pro zadání „elem fubar snafu“ nebo „elem tarfu snafu“, lze použít následující pravidlo:
skupina = elem (fubar / tarfu) snafu
Pro zadání „elem fubar“ nebo „tarfu snafu“ lze použít následující pravidla:
skupina = elem fubar / tarfu snafu
skupina = (elem fubar) / (tarfu snafu)
Opakování
m*nPosloupnost
Možnost opakování elementu se zapisuje ve tvaru <m>*<n>prvek
, kde m je nejmenší povolený počet opakování a n maximální počet opakování. Obě hodnoty m i n jsou nepovinné. Implicitní hodnota pro m je 0, pro n nekonečno.
Lze použít *prvek
pro žádné, jedno nebo více opakování, *1element
pro nepovinné použití prvku (žádné nebo jedno použití), 1*prvek
pro jedno nebo více opakování a 2*3element
pro dvě nebo tři opakování (funguje podobně jako regulární výrazy e*
, e?
, e+
a e{2,3}
).
Pevný počet opakování
nPosloupnost
Pro uvedení pevného počtu výskytů určitého prvku slouží zápis <a>prvek
, který je ekvivalentní s <a>*<a>prvek
.
Pokud je DIGIT
pravidlo pro desítkovou číslici (jak je definováno níže v části "Základní pravidla" a v zip-code), 2DIGIT
znamená dvě (desítkové) číslice a 3DIGIT
tři číslice.
Nepovinná posloupnost
[posloupnost]
Pro zápis nepovinného prvku nebo posloupnosti lze použít libovolnou z následujících ekvivalentních konstrukcí:
[fubar snafu]
*1(fubar snafu)
0*1(fubar snafu)
Priority operátorů
Priorita operátorů od nejvyšší (nejtěsněji vázající) po nejnižší:
- Řetězce, jména pravidel
- Komentáře
- Rozsah hodnot
- Opakování
- Seskupování, hranaté závorky pro nepovinný prvek
- Zřetězení
- Alternativa
Kombinování operátoru alternativa se zřetězením může být matoucí a doporučuje se používat pro seskupování vytvořit explicitní zřetězení skupiny.
Základní pravidla
Základní pravidla definovaná ve standardu ABNF:
Pravidlo | Formální definice | Význam |
---|---|---|
ALPHA | %x41-5A / %x61-7A | Velká a malá písmena v kódování ASCII (A–Z, a–z) |
DIGIT | %x30-39 | Desítkové číslice (0–9) |
HEXDIG | DIGIT / "A" / "B" / "C" / "D" / "E" / "F" | Šestnáctková číslice (0–9, A–F) |
DQUOTE | %x22 | Uvozovka |
SP | %x20 | Mezera |
HTAB | %x09 | Horizontální tabelátor |
WSP | SP / HTAB | Mezera nebo horizontální tabelátor |
LWSP | *(WSP / CRLF WSP) | Lineární bílý znak (včetně ukončení řádku) |
VCHAR | %x21-7E | Viditelný (tisknutelný) znak |
CHAR | %x01-7F | Jakýkoli ASCII znak s výjimkou NUL |
OCTET | %x00-FF | Osmibitový znak |
CTL | %x00-1F / %x7F | Řídicí znak |
CR | %x0D | Znak návrat vozíku |
LF | %x0A | Znak nový řádek |
CRLF | CR LF | Internetové ukončení řádku |
BIT | "0" / "1" | Binární číslice |
Příklad
Poštovní adresa v USA může být pomocí rozšířené Backusovy–Naurovy formy (ABNF) zadána takto:
postovni-adresa = jmeno ulice mesto
jmeno = *(krestni SP) prijmeni [SP rozliseni] CRLF
jmeno =/ krestni CRLF
krestni = krestni-jmeno / (iniciala ".")
krestni-jmeno = *ALPHA
iniciala = ALPHA
prijmeni = *ALPHA
rozliseni = ("Jr." / "Sr." / 1*("I" / "V" / "X"))
ulice = [apt SP] cislo-domu SP jmeno-ulice CRLF
apt = 1*4DIGIT
cislo-domu = 1*8(DIGIT / ALPHA)
jmeno-ulice = 1*VCHAR
mesto = jmeno-mesta "," SP zkratka-statu 1*2SP zip-code CRLF
jmeno-mesta = 1*(ALPHA / SP)
zkratka-statu = 2ALPHA
zip-code = 5DIGIT ["-" 4DIGIT]
Skryté nástrahy
RFC 5234 obsahuje toto varování týkající se definice LWSP:
Pravidlo pro LWS (anglicky linear-white-space) umožňuje vytvářet řádky, které neobsahují nic jiného než bílé znaky. Tyto řádky nesmí být použity v e-mailových hlavičkách a i v jiných případech mohou způsobovat problémy s interoperabilitou. Proto tuto konstrukci nepoužívejte pro definici e-mailových hlaviček a jinde ji používejte opatrně.
Odkazy
Reference
V tomto článku byl použit překlad textu z článku Augmented Backus–Naur form na anglické Wikipedii.
- Official Internet Protocol Standards [online]. RFC Editor, 2010-02-21 [cit. 2010-02-21]. Dostupné v archivu pořízeném dne 2010-02-16.
- CROCKER, David; OVERELL, Paul. Augmented BNF for Syntax Specifications: ABNF [prostý text]. IETF, leden 2008 [cit. 2010-02-21]. Dostupné online.
- RFC Index [online]. RFC Editor, 2010-02-19 [cit. 2010-02-21]. Dostupné v archivu pořízeném dne 2010-02-09.
- RFC Errata 3096
Související články
- Backusova–Naurova forma (BNF)
- Rozvinutá Backusova–Naurova forma (EBNF)