EBNF (Extended Backus-Naur Form) ist die erweiterte Schreibweise, mit der die kontextfreie Grammatik einer Programmiersprache oder eines Datenformats formal dokumentiert wird. Sie entstand aus der Backus-Naur Form, die John Backus und Peter Naur in den 1960er Jahren für die Definition von Algol 60 entwickelten.
Was EBNF auszeichnet
Eine Grammatik in EBNF besteht aus Regelzeilen der Form Name ::= Ausdruck. Der Doppelpunkt-Doppelpunkt (::=), den manche als Pfeil -> schreiben, bedeutet: „'Name' ist definiert als'. Auf der rechten Seite stehen Terminale (die tatsächlichen Zeichen, in Anführungszeichen) und Nichtterminale (andere Regeln, in spitzen Klammern). Dazu kommen Metazeichen, die das Wiederholen und Weglassen ausdrücken:
*— null oder mehr Wiederholungen+— eine oder mehr Wiederholungen?— optional, null oder genau einmal()— Gruppierung von Teilausdrücken[]— optionale Teile (in der ISO-Variante){}— Wiederholung (in der ISO-Variante)|— Alternative („oder')
Zahl ::= ['-'] Ziffer+ { '.' Ziffer+ }
Ziffer ::= '0' | '1' | '2' | ... | '9'
Das Beispiel beschreibt eine vorzeichenlose oder negative Dezimalzahl mit optionalem Nachkommateil. Weil jede Regel genau ein Nichtterminal auf der linken Seite hat, beschreibt EBNF immer Grammatiken der Chomsky-Stufe 2.
EBNF ist eine Notation, keine Grammatik
Die Abgrenzung ist wichtig: Die kontextfreie Grammatik ist das mathematische Konzept (Menge aus Terminalsymbolen, Nichtterminalen, Produktionen und Startsymbol). EBNF ist nur die handliche Schreibweise dafür – vergleichbar mit JSON als Notation für Datenstrukturen. Deshalb existieren mehrere Dialekte: die ISO-Norm 14977, die W3C-eigene EBNF der XML-Spezifikation und das verwandte ABNF aus den RFC-Dokumenten des Internets.
Von EBNF zum Parser
Aus einer EBNF-Beschreibung lassen sich direkt Parser-Generatoren füttern: Yacc und Bison akzeptieren eine BNF-ähnliche Grammatik, Antlr verwendet eine EBNF-artige Schreibweise in .g4-Dateien. Auch beim Handschreiben eines rekursiven Abstiegs übersetzt man die EBNF-Regeln fast mechanisch in Funktionen – jede Regel wird eine Funktion, Wiederholungen werden Schleifen. Wer die Regeln als formale Notation versteht, kann umgekehrt auch die Syntax jeder Sprache in einer Spezifikation nachlesen. Der Lexer einer IDE verwendet die gleiche Idee, um Token zu erkennen.
Verwandte Grundlagen: Kontextfreie Grammatik, Parser-Generator, LL-Parser.