Bilgisayar biliminde, **Genişletilmiş Backus–Naur formu** (**EBNF**) bağlamdan bağımsız dilbilgisini (context-free grammar) ifade etmek için kullanılan bir notasyondur. Başka bir ifadeyle, bilgisayar programlama dillerini ve biçimsel dilleri (formal languages) 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. ISO 14977

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**(ara simge biçimi)lere 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 (<, >, |, ::=) 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 ("<...>") 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ı:

| Kullanım | Notasyon |
| --- | --- |
| definition | = |
| concatenation | , |
| termination |  ; |
| separation | | |
| option | [ ... ] |
| repetition | { ... } |
| grouping | (...) |
| double quotation marks | "... "|
| single quotation marks | ' ... ' |
| comment | (\* ... \*) |
| special sequence |  ? ... ? |
| exception | - |

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 3 Aralık 2003 tarihinde Wayback Machine sitesinde arşivlendi. 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.

Şunları da inceleyin
--------------------

* Augmented Backus-Naur form
* Backus-Naur form
* Regular expression
* Spirit Parser Framework
* Wirth syntax notation

Kaynakça
--------

* Niklaus Wirth: What can we do about the unnecessary diversity of notation for syntactic definitions?19 Temmuz 2020 tarihinde Wayback Machine sitesinde arşivlendi. CACM, Vol. 20, Issue 11, November 1977, pp. 822–823.
* Roger S. Scowen: Extended BNF — A generic base standard. Software Engineering Standards Symposium 1993.
* The International standard (ISO 1497713 Mart 2006 tarihinde Wayback Machine sitesinde arşivlendi.) that defines the EBNF is now freely available as zipped pdf file 11 Mart 2007 tarihinde Wayback Machine sitesinde arşivlendi..

Dış bağlantılar
---------------

* Article "EBNF: A Notation to Describe Syntax (PDF) 24 Temmuz 2008 tarihinde Wayback Machine sitesinde arşivlendi." by Richard E. Pattis describing the functions and syntax of EBNF
* Article "BNF and EBNF: What are they and how do they work?11 Şubat 2010 tarihinde Wayback Machine sitesinde arşivlendi." by Lars Marius Garshol
* Article "The Naming of Parts 13 Mayıs 2008 tarihinde Wayback Machine sitesinde arşivlendi." by John E. Simpson
* ISO/IEC 14977 : 1996(E)10 Eylül 2010 tarihinde Wayback Machine sitesinde arşivlendi.
* RFC 4234 - Augmented BNF for Syntax Specifications: ABNF
* BNF/EBNF variants 24 Mayıs 2008 tarihinde Wayback Machine sitesinde arşivlendi. - a table by Pete Jinks comparing several syntaxes.
* Create syntax diagrams from EBNF