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.
Uvod
urediABNF 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šne vrijednosti
urediZavrš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
.
Operatori
urediBjeline
urediBjeline se koriste za razdvajanje definicijskih elemenata: prazni znak mora biti eksplicitno uključen da bi se prepoznao kao graničnik.
Nadovezivanje:
urediPravilo1 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
Alterniranje:
urediPravilo1 / 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
Inkrementalni izbori:
urediPravilo1 =/ 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
Opseg vrijednosti:
uredi%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
Grupa slijeda:
uredi(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)
Opetovanje varijabli:
uredin*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.
Specifično opetovanje:
uredinPravilo
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.
Izborni slijed:
uredi[Pravilo]
Kako bi se naznačio izborni (opcionalni) element, sljedeće konstrukcije su istovjetne:
[fubar snafu]
*1(fubar snafu)
0*1(fubar snafu)
Komentar:
uredi; komentar
Točka-zarez (“;
”) započinje komentar koji se nastavlja do kraja linije.
Prednost operatora
urediSljedeć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
urediOsnovna 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
urediPrimjer 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]