Die Backus-Naur-Form (Die Backus-Naur-Form), Lektion, Seite 724303
https://www.purl.org/stefan_ram/pub/backus-naur_programmieren (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Python-Kurs

Die Backus-Naur-Form

Die Backus-Naur-Form  (BNF ) ist eine kompakte, schriftliche Notation der Aufbaudiagramme, wie sie in der Spezifikation von Programmiersprachen, wie beispielsweise Python, verwendet wird.

Tatsächlich gibt es verschiedene Dialekte  der Backus-Naur-Form. Diese Lektion beschreibt zunächst eine spezielle EBNF-Variante, welche für diesen Kurs verwendet wird. Sie kann sich in Details von anderen Dialekten der BNF unterscheiden.

Heute verwendet man oft Dialekte der BNF, die gegenüber dem Original erweitert sind, und die man daher auch als EBNF  (erweiterte BNF) oder ABNF  (augmentierte BNF) bezeichnet.

Teile der EBNF sind inzwischen so weit bekannt, daß einzelne EBNF-Schreibweisen sogar im Duden ohne Erklärung verwendet werden, etwa zur Angabe des Genitivs von „Wort“ als „Wort[e]s“.

Die Sprache, welche man mit EBNF beschreibt (zum Beispiel Python ), wird auch als Objektsprache  bezeichnet. EBNF wird in diesem Falle als Metasprache  bezeichnet.

Terminalsymbole

Ein Terminalsymbol  ist ein Zeichen oder eine lexikalische Einheit. (Bei Aufbaudiagrammen kennzeichnet ein »|-|« am Eingang, daß das Aufbaudiagramm ein morphologisches Diagramm  ist und die Terminalsymbole darin Zeichen sind, sonst handelt es sich um ein Syntaxdiagramm, und die Terminalsymbole stehen dann für lexikalische Einheiten.)

Im Syntaxdiagramm wird ein Terminalsymbol in runden Kästchen notiert.

Diagrammdarstellung
 .-.    
( - )
'-'

In der EBNF schreiben wir die Zeichen eines Terminalsymbols zwischen Apostrophe.

EBNF
'-'
auf deutsch
ein Minuszeichen
EBNF
'if'
auf deutsch
Die lexikalische Einheit »if«

Ob es sich um Zeichen oder um lexikalische Einheiten handeln soll, muß gesondert angegeben werden.

Auch Anführungszeichen sind an Stelle von Apostrophen mit gleicher Bedeutung erlaubt.

EBNF
"-"
auf deutsch
„ein Minuszeichen“

Produktionsregeln

Im Syntaxdiagramm wird eine Kategorie als Beschriftung über einem Wegplan geschrieben, wenn der Wegplan angibt, wie jene Kategorie realisiert werden kann.

Diagrammdarstellung

Vorzeichen

.-.
--->( - )--->
'-'

In der EBNF werden Kategorienamen in spitzen Klammern geschrieben und erscheinen mit einem »::=« verbunden vor der Beschreibung ihrer Realisierungsmöglichkeiten. Die Produktionsregel endet dann mit einem Punkt „.“.

Erweiterte Backus-Naur-Form
Vorzeichen 〉 ::=
'-'.
auf deutsch
„Ein Vorzeichen kann durch ein Minuszeichen realisiert werden.“

Kategorienamen, wie „Vorzeichen “ werden auch als Nichtterminalsymbole  bezeichnet.

Alternativen

In Aufbaudiagrammen wird eine Alternative  durch eine Verzweigung  dargestellt.

Diagrammdarstellung
Vorzeichen
.-.
--->.--->( + )---.--->
| '-' ^
| .-. |
'--->( - )---'
'-'

In der EBNF werden Alternativen durch einen senkrechten Strich  »|« voneinander getrennt.

EBNF
Vorzeichen 〉 ::=
'+' | '-'.
auf deutsch
„Ein Vorzeichen kann durch ein Pluszeichen oder durch ein Minuszeichen realisiert werden.“
Beispiele
lower_case_latin_letter 〉 ::=
'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'.
upper_case_latin_letter 〉 ::=
'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'.

Sequenzen

In Aufbaudiagrammen wird eine Sequenz  durch eine Verbindung zweier Bestandteile mit einem Pfeil  dargestellt.

Diagrammdarstellung

Doppelgleich

.-. .-.
--->( = )--->( = )--->
'-' '-'

In der EBNF wird eine Sequenz durch Hintereinanderschreibung ausgedrückt.

EBNF
Doppelgleich 〉 ::=
'=' '='.
auf deutsch
„Ein Doppelgleich besteht aus einer Folge zweier Gleichheitszeichen.“

Falls die Sequenz als Operation besonders bezeichnet werden soll, verwenden wir eine Größer-Zeichen >“.

