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:

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

Podle RFC 7405 lze psát:

  1. 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:

  1. 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

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

je ekvivalentní s

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

Číselný interval

%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

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

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

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

Priority operátorů

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

Základní pravidla definovaná ve standardu ABNF:

PravidloFormální definiceVýznam
ALPHA%x41-5A / %x61-7AVelká a malá písmena v kódování ASCII (A–Z, a–z)
DIGIT%x30-39Desítkové číslice (0–9)
HEXDIGDIGIT / "A" / "B" / "C" / "D" / "E" / "F"Šestnáctková číslice (0–9, A–F)
DQUOTE%x22Uvozovka
SP%x20Mezera
HTAB%x09Horizontální tabelátor
WSPSP / HTABMezera nebo horizontální tabelátor
LWSP*(WSP / CRLF WSP)Lineární bílý znak (včetně ukončení řádku)
VCHAR%x21-7EViditelný (tisknutelný) znak
CHAR%x01-7FJakýkoli ASCII znak s výjimkou NUL
OCTET%x00-FFOsmibitový znak
CTL%x00-1F / %x7FŘídicí znak
CR%x0DZnak návrat vozíku
LF%x0AZnak nový řádek
CRLFCR LFInternetové 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.

  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

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.