Rozvinutá Backusova-Naurova forma

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Rozvinutá Backusova–Naurova forma (EBNF) je v informatice součástí rodiny metasyntaktických notací využívaných pro vyjádření bezkontextových gramatik používaných pro formální popis programovacích jazyků nebo jiných formálních jazyků. EBFN je rozšířením základní metasyntaktické notace Backus-Naurovy formy. EBNF vyvinul Niklaus Wirth, i když v dnešní době existuje mnoho dalších variací. Mezinárodní organizace pro normalizaci (ISO) přijala EBNF jako standard ISO/IEC 14977.[1] V tomto článku je pro příklady používána EBNF ISO specifikace. Ostatní verze EBNF se mohou lišit v syntaktických konvencích.

Zápis pravidel[editovat | editovat zdroj]

Formální jazyk nebo zdrojový kód počítačového programu se skládá z terminálů, což jsou tisknutelné znaky, čísla, interpunkční znaménka, bílé znaky (mezery tabelátory, konce řádků) atd.

EBNF definuje přepisovací pravidla, kde jsou sekvence symbolů přiřazeny neterminálům:

číslice-bez-nuly = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
číslice = "0" | číslice bez nuly ;

Ve výše uvedeného příkladu jsou zapsány dva řádky přepisovacích pravidel, které mají na levé straně uvedeny neterminály (číslice, číslice-bez-nuly). Na pravé straně jsou uvedeny různé varianty terminálních a neterminálních symbolů, které jsou vzájemně odděleny znakem svislá čára. Terminální symboly jsou uzavřeny do uvozovek, středník je ukončovacím symbolem. Definice tedy říká, že číslice může být 0 nebo neterminál číslice bez nuly, přičemž číslice bez nuly může obsahovat terminály 1, 2, 3 atd. až 9.

Přepisovací pravidla mohou též obsahovat sekvence terminálů a neterminálů oddělených čárkou:

dvanáct = "1" , "2" ;
dvě-stě-jedna = "2" , "0" , "1" ;
tři-sta-dvanáct = "3" , dvanáct ;
dvanáct-tisíc-dvě-stě-jedna = dvanáct , dvě-stě-jedna ;

Výraz, který může být vynechán nebo opakován je uzavírán do složených závorek { ... }:

přirozené číslo = číslice bez nuly , { číslice } ;

V tomto případě jsou řetězce 1, 2,... 10,... 12345,... správným výrazem. Ve výsledku může být vše, co je uvedeno ve složených závorkách, libovolně opakováno nebo to tam nemusí být vůbec.

V hranatých závorkách [ ... ] jsou uvedeny možnosti, které mohou být použity pouze jednou nebo vůbec:

celé číslo = "0" | [ "-" ] , přirozené číslo ;

Podle tohoto pravidla může být celé číslo nula (0) nebo přirozené číslo, před kterým může být znaménko mínus.

EBNF mimo jiné definuje syntaxi pro popis určitého počtu opakování, vynechání určitých částí nebo vložení komentářů do EBNF gramatiky.

Rozšířená BNF[editovat | editovat zdroj]

Backusova-Naurova forma neumožňuje vyjádřit volitelné a opakující se výrazy. Místo toho je nutné využít mezipravidlo nebo alternativní definici pro vynechání či volitelnou existenci prvku, případně rekurzivně pro opakování. Tyto konstrukce je možné využít i v EBNF.

Volitelná část v EBFN:

číslo-se-znaménkem = [ znaménko ] , celé-číslo ;

v BNF vypadá definice takto:

<číslo-se-znaménkem> ::= <znaménko> <celé-číslo> | <celé-číslo> ;

nebo

<číslo-se-znaménkem> ::= <nepovinné znaménko> <číslo> ;
<nepovinné-znaménko> ::= ε | <znaménko> ; (* epsilon ("ε") se využívá pro vyjádření prázdných pravidel *)

Opakování v EBFN:

číslo = { číslice } ;

v BNF vypadá definice takto:

<číslo> ::= ε | <číslo> <číslice> ;

Poznámka: EBNF (ISO) využívá pro zřetězení čárku ','. BNF takovou možnost nemá.

Další dodatky a úpravy[editovat | editovat zdroj]

EBNF odstraňuje některé další vady BNF:

  • BNF využívá symboly (<, >, |, ::=). Pokud jsou obsaženy v jazyce bez dalších úprav a vysvětlení, BNF je nedokáže využít.
  • Syntaxe BNF může mít pravidla zapsána pouze na jednom řádku.

EBNF řeší následující problémy:

  • Terminální symboly musí být uzavřeny do uvozovek ("..." nebo '...'). Špičaté závorky ("<...>") mohou být pro terminály a neterminály vynechány.
  • Ukončovací znak, středník, značí konec pravidla.

Kromě toho existují mechanismy pro vylepšení, definice počtu opakování, vynechání kromě některých možností (např. všechny znaky, kromě uvozovek), komentáře, atd.

I přes všechna tato vylepšení není EBNF silnější, než BNF a to ve smyslu toho, jak jazyk definovat. De fakto lze říci, že všechny formální gramatiky, které lze definovat v EBNF, mohou být vytvořeny i v BNF. Nicméně to ve výsledku vede k mnohem obsáhlejšímu množství definičních pravidel.

EBNF je standardizována ISO pod označením ISO/IEC 14977:1996(E).

