Rozšířená Backusova–Naurova forma () 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.

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 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 (, 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ů,RFC Errata 3096 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 ; a 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: PravidloFormální definiceVýznamALPHA %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 UvozovkaSP %x20 MezeraHTAB %x09 Horizontální tabelátorWSP SP / HTAB Mezera nebo horizontální tabelátorLWSP *(WSP / CRLF WSP) Lineární bílý znak (včetně ukončení řádku)VCHAR %x21-7E Viditelný (tisknutelný) znakCHAR %x01-7F Jakýkoli ASCII znak s výjimkou NULOCTET %x00-FF Osmibitový znakCTL %x00-1F / %x7F Řídicí znakCR %x0D Znak návrat vozíkuLF %x0A Znak nový řádekCRLF CR LF Internetové ukončení řádkuBIT "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:

Odkazy

Reference

Související články Backusova–Naurova forma (BNF) Rozvinutá Backusova–Naurova forma (EBNF)

Kategorie:Formální jazyky