Genişletilmiş Backus-Naur formu

Bilgisayar biliminde, **Genişletilmiş Backus–Naur formu** (**EBNF**) bağlamdan bağımsız dilbilgisini ifade etmek için kullanılan bir notasyondur. Başka bir ifadeyle, bilgisayar programlama dillerini ve biçimsel dilleri tanımlamanın bir yoludur. Backus-Naur formu (BNF) notasyonunu temel alır.

Niklaus Wirth tarafından geliştirilmiştir. En yaygın kullanılan türevleri standartlaştırılmıştır.

## Temel Bilgiler

Kod, örneğin bir bilgisayar programının kaynak kodu, **terminal sembol**(amaç simge) olarak adlandırılan sembollerden oluşur. Bu semboller, karakterler, sayılar, noktalama işaretleri, boşluk işaretleri vb. olabilir.

**EBNF**, bu terminal sembol dizilerinin ilgili **terminal olmayan (nonterminal) sembol**lere (ara simge biçimi) atanmasıyla oluşan **üretim kuralı**nı (production rule) tanımlar.

**Örnek:**

 sifir haric sayi ::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
 sayi                 ::= "0" | sifir haric sayi;

Bu üretim kuralı sol tarafta *sayi* adında terminal olmayan bir atama yapar. Dik çubuklar **|** alternatifleri gösterir (başka bir ifadeyle *veya* şeklinde de tanımlanabilir), kuralı oluşturan terminal semboller çift tırnak arasında verilmiş ve noktalı virgül ifadeyi sonlandırmıştır. *sayi*, *0 veya sifir haric sayi* olarak ifadelendirildiğinden, bu kurala göre 0 ila 9 arasında değer alabilir.

Bir üretim kuralı virgül kullanarak terminal veya terminal olmayan semboller dizisi şeklinde de yazılabilir:

 oniki                ::= "1", "2" ;
 ikiyuzbir            ::= "2", "0", "1" ;
 ucyuzoniki           ::= "3", oniki;
 onikibinikiyuzbir    ::= oniki, ikiyuzbir;

Atlanabilir veya tekrarlanabilir ifadeler süslü parantez ile verilebilir **{ ... }**:

 dogal sayi ::= sifir haric sayi, { sayi } ;

Bu durumda, *1*, *2*, ...,*10*,...,*12345*,... sözceleri doğru ifadelerdir. Süslü parantez içinde verilene uygun ifade hiç kullanılmasa da, defalarca kullanılsa da doğrudur.

Köşeli parantez opsiyonlu kullanımı ifade eder **[ ... ]**:

 tam sayi ::= "0" | [ "-" ], dogal sayi;

Bu kurala göre tam sayı sıfır veya işareti - olan veya olmayan bir doğal sayı olabilir.

EBNF ile yapılabilecek diğer şeyler arasında sembol tekrarına sınır koyabilme, üretim kuralında belli yerlere erişim engelleme veya açıklama kısımları ekleme gibi özellikleri sayabiliriz.

## ISO standardına göre genişlemeler

ISO 14977 standardına göre EBNF genişletilebilirdir ve iki durumdan bahsedilir. Birincisi soru işareti arasında isteğe bağlı karakter katarı tanımlayabilmedir. Örneğin, boşluk karakteri aşağıdaki kuralla tanımlanabilir:

 bosluk ::= ? US-ASCII character 32 ?;

İkinci durum şöyledir. Normalde etiket ifadeler parantez ile yazılamaz. Yani aşağıdaki şekil EBNF de geçersizdir:

 something ::= foo (bar);

Ancak EBNF nin bir uzantısı bu notasyonu kullanabilir. Örneğin, Lisp dilbilgisinde, bir fonksiyon aşağıdaki kuralla tanımlanabilir.

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

## BNF'yi genişletmek

BNF isteğe bağlı öğe ve tekrarlamaların ifade edilememesi gibi bir soruna sahipti. Onun yerine ya hiç yokluk ve isteğe bağlı yapı içeren bir ara kural ya da tekrarlanan yapı ya da kendisi, biçiminde özyinelemeli bir kural kullanmak gerekiyordu.

Option:

 signed number ::= [ sign, ] number;

BNF stilinde:

 signed number ::= sign, number | number;

ya da:

 signed number ::= optional sign, number;
 optional sign ::= ε | sign ; (* epsilon açıkça boş bir yapıyı temsilen kullanılmıştır *)

şeklinde tanımlanabilir.
Yineleme:

 number ::= { digit } ;

BNF stilinde şöyle tanımlanabilir.:

 number ::= digit | number digit;

## Diğer eklemeler ve değişiklikler

EBNF BNF' nin bazı hatalarını düzeltir:

* Backus-Naur biçimi (&lt;, &gt;, |, ::=) işaretlerini kendi için kullanır. Bu işaretleri kullanan bir dil, Backus-Naur biçiminde bir değişiklik ya da açıklama yapılmadan kullanılamaz.
* Backus-Naur biçimi satır başına bir kurala izin verir.