Za určitých okolností je jakákoliv rozšířená BNF jen EBNF. Například W3C využívá one EBNF pro specifikování XML.[2]

Další příklad[editovat | editovat zdroj]

Programovací jazyky podobné Pascalu umožňují pouze přiřazení, která jsou v EBNF definována následovně:

(* jednoduchý program v EBNF − Wikipedia *)
program = 'PROGRAM' , mezera , identifikátor , mezera ,
           'BEGIN' , mezera ,
           { přiřazení , ";" , mezera } ,
           'END.' ;
identifikátor = znak-abecedy , { znak-abecedy | číslice } ;
číslo = [ "-" ] , číslice , { číslice } ;
řetězec = '"' , { všechny-znaky − '"' } , '"' ;
přiřazení = identifikátor , ":=" , ( číslo | identifikátor | řetězec ) ;
znak-abecedy = "A" | "B" | "C" | "D" | "E" | "F" | "G"
             | "H" | "I" | "J" | "K" | "L" | "M" | "N"
             | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
             | "V" | "W" | "X" | "Y" | "Z" ;
číslice = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
mezera = ? znak prázdného místa ? ;
všechny-znaky = ? všechny tisknutelné znaky ? ;

Syntakticky správný program vypadá následovně:

PROGRAM DEMO1
BEGIN
  A0:=3;
  B:=45;
  H:=-100023;
  C:=A;
  D123:=B34A;
  BABOON:=GIRAFFE;
  TEXT:="Hello world!";
END.

Jazyk může byt jednoduše rozšířen o řídicí struktury, aritmetické výrazy a instrukce pro vstup/výstup.

Následující znaky jsou navrženy jako standard klasické prezentace:

Usage Notation
definice =
zřetězení ,
ukončení  ;
oddělení |
nepovinné [ ... ]
opakování { ... }
seskupení ( ... )
dvojité uvozovky " ... "
jednoduché uvozovky ' ... '
komentář (* ... *)
speciální část  ? ... ?
výjimka -

Konvence[editovat | editovat zdroj]

1. Využívají se následující konvence:

  • Každý meta-identifikátor rozšířeného BNF je zapsán jako jedno nebo více slov spojených dohromady pomlčkou;
  • Meta-identifikátor je ukončen “-symbol”, což je název ukončujícího symbolu v BNF.

2. Znaky reprezentující jednotlivé operátory rozšířené BNF a jejich pořadí (svrchu):

* pro opakování
- pro vynechání
, pro zřetězení
| pro oddělení jednotlivých definic
= pro přiřazení definice
; pro ukončení

3. Toto pořadí může být změněno pomocí následujících závorek:

'  první-uvozovka                         první-uvozovka  '
"  druhá-uvozovka                         druhá-uvozovka  "
(* začátek-komentáře                     konec-komentáře *)
(  začátek-skupiny                         konec-skupiny  )
[  začátek-nepovinné části         konec-nepovinné-části  ]
{  začátek-opakující-se-části   konec-opakující-se-části  }
?  speciální-část                         speciální-část  ?

První-uvozovka je apostrof, tak jak je definován v ISO / IEC 646:1991, tedy Unicode 0x0027 ('), ale písmo využité v ISO / IEC 14977:1996 (E) ho vykresluje velmi podobně znaku Unicode 0x00B4 ('), takže může dojít k nedorozumění. Nicméně, ISO rozšířeného BNF standardu ho definuje jako ISO / IEC 646:1991, "ISO 7-bit kódované znakové sady pro výměnu informací", jako referenci a nezmiňuje žádné jiné znakové sady, aby zde nedošlo k nedorozumění se znaky s Unicode mimo 7-bit ASCII.

Příklad, následující syntaktická pravidla ukazují možnosti pro vyjádření opakování:

aa = "A";
bb = 3 * aa, "B";
cc = 3 * [aa], "C";
dd = {aa}, "D";
ee = aa, {aa}, "E";
ff = 3 * aa, 3 * [aa], "F";
gg = {3 * aa}, "G";

Terminální řetězce jsou definovány následujícími pravidly:

aa: A
bb: AAAB
cc: C AC AAC AAAC
dd: D AD AAD AAAD AAAAD atd.
ee: AE AAE AAAE AAAAE AAAAAE atd.
ff: AAAF AAAAF AAAAAF AAAAAAF
gg: G AAAG AAAAAAG atd.

EBNF rozšířitelnost[editovat | editovat zdroj]

Na základě ISO 14977 standardu EBNF je možnost rozšířitelnosti, pomocí dvou prostředků. První je část gramatiky EBNF, speciální sekvence, která může obsahovat libovolný text ohraničený otazníky. Interpretace tohoto textu je nad rámec standardního EBNF. Například mezera by mohla být definována jako následující pravidlo:

mezera = ? US-ASCII character 32 ?;

Druhým prostředkem je skutečnost, že závorky nemohou být umístěny přímo za identifikátory (musí být zřetězeny). Zde je ukázka validní EBNF:

neco = foo, ( bar );

Následující není validní EBNF:

neco = foo ( bar );

Proto by rozšíření EBNF měli využívat notace. Například v gramatice jazyku List by 'function application' definuje následující pravidlo:

function application = list( symbol , { expression } );

Literatura[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

  1. http://standards.iso.org/ittf/PubliclyAvailableStandards/s026153_ISO_IEC_14977_1996(E).zip ISO/IEC 14977
  2. one EBNF

Externí odkazy[editovat | editovat zdroj]

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