Povećani Backus-Naurov oblik
Povećani Backus-Naurov oblik (češće kraće samo kao ABNF, od engl. Augmented Backus–Naur form) proširuje Backus-Naurov oblik.
Povećani Backus-Naurov oblik (ABNF) je zasnovan na Backus-Naurovom obliku, ali posjeduje vlastitu sintaksu i produkcijska pravila. Povod za nastanak ovog metajezika jest opis formalnog sustava jezika koji je protokol (dvosmjerna specifikacija). Dokumentiran je u RFC 4234 i često služi kao definicijski jezik za IETF komunikacijske protokole.
RFC 4234 ispravlja probleme u i obsoletira RFC 2234.
ABNF specifikacija je skup produkcijskih pravila, zapisanih kao pravilo = definicija ; komentar CR LF
: gdje je pravilo nezavršni simbol osjetljiv na velika i mala slova, definicija se sastoji od slijedova simbola koji definiraju pravilo, komentar je u svrhu dokumentacije, a pravilo završava znakom vraćanja ne početak reda (CR od engl. carriage return) i znakom prelaska u novi red (LF od engl line feed).
Imena pravila su neosjetljiva na velika i mala slova: <imepravila>
, <Imepravila>
, <IMEPRAVILA>
, i <iMePRaviLA>
su sve ista pravila. Imena pravila se sastoje od slova nakon kojeg slijede slova, brojevi i crtice.
Uglate zagrade (“<
”, “>
”) se ne zahtijevaju oko imena pravila (kao što se zahtijevaju u BNF notaciji). Međutim, mogu biti korištene za označavanje imena pravila prilikom korištenja u običnom tekstu za isticanje samih imena pravila.
ABNF se enkodira u 7-bitnom ASCII kodu u 8-bitnom polju čiji je vršni bit postavljen na nulu.
Završni su simboli specificirani jednim ili više numeričkih karaktera (znakova).
Numerički karakteri mogu biti specificirani znakom postotka “%
”, nakon kojeg slijedi baza (b = binarna, d = decimalna, i x = heksadecimalna), nakon kojeg slijedi vrijednost, ili nadovezivanje (konkatenacija) vrijednosti (označena sa “.
”). Na primjer, znak vraćanja na početak reda, CR (od engl. carriage return), je specificiran kodom %d13
u decimalnoj bazi ili %x0D
u heksadecimalnoj. CR nakon kojeg slijedi znak prelaska u novi red - LF (od engl. line feed) se može specificirati nadovezivanjem kao %d13.10
.
Literalni tekst je specificiran uporabom stringa zatvorenog u navodnike ("
). Ovi stringovi su neosjetljivi na velika i mala slova i korišteni skup karaktera iz US-ASCII. Stoga će string “abc” spariti “abc”, “Abc”, “aBc”, “abC”, “ABc”, “AbC”, “aBC”, i “ABC”. Za sparivanje osjetljivo na velika i mala slova se moraju koristiti eksplicitni karakteri: za sparivanje “aBc” definicija će biti %d97 %d66 %d99
.
Bjeline se koriste za razdvajanje definicijskih elemenata: prazni znak mora biti eksplicitno uključen da bi se prepoznao kao graničnik.
Pravilo1 Pravilo2
Pravilo može biti definirano listanjem slijeda imena pravila. Da bi se spario string “aba” sljedeća pravila mogu biti korištena:
fu = %x61 ; a
bar = %x62 ; b
mumble = fu bar fu
Pravilo1 / Pravilo2
Pravilo može biti definirano listanjem alternativnih pravila razdvojenih kosom crtom (“/
”).
Da bi se prihvatilo pravilo <fu> ili pravilo <bar> može se konstruirati sljedeće pravilo:
fubar = fu / bar
Pravilo1 =/ Pravilo2
Dodani izbori mogu biti dodani u pravilo uporabom koda “=/
” između imena pravila i definicije.
Pravilo
skuppravila = izbor1 / izbor2 / izbor3 / izbor4 / izbor5
je istovjetno sljedećima
skuppravila = izbor1 / izbor2
skuppravila =/ izbor3
skuppravila =/ izbor4 / izbor5
%c##-##
Opseg numeričkih vrijednosti se može specificirati uporabom crtice (“-
”).
Pravilo
OKTALNO = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"
je istovjetno sljedećem pravilu:
OKTALNO = %x30-37
(Pravilo1 Pravilo2)
Elementi mogu biti smješteni u zagrade kako bi se grupirala pravila u definiciji.
Da bi se sparili stringovi “elem fubar snafu” ili “elem tarfu snafu”, sljedeće pravilo može biti konstruirano:
grupa = elem (fubar / tarfu) snafu
Kako bi se sparili stringovi “elem fubar” ili “tarfu snafu”, sljedeće pravilo može biti konstruirano:
grupa = elem fubar / tarfu snafu
grupa = (elem fubar) / (tarfu snafu)
n*nPravilo
Kako bi se naznačilo opetovanje elementa, koristi se oblik <a>*<b>element
. Izborni <a>
daje minimalan broj elemenata koji se mogu uključiti, s pretpostavljenom vrijednošću jednakom 0. Izborni <b>
daje maksimalan broj uključenih elemenata, bez pretpostavljene gornje granice.
Valja koristiti *element
za nula illi više elemenata, 1*element
za jedan ili više elemenata, i 2*3element
za dva ili tri elementa.
nPravilo
Kako bi se naznačio eksplicitan broj elemenata, koristi se oblik <a>element
i koji je istovjetan sa <a>*<a>element
.
Valja koristiti 2ZNAMENKA
da bi se dobile dvije numeričke znamenke i 3ZNAMENKA
kako bi se dobile tri numeričke znamenke.
[Pravilo]
Kako bi se naznačio izborni (opcionalni) element, sljedeće konstrukcije su istovjetne:
[fubar snafu]
*1(fubar snafu)
0*1(fubar snafu)
; komentar
Točka-zarez (“;
”) započinje komentar koji se nastavlja do kraja linije.
Sljedeći operatori imaju danu prednost od najjačeg do najslabijeg vezanja:
- Stringovi, Oblikovanje Imena
- Komentari
- Opseg vrijednosti
- Opetovanje
- Grupiranje, Izborni
- Nadovezivanje
- Alternativa
Uporaba operatora alternirana s nadovezivanjem može biti zbunjujuća i preporučuje se uporaba grupiranja kako bi se grupe nadovezivanja učinile eksplicitnima.
Osnovna pravila su definirana u ABNF standardu.
Pravilo | Formalna definicija | Značenje |
---|---|---|
ALPHA | %x41-5A / %x61-7A | velika i mala ASCII slova (A-Z a-z) |
DIGIT | %x30-39 | decimalne znamenke (0-9) |
HEXDIG | DIGIT / "A" / "B" / "C" / "D" / "E" / "F" | heksadecimalne znamenke (0-9 A-F) |
DQUOTE | %x22 | dvostruki navodnik |
SP | %x20 | znak praznine (engl. space) |
HTAB | %x09 | horizontalni tab |
WSP | SP / HTAB | znak praznine i horizontalni tab |
LWSP | *(WSP / CRLF WSP) | linearna bjelina (nakon znaka za novi red) |
VCHAR | %x21-7E | vidljivi (ispisivi) znakovi |
CHAR | %x01-7F | bilo koji 7-bitni US-ASCII znak, isključujući NUL |
OCTET | %x00-FF | 8 bitova podataka |
CTL | %x00-1F / %x7F | kontrolni znakovi |
CR | %x0D | znak vraćanja na početak reda (engl. carriage return) |
LF | %x0A | znak prelaska u novi red (engl. linefeed) |
CRLF | CR LF | Standardni internetski znak za prelazak u novi red |
BIT | "0" / "1" |
Primjer poštanskih adresa dan u članku o Backus-Naurovom obliku se može specificirati kao:
poštanska-adresa = ime-dio ulica pbroj-dio
ime-dio = *(osobni-dio SP) prezime [SP jr-dio] CRLF
ime-dio =/ osobni-dio CRLF
osobni-dio = ime / (inicijal ".")
ime = *ALPHA
inicijal = ALPHA
prezime = *ALPHA
jr-dio = ("Jr." / "Sr." / 1*("I" / "V" / "X"))
street = [stan-broj SP] kućni-broj SP ime-ulice CRLF
stan-broj = 1*4DIGIT
kućni-broj = 1*8(DIGIT / ALPHA)
ime-ulice = 1*VCHAR
pbroj-dio = ime-grada "," SP država 1*2SP poštanski-broj CRLF
ime-grada = 1*(ALPHA / SP)
država = 2ALPHA
poštanski-broj = 5DIGIT ["-" 4DIGIT]