En komputado, **plivastigita notacio de Backus-Naur** aŭ (laŭ la anglalingva mallongigo) **EBNF** estas sintaksa notacio por formuli senkuntekstan gramatikon, t.e. formala manieron priskribi programlingvojn kaj aliajn formalajn lingvojn. Tiu ĉi notacio havas plivastigitajn sintaksajn rimedojn kompare kun **notacio de Backus-Naur** (**BNF**).

La plej frua EBNF estis origine disvolvita de Niklaus Wirth. Ekzistas pluraj variantoj de EBNF. La Internacia Organizaĵo por Normigado akceptis EBNF kiel normon (ISO/IEC 14977). Tiu ĉi artikolo uzas en ekzemploj la formon de EBNF priskribitan en ISO-normo.

Bazo
----

EBNF estas kodo kiu priskribas gramatikon de komputada lingvo.
EBNF konsistas el finformaj simboloj kaj nefinformaj produktoreguloj kiuj estas limigoj regantaj kiel la finformaj simboloj povas esti kombinitaj en laŭleĝan esprimon.
Ekzemploj de finformaj simboloj estas literoj, ciferoj, interpunkciaj simboloj kaj spacaj signoj.

EBNF difinas produktoregulojn kie sinsekvoj de simboloj estas respektive aplikataj al finformaj kaj ne finformaj simboloj:

```
cifero sen nulo = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
cifero         = "0" | cifero sen nulo ;
```

Tiu ĉi produktoregulo difinas nefinforman elementon *cifero* kiu troviĝas ĉe la maldekstra flanko de la esprimo.
La vertikala streko reprezentas alternativon kaj la finformoj troviĝas inter citiloj kaj ĉion fermas punktokomo kiu estas la finsimbolo.
Tiel la `cifero` povas esti *0* aŭ `cifero sen nulo`, t.e. *1* aŭ *2* aŭ *3* ktp. ĝis *9*.

La produktoregulo povas ankaŭ enhavi sekvon de finformaj kaj nefinformaj elementoj, ĉiu apartigita per komo:

```
dekdu                = "1" , "2" ;
ducent unu           = "2" , "0" , "1" ;
tricent dekdu        = "3" , dekdu ;
dekdu mil decent unu = dekdu , tricent dekdu ;
```

Esprimoj kiuj povas aperi aŭ ne, troviĝas inter kurbaj krampoj `{ ... }`:

```
natura nombro = cifero sen nulo , { cifero } ;
```

Tiukaze, la ĉenoj *1*, *2*, ...*10*,...*12345*,... estas korektaj esprimoj.
Por prezenti tion, ĉio kio troviĝas inter kurbaj krampoj povas esti ripetitaj arbitrafoje, ankaŭ tute ne.

Se la elemento devas aperi almenaŭ unufoje, la norma EBNF sintakso utiligas kurbajn krampojn kun streko `{ ... }-`:

```
litero = "a" | "b" | "c" ;
ĉeno = "'" , { litero }- , "'" ;
```

Tiel difinita `ĉeno` povas esti:

```
'a', 'abc', ktp.
```

sed ne

```
'', 'a1c', 'bda' ktp.
```

Opcio povas esti esprimita per rektaj krampoj `[ ... ]`.
Ĉi, kio troviĝas inter rektaj krampoj povas aperi unu fojon aŭ tute ne:

```
entjero = "0" | [ "-" ] , natura nombro ;
```

Tiel entjero estas nulo (`0`) aŭ natura nombro kiu povas esti antaŭita per nedeviga minussigno.

Por priskribi elementojn kiuj aperas la difinitan nombron da fojoj, oni uzas steleton (`*`):

```
dudek du                  = 2 * "2" ;
trimil tricent tridek tri = 4 * "3" ;
```

Por esprimi esceptojn, EBNF utiligas strekon (`-`):

```
litero = "A" | "B" | "C" | "ĉ" | "D" | "E" | "F"
| "G" | "Ĝ" | "H" | "Ĥ" | "I" | "J" | "Ĵ"
| "K" | "L" | "M" | "N" | "O" | "P" | "R"
| "S" | "Ŝ" | "T" | "U" | "Ŭ" | "V" | "Z" ;
vokalo = "A" | "E" | "I" | "O" | "U" ;
konsonanto = litero - vokalo ;
```

### Tabelo de simboloj

EBNF uzas la jenajn operatorojn (montritaj laŭ prioritatoj):

| simbolo | funkcio |
| --- | --- |
| `*` | obligosimbolo |
| `-` | esceptosimbolo |
| `,` | kunmetosimbolo |
| `|` | simbolo de difinoapartigo |
| `=` | difinosimbolo |
| `;` | finsimbolo |

La prioritatoj povas esti ŝanĝitaj per jenaj simboloj:

| simbolo | funkcio |
| --- | --- |
| `'...'` | finforma esprimo (unua formo) |
| `"..."` | finforma esprimo (dua formo) |
| `(* ... *)` | komento |
| `( ... )` | grupigo |
| `[ ... ]` | opcio |
| `{ ... }` | ripeto |
| `? ... ?` | speciala esprimo |

Ekzemploj
---------

```
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";
hh = {aa}-, "H";
```

Tiel la finformaj ĉenoj difinitaj per la ĉi supraj reguloj estas jenaj:

```
aa: A
bb: AAAB
cc: C AC AAC AAAC
dd: D AD AAD AAAD AAAAD ktp.
ee: AE AAE AAAE AAAAE AAAAAE ktp.
ff: AAAF AAAAF AAAAAF AAAAAAF
gg: G AAAG AAAAAAG ktp.
hh: AH AAH AAAH AAAAH AAAAAH ktp.
```

Alternativo
-----------

La normo ISO/IEC 14977 difinas ankaŭ alternativajn simbolojn.
Ili estu uzataj se en komputiloj aŭ skribmaŝinoj mankas bazajn simbolojn.
Oni tamen devas uzi aŭ unu aŭ la duan simbolaron en unu dokumento por ne fari konfuzon.

| priskribo | baza simbolo | alternativa simbolo |
| --- | --- | --- |
| kunmeto | `,` (komo) |  |
| difino | `=` (egalsigno) |  |
| escepto | `-` (streko, minussigno) |  |
| obligo | `*` (steleto) |  |
| fino | `;` (punktokomo) | `.` (punkto) |
| citilo (unua formo) | `'` (apostrofo) |  |
| citilo (dua formo) | `"` (duobla apostrofo) |  |
| difinoapartigo | `|` (vertikala streko) | `/` (oblikva streko) aŭ `!` (krisigno) |
| komenco de grupigo | `(` (komenca krampo) |  |
| fino de grupigo | `(` (fina krampo) |  |
| komenco de komento | `(*` (komenca krampo, steleto) |  |
| fino de komento | `*)` (steleto, fina krampo) |  |
| komenco de opcio | `[` (komenca rekta krampo) | `(/` (komenca krampo, oblikva streko) |
| fino de opcio | `]` (fina rekta krampo) | `/)` (oblikva streko, fina krampo) |
| komenco de ripeto | `{` (komenca kurba krampo) | `(:` (komenca krampo, dupunkto) |
| fino de ripeto | `}` (fina kurba krampo) | `:)` (dupunkto, fina krampo) |
| komenco de speciala esprimo | `?` (demandosigno) |  |
| fino de speciala esprimo | `?` (demandosigno) |  |

Referencoj
----------

* La internacia normo (ISO 14977) difinanta EBNF senpage akirebla kiel Zip-densigita PDF dosiero.

* Kategorio EBNF en la Vikimedia Komunejo (Multrimedaj datumoj)