Genişletilmiş Backus-Naur biçimi bu sorunları çözer:
* Amaç simgeler mutlaka tırnak işaretleri içine alınır. Ara biçim simgelerindeki açılı ayraçlar ("&lt;...&gt;") kaldırılabilir.
* Kuralın bitişini bir bitirici karakter, genellikle noktalı virgül, belirler.

Ayrıca, yineleme sayısını belirlemek, bazı olası seçenekleri dışlamak, yorumlar gibi geliştirme mekanizmaları da mevcuttur.

Buna rağmen, Genişletilmiş Backus-Naur biçimi tanımlayabileceği diller ölçüsünde Backus-Naur biçiminden daha ileri değildir. Genişletilmiş Backus-Naur biçimi ile gösterilen her dilbilgisi Backus-Naur biçimi ile de gösterilebilir. Ancak bu genellikle daha büyük bir temsile varır.

Genişletilmiş Backus-Naur biçimi, ISO tarafından *ISO/IEC 14977:1996(E)* kodu ile standartlaştırılmıştır.

Under some circumstances any extended BNF is referred to as EBNF. For example the W3C uses ''one'' EBNF to specify XML.

## Diğer bir örnek

EBNF' ye göre tanımlanmış atamalara izin veren basit bir programlama dili:

 (* a simple program in EBNF − Wikipedia *)
 program ::= 'PROGRAM', white space, identifier, white space,
            'BEGIN', white space,
            { assignment, ";", white space },
            'END.' ;
 identifier = alphabetic character, { alphabetic character | digit } ;
 number ::= [ "-" ], digit, { digit } ;
 string ::= '"', { all characters − '"' }, '"' ;
 assignment ::= identifier, ":=", (number | identifier | string ) ;
 alphabetic character ::= "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" ;
 digit ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
 white space ::= ? white space characters ? ;
 all characters ::= ? all visible characters ? ;

Yukarıdaki kurala göre söz dizimi doğru olan bir program:

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

Bu dil kontrol akışları, matematiksel ifadeler ve G/Ç komutlarıyla kolayca genişletilebilir, küçük ve kullanılabilir bir programlama dili haline getirilebilir.

Standartta normal gösterim olarak önerilen şu işaretler kullanıldı:

## Kurallar

1. The following conventions are used:
* Each meta-identifier of Extended BNF is written as one or more words joined together by hyphens;
* A meta-identifier ending with “-symbol” is the name of a terminal symbol of Extended BNF.
2. The normal character representing each operator of Extended BNF and its implied precedence is (highest precedence at the top):
 * repetition-symbol
 - except-symbol
, concatenate-symbol
 | definition-separator-symbol
 = defining-symbol
 ; terminator-symbol
3. The normal precedence is over-ridden by the following
bracket pairs:
 ´  first-quote-symbol            first-quote-symbol  ´
 "  second-quote-symbol          second-quote-symbol  "
 (* start-comment-symbol          end-comment-symbol *)
 (start-group-symbol              end-group-symbol )
 [  start-option-symbol            end-option-symbol  ]
 {  start-repeat-symbol            end-repeat-symbol  }
 ?  special-sequence-symbol   special-sequence-symbol ?

As examples, the following syntax-rules illustrate the
facilities for expressing repetition:
 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}, "D";
Terminal-strings defined by these rules are as follows:
 aa: A
 bb: AAAB
 cc: C AC AAC AAAC
 dd: D AD AAD AAAD AAAAD etc.
 ee: AE AAE AAAE AAAAE AAAAAE etc.
 ff: AAAF AAAAF AAAAAF AAAAAAF
 gg: D AAAD AAAAAAD etc.

## İlgili çalışmalar
* The W3C used a different EBNF  to specify the XML syntax.
* The British Standards Institute published a standard for an EBNF: BS 6154 in 1981.
* The IETF uses Augmented BNF (ABNF), specified in RFC 4234.

## Ayrıca bakınız
* Backus-Naur formu
* Düzenli ifade

## Kaynakça

* Niklaus Wirth: What can we do about the unnecessary diversity of notation for syntactic definitions? CACM, Vol. 20, Issue 11, November 1977, pp.&nbsp;822–823.
* Roger S. Scowen: Extended BNF — A generic base standard. Software Engineering Standards Symposium 1993.
* The International standard (ISO 14977) that defines the EBNF is now freely available as [zipped pdf file](http://standards.iso.org/ittf/PubliclyAvailableStandards/s026153_ISO_IEC_14977_1996(E).zip) .

## Dış bağlantılar

* Article "EBNF: A Notation to Describe Syntax (PDF)"  by Richard E. Pattis describing the functions and syntax of EBNF
* Article "BNF and EBNF: What are they and how do they work?"  by Lars Marius Garshol
* Article "The Naming of Parts"  by John E. Simpson
* ISO/IEC 14977 : 1996(E) 
* RFC 4234 - Augmented BNF for Syntax Specifications: ABNF
* BNF/EBNF variants, a table by Pete Jinks comparing several syntaxes 
* EBNF Visualizer