Rozšířená Backusova–Naurova forma

Z Wikipedie, otevřené encyklopedie
Tento článek pojednává o ABNF. Možná hledáte: Rozvinutá Backusova–Naurova forma (EBNF).

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

Bílé znaky[editovat | editovat zdroj]

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ář[editovat | editovat zdroj]

; komentář

Středník (;) uvozuje komentář, který pokračuje do konce řádku.

Zřetězení[editovat | editovat zdroj]

Prvek1 Prvek2

Pravidlo lze definovat zapsáním posloupnosti jmen pravidel.

Pro zadání řetězce „aba“ lze použít následující pravidla:

  1. fu = %x61 ;
  2. bar = %x62 ; b
  3. mumble = fu bar fu

Podle RFC 7405 lze psát:

  1. mumble = %s"aba"

Alternativa[editovat | editovat zdroj]

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:

  1. fubar = fu / bar

Inkrementální alternativy[editovat | editovat zdroj]

Pravidlo1 =/ prvky

Alternativy je možné přidávat použitím =/ místo = mezi jménem pravidla a prvky; pravidlo

  1. Symbol = alt1 / alt2 / alt3 / alt4 / alt5

je ekvivalentní s

  1. Symbol = alt1 / alt2
  2. Symbol =/ alt3
  3. Symbol =/ alt4 / alt5

Číselný interval[editovat | editovat zdroj]

%c##-##

Číselný interval lze zadat pomocí pomlčky (-).

pravidlo

  1. OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"

je ekvivalentní s

  1. OCTAL = %x30-37

Použití závorek[editovat | editovat zdroj]

(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:

  1. skupina = elem (fubar / tarfu) snafu

Pro zadání „elem fubar“ nebo „tarfu snafu“ lze použít následující pravidla:

  1. skupina = elem fubar / tarfu snafu
  2. skupina = (elem fubar) / (tarfu snafu)

Opakování[editovat | editovat zdroj]

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í[editovat | editovat zdroj]

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[editovat | editovat zdroj]

[posloupnost]

Pro zápis nepovinného prvku nebo posloupnosti lze použít libovolnou z následujících ekvivalentních konstrukcí:

  1. [fubar snafu]
  2. *1(fubar snafu)
  3. 0*1(fubar snafu)

Priority operátorů[editovat | editovat zdroj]

Priorita operátorů od nejvyšší (nejtěsněji vázající) po nejnižší:

  1. Řetězce, jména pravidel
  2. Komentáře
  3. Rozsah hodnot
  4. Opakování
  5. Seskupování, hranaté závorky pro nepovinný prvek
  6. Zřetězení
  7. 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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku Augmented Backus–Naur form na anglické Wikipedii.

  1. Official Internet Protocol Standards [online]. RFC Editor, 2010-02-21 [cit. 2010-02-21]. Dostupné v archivu pořízeném dne 2010-02-16. 
  2. CROCKER, David; OVERELL, Paul. Augmented BNF for Syntax Specifications: ABNF [prostý text]. IETF, leden 2008 [cit. 2010-02-21]. Dostupné online. 
  3. RFC Index [online]. RFC Editor, 2010-02-19 [cit. 2010-02-21]. Dostupné v archivu pořízeném dne 2010-02-09. 
  4. RFC Errata 3096

Související články[editovat | editovat zdroj]