EBNF
Doppelgleich 〉 ::=
'=' > '='.

Prioritäten

Die Priorität des Größer-Zeichens „>“ ist stärker als die Priorität der Alternative „|“. Bei einer Sequenz, die ohne Größer-Zeichen geschrieben wird, kann man die Priorität ermitteln, nachdem man die weggelassenen Größer-Zeichen (gedanklich) hinzugefügt hat.

EBNF
primary-expression 〉 ::=
'1' |
'(' 〈expression 〉 ')'.
EBNF
primary-expression 〉 ::=
'1' |
'(' > 〈expression 〉 > ')'.
auf deutsch
„Eine primary-expression  ist entweder das Zeichen '1' oder eine Folge aus einer Klammer auf '(', einer expression  und einer Klammer zu ')'.“

Oft werden Alternativen untereinander (auf mehrere Zeilen) geschrieben und Sequenzen nebeneinander (auf einer Zeile), obwohl die Art und Weise der Aufteilung eines EBNF-Termes auf Zeilen keine Bedeutung hat.

Klammern

Um Operanden zu kennzeichnen können Klammern  verwendet werden.

EBNF
Vorzeichenausdruck 〉 ::=
( '+' | '-' )( '0' | '1' ).
auf deutsch
„Ein Vorzeichenausdruck besteht aus einem Vorzeichen ('+' oder '-') gefolgt von einer Ziffer ('0' oder '1').“

In Aufbaudiagrammen  sind solche Klammern nicht nötig, da die Führung der Pfeile es erlaubt, das Gemeinte auch ohne Klammern auszudrücken.

Referenzen

In einem Syntaxdiagramm werden Bezüge auf eine Kategorie durch eckige Kästchen dargestellt.

Syntaxdiagramm

Vorzeichenausdruck

.-. .---------.
--->( - )--->| Literal |--->
'-' '---------'

In einem EBNF-Term werden Bezüge durch Verwendung des Namens einer Kategorie (in spitzen Klammern) hergestellt.

EBNF
Vorzeichenausdruck 〉 ::=
'-' 〈Literal 〉.
auf deutsch
„Ein Vorzeichenausdruck besteht aus einem Minuszeichen '-' und einem folgenden Literal .“
Beispiel
latin_letter 〉 ::=
lower_case_latin_letter 〉 | 〈upper_case_latin_letter 〉.
statement 〉 ::=
labeled-statement 〉 |
compound-statement 〉 |
expression-statement 〉 |
selection-statement 〉 |
iteration-statement 〉 |
jump-statement 〉 .
primary-expression 〉 ::=
'1' |
'(' 〈expression 〉 ')'.
multiplicative-expression 〉 ::=
primary-expression 〉 |
multiplicative-expression 〉 '*' 〈primary-expression 〉 |
multiplicative-expression 〉 '/' 〈primary-expression 〉.
expression 〉 ::=
multiplicative-expression 〉 |
expression 〉 '+' 〈multiplicative-expression 〉 |
expression 〉 '-' 〈multiplicative-expression 〉.

Wiederholungen

In einem Aufbaudiagramm wird die Möglichkeit des mehrfachen Durchlaufens eines Weges durch die Pfeilführung  ausgedrückt.

morphologisches Diagramm

Zeichenfolge

|-|--->.------------------.--->|-|
^ |
| .---------. |
'---| Zeichen |<---'
'---------'

In einem EBNF-Term wird etwas, das beliebig oft (auch nullmal!) wiederholt werden kann in geschweifte Klammern eingeschlossen.

EBNF
Textdatei 〉 ::=
{ Zeile  }.
auf deutsch
„Eine Textdatei besteht aus einer Folge beliebig vieler Zeilen.“

Diese Verwendung geschweifter Klammern ist nicht mit der Verwendung geschweifter Klammern in Apostrophen oder Anführungszeichen zu verwechseln, durch die ein wörtliche geschweifte Klammer ausgedrückt wird.

Optionen

In einem Aufbaudiagramm wird die Möglichkeit des optionalen Durchlaufens eines Weges durch die Pfeilführung  ausgedrückt.

morphologisches Diagramm

Optionales Zeichen

.------------------.
| |
| .---------. v
|-|--->'---| Zeichen |----'--->|-|
'---------'

In einem EBNF-Term wird etwas, das auch weggelassen werden kann, in eckige Klammern eingeschlossen.

EBNF
T  〉 ::=
'a' [ 'b' ] 'c'.
auf deutsch
„Ein T   besteht aus einem 'a' und einem 'c', zwischen denen noch ein 'b' stehen darf.“

Diese Schreibweise ist inzwischen so weit bekannt, daß sie sogar im Duden ohne Erklärung verwendet wird, etwa zur Angabe des Genitivs von „Wort“ als „Wort[e]s“.

weiteres Beispiel
expression-statement〉 ::=
[〈expression 〉] ';'.

Angaben außerhalb der EBNF

Bei der Beschreibung einer Sprache mit Hilfe von EBNF-Produktionsregeln werden verschiedene Regelung außerhalb der EBNF-Notation festgelegt:

Wenn eine Grammatik für eine Sprache angegeben werden soll, dann muß noch gesagt werden, welches Symbol ein „Programm“ dieser Sprache darstellen soll. Auch dieses sogenannte Startsymbol  wird außerhalb der EBNF-Notation festgelegt.

Quellen zur BFN  und zur EBNF 

Die hier vorgestellte Notation ähnelt der BNF  oder ENBF. Von diesen Notationen gibt es aber verschiedenen Varianten, zu denen hier einige Quellen angegeben sind:

Naur 60 Peter Naur  (ed.), Revised Report on the Algorithmic Language ALGOL 60, Communications of the ACM, Vol. 3 No. 5, pp. 299–314, 1960-05.

RFC 2234 Overell Crocker, Augmented BNF for Syntax Specifications: ABNF, RFC 2234, 1997-11.

ISO 14977 ISO/IEC 14977:1996(E), Information technology: Syntactic metalanguage ISO/IEC 14977 : 1996(E), Extended BNF.

Seltener gebrauchte Notationen ⃗

In diesem Abschnitt werden noch einige Notationen für spezielle Fälle festgelegt, die aber selten benötigt und verwendet werden.

Groß- und Kleinschreibung ⃗

Normalerweise wird außerhalb der EBNF-Notation angegeben, ob Großschreibung signifikant ist.

Falls in einem speziellen Falle doch einmal innerhalb der EBNF-Notation ausgedrückt werden soll, daß Großschreibung nicht  signifikant ist, so wird dem Terminalsymbol direkt ein senkrechter Strich |“ vorangestellt.

EBNF
|'AB'

Soll  zwischen Groß- und Kleinschreibung unterschieden werden, so wird den verwendeten Hochkommas direkt ein Gleichheitszeichen =“ vorangestellt, falls dies in einem Einzelfall nötig ist oder betont werden soll.

EBNF
='AB'

Spezielle Schreibweisen für Zeichen ⃗

Ein einzelnes Zeichen kann auch durch seine dezimale Unicode-Codepunkt-Kennzahl angegeben werden.

EBNF
%d65
auf deutsch
ein großes A

Alternativ kann auch eine hexadezimale Unicode-Codepunkt-Kennzahl angegeben werden.

EBNF
%x41
auf deutsch
ein großes A

Bereiche von Zeichen ⃗

Zeichenbereiche können angegeben werden, wenn es sich um Teilbereiche des englischen Alphabets oder der Ziffern von „0“ bis „9“ handelt.

EBNF
'g' - 'm'.
EBNF
'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm'
auf deutsch
„Ein Zeichen von 'g' (einschließlich) bis 'm' (einschließlich).“

Leeraum ⃗

Ob Leerraum zwischen den einzelnen Bestandteilen einer Sequenz erlaubt ist, wird in der Regel zusätzlich  zu den EBNF-Produktionsregeln angegeben. Falls in einem bestimmten Fall ausnahmsweise kein  Leerraum erlaubt ist oder das Verbot des Leerraums besonders betont werden soll, schreiben wir einen Doppelpunkt :“ an die Stelle eines Größer-Zeichens.

EBNF
Doppelgleich 〉 ::=
'=' : '='.

Falls in einem bestimmten Fall ausnahmsweise Leerraum erlaubt ist  oder die Möglichkeit der Verwendung von Leerraums besonders betont werden soll, schreiben wir einen Grundstrich _“ an Stelle eines Größer-Zeichens.

EBNF
Doppelgleich 〉 ::=
'=' _ '='.

Wann Leerraum zwischen den einzelnen Bestandteilen einer Sequenz notwendig  ist, wird in der Regel zusätzlich  zu den EBNF-Produktionsregeln angegeben. Falls die Notwendigkeit des Leerraums besonders betont werden soll, schreiben wir zwei Grundstriche _“ an Stelle eines Größerzeichens.

EBNF
Doppelgleich 〉 ::=
'=' _ _ '='.

Beschreibungen ⃗

Beschreibende Nichtterminalsymbole, die nicht weiter definiert sind, werden durch eine Tilde »~« nach der öffnenden spitzen Klammer gekennzeichnet.

preprocessing-token 〉 ::=
〈~each non-white-space character that cannot be one of the above 〉.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram724303 stefan_ram:724303 Die Backus-Naur-Form Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd724303, slrprddef724303, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/backus-naur_programmieren