Movatterモバイル変換


[0]ホーム

URL:


Zum Inhalt springen
WikipediaDie freie Enzyklopädie
Suche

Backus-Naur-Form

Dies ist ein als lesenswert ausgezeichneter Artikel.
aus Wikipedia, der freien Enzyklopädie

DieBackus-Naur-Form oderBackus-Normalform (kurzBNF) ist eine kompakte formaleMetasprache zur Darstellungkontextfreier Grammatiken (Typ-2-Grammatiken in derChomsky-Hierarchie). Hierzu zählt dieSyntax gängigerhöherer Programmiersprachen. Sie wird auch für dieNotation von Befehlssätzen undKommunikationsprotokollen verwendet.

Ursprünglich war sie nachJohn W. Backus benannt, später wurde sie (auf Anregung vonDonald E. Knuth) auch nachPeter Naur benannt. Beide waren Pioniere derInformatik, die sich mit der Erstellung derAlgol-60-Regeln und insbesondere mit der Kunst desCompilerbaus beschäftigten.[1][2] Durch die Backus-Naur-Form imAlgol 60 Report wurde es erstmals möglich, die Syntax einer Programmiersprache formal exakt, also ohne die Ungenauigkeiten natürlicher Sprachen, darzustellen.

Es gibt viele Varianten der Backus-Naur-Form. Dieerweiterte Backus-Naur-Form (EBNF) ist eine gebräuchliche Variante, die unter anderem eine kompakte Notation von sich wiederholenden Elementen erlaubt. Für Syntaxdefinitionen in Internetnormen wird überwiegend dieangereicherte Backus-Naur-Form (ABNF) verwendet.

Grundlagen

[Bearbeiten |Quelltext bearbeiten]

Ein Programm besteht zunächst aus – auf Bildschirm oder Papier – sichtbaren Zeichen. Daneben treten ggf. noch Leerzeichen sowie Zeilen- und Spaltentrennzeichen auf. Diese Zeichen zählen zu denTerminalsymbolen (englischterminal symbols oder kurzterminals), da sie von einer BNF final erzeugt werden.

Die BNF verwendet zur Erzeugung der finalen Folge von Terminalsymbolen sogenannteAbleitungsregeln(Produktionen). Jede Ableitungsregel definiert einNichtterminalsymbol (englischnonterminal symbol oder kurznonterminal) zusammen mit Folgen von Terminal- und Nichtterminalsymbolen, durch die es bei einer Erzeugung ersetzt wird. Oftmals dient dabei das Zeichen| (vertikaler Strich) als Alternative, die Zeichenfolge::= wird zur Kennzeichnung einer Definition verwendet und die Nichtterminalsymbole (auch syntaktische Variablen genannt) werden mit spitzen Klammern<,> umschlossen.

Beispiel einer Definition eines Nichtterminalsymbols mit Alternativen an Terminalsymbolen:

<Ziffer ausser Null>::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Eine Ziffer außer Null ist also entweder eine 1 oder eine 2 oder eine 3 usw. Es lassen sich auch Nichtterminalsymbole definieren, die bei einer Erzeugung durch eine Folge von Terminal- und Nichtterminalsymbolen ersetzt werden.

Zum Beispiel:

<Ziffer>::= 0 |<Ziffer ausser Null><Zweistellige Zahl>::=<Ziffer ausser Null><Ziffer><Zehn bis Neunzehn>::= 1<Ziffer><Zweiundvierzig>::= 42

Eine Ziffer ist also eine 0 oder eine Ziffer außer Null. Eine zweistellige Zahl ist eine Ziffer außer Null gefolgt von einer Ziffer. Zweiundvierzig ist eine 4 gefolgt von einer 2.

Wiederholungen müssen in der BNF überRekursionen definiert werden. Eine Ableitungsregel kann dazu insbes. auf der rechten Seite das Symbol auf der linken Seite enthalten, etwa:

<Ziffernfolge>::=<Ziffer> |<Ziffernfolge><Ziffer>

Bedeutung: Eine Ziffernfolge ist eine Ziffer oder eine Ziffernfolge gefolgt von einer Ziffer.

Eine so definierte Ziffernfolge passt also zu den Terminalsymbolfolgen 0, 1, 2, 10, 9870, 8970635 usw., jedoch auch zu 00, 000, …

Soll eine positive Zahl nicht mit 0 beginnen, leistet dies etwa die folgende Regel:

<Positive Zahl>::=<Ziffer ausser Null> |<Positive Zahl><Ziffer>

Bedeutung: Eine positive Zahl ist eine Ziffer außer Null oder eine positive Zahl gefolgt von einer Ziffer.

BNF und kontextfreie Sprachen

[Bearbeiten |Quelltext bearbeiten]

Die Produktionsregeln der BNF (nach Backus) sind genau die in kontextfreien Grammatiken (nachChomsky) erlaubten Regeln, es ist also klar, dass beide Formalismen dieselben Sprachen erzeugen. Sie entstanden auch zu derselben Zeit, nämlich am Ende der 1950er Jahre. Es gibt aber erst seit 1961 einen Hinweis auf den Zusammenhang, nämlich in einem Überblicksartikel über Metasprachen von Saul Gorn,[3] dort noch als Zusammenhang von BNF mit allgemeinenPhrasenstrukturgrammatiken dargestellt und erst später – genauer – auf kontextfreie Grammatiken beschränkt. Im Folgejahr gab es einen Briefwechsel zwischen Gorn und Knuth über dieses Thema in den Leserbriefen(letters to the editor) vonComm. ACM. Es ist plausibel anzunehmen, dass Chomsky und Backus ihre Formalismen unabhängig voneinander entwickelten und Gorn der erste war, der beide Ansätze kannte und so die Verbindung herstellen konnte.[4]

BNF und Programmiersprachen

[Bearbeiten |Quelltext bearbeiten]

Um die Syntax von Programmiersprachen wieALGOL,Pascal,C oderJava in der BNF darzustellen, können derenSchlüsselwörter (z. B.IF,SWITCH) zu den Terminalsymbolen gezählt werden.[5] Dies lässt es später zu, die finale Bezeichnung der Schlüsselwörter bei einer Implementierung eines Compilers willkürlich festzulegen. Alternativ können die Schlüsselwörter über Nichtterminalsymbole als Folgen von Terminalsymbolen (z. B. Buchstabenfolgen) festgelegt werden.[1] In einem Compiler werden die Schlüsselwörter in einer Vorphase, derlexikalischen Analyse, erkannt und als besondere Zeichenfolgen weitergegeben. Kommentare werden von der lexikalischen Analyse erkannt (und oft entfernt), zudem ggf. auch weitere Elemente wie Gleitkommazahlen, Bezeichner und initiale Zeichenketten.

Damit lässt sich die gesamte Syntax z. B. eines PASCAL-Programms in BNF darstellen (teilweise gekürzt):

<Programm>::= 'PROGRAM'<Bezeichner> 'BEGIN'<Satzfolge> 'END' .<Bezeichner>::=<Buchstabe><Restbezeichner><Restbezeichner>::= |<Buchstabe oder Ziffer><Restbezeichner><Buchstabe oder Ziffer>::=<Buchstabe> |<Ziffer><Buchstabe>::= A | B | C | D | … | Z | a | b | … | z<Ziffer>::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9<Satzfolge>::=

Die Spezifikation in Zeile 3 beginnt mit| und bedeutet, dass dieser selbst-rekursiveRestbezeichner auch „nichts“ sein darf, was am Ende der Rekursion zwingend erforderlich ist, weil sonst immer wieder ein neues Zeichen erforderlich wäre.

Eine Syntaxanalyse besteht aus der Rückführung eines Programmtexts auf das Nichtterminalsymbol<Programm>. Ein Programm muss also mit dem WortPROGRAM beginnen, auf das ein Bezeichner folgt. Bezeichner beginnen mit einem Buchstaben, gefolgt von beliebig vielen Buchstaben oder Ziffern.

Die Rückführung auf <Programm> gelingt bei

  PROGRAM Ggt BEGIN … END .  PROGRAM DiesisteinlangerBezeichnermit123 BEGIN … END .

nicht jedoch bei

  Ggt BEGIN … END .         (beginnt nicht mit PROGRAM)  PROGRAM 123 BEGIN … END . (123 ist kein Bezeichner, Bezeichner müssen mit einem Buchstaben beginnen)

Beispiel

[Bearbeiten |Quelltext bearbeiten]

Hier eine BNF für eine deutschePostanschrift:

<Post-Anschrift>::=<Personenteil><Strasse><Stadt><Personenteil>::=<Titelteil><Namensteil><EOL><Titelteil>::=<Titel> |<Namensteil>::=<Vornamensteil><Nachname> |<Vornamensteil><Namensteil><Vornamensteil>::=<Vorname> |<Initial> .<Strasse>::=<Strassenname><Hausnummer><EOL><Stadt>::=<Postleitzahl><Stadtname><EOL>

Die Ausformulierung lautet:

  • Eine Postanschrift besteht aus einem Personenteil, gefolgt von einer Straße, gefolgt von der Stadt.
  • Der Personenteil besteht aus einem Titelteil und einem Namensteil, gefolgt von einem Zeilenende – gekennzeichnet durch <EOL>.
  • Der Titelteil besteht aus einem Titel oder ist leer.
  • Der Namensteil besteht aus einem Vornamensteil und einem Nachnamen oder aus einem Vornamensteil und wiederum einem Namensteil. (Diese Regel zeigt die Benutzung vonRekursion in BNFs und stellt den Fall dar, dass eine Person mehrere Vornamen und/oderInitialen besitzt.)
  • Der Vornamensteil besteht aus einem Vornamen oder einem Initial, auf den ein Punkt folgt.
  • Eine Straße besteht aus einem Straßennamen, gefolgt von einer Hausnummer, gefolgt von einem Zeilenende.
  • Eine Stadt besteht aus einer Postleitzahl, gefolgt von einem Stadtnamen, gefolgt von einem Zeilenende.

Man beachte, dass einiges (wie die Postleitzahl oder Hausnummer) nicht weiter spezifiziert ist. Es wird angenommen, dass diese lexikalischen Details vom Zusammenhang abhängen oder anderweitig spezifiziert sind.

Oft wird der Titel in eckige Klammern gestellt, der Titelteil entfällt. Dies bedeutet, dass der Titel leer sein darf:

Option:

<Personenteil>::= [<Titel> ]<Namensteil><EOL>

Dieses Beispiel ist keine reine Form aus demAlgol 60 Report. Die eckigen Klammern[…] stellen eine Option dar. Sie wurden einige Jahre später in der Definition vonIBMsPL/I eingeführt, sind aber allgemein nur inEBNF anerkannt.

Option:

<Zahl>::= [ - ]<Positive Zahl>

Das Minuszeichen ist optional. Die Definition ist äquivalent zu

<Zahl>::=<Positive Zahl> | -<Positive Zahl>

Eine Zahl ist eine positive Zahl, oder ein Minuszeichen, gefolgt von einer positiven Zahl.

Modifikationen der BNF

[Bearbeiten |Quelltext bearbeiten]
Syntaxdiagramme der modifizierten BNF

Die Alternative und die Sequenz sind zur Darstellung der BNF grundsätzlich geeignet. Allerdings lassen sich die Zeichen |, [, ] nicht von den BNF-Zeichen unterscheiden. Oft können auch Zeichen wie Punkt oder Minus nur schwer erkannt werden.

Die BNF wird daher in der Regel etwas modifiziert und ergänzt:

  • Keine spitzen Klammern<…> für Nichtterminale.
  • Zeichen als Terminalsymbole werden in Anführungszeichen gesetzt ("0" | "1" …)
  • Nichtterminalsymbole in Kleinbuchstaben.
  • Schlüsselwörter in Großbuchstaben.
  • Nur = statt ::=.
  • Ein Punkt am Ende einer Regel. Mehrzeilige Regeln sind möglich.
ziffer="0"|"1"|"2"|"3"||"9".zifferaussernull="1"|"2"|"3"||"9".ziffernfolge=ziffer|zifferziffernfolge.zahl=["-"]zifferaussernull[ziffernfolge]|"0".programm=PROGRAMbezeichnerBEGINsatzfolgeEND".".

Die Option wird manchmal nicht mit eckigen Klammern, sondern durch ein angefügtes Fragezeichen dargestellt. Die Wiederholung durch Rekursion ist oft umständlich:

  • Optionen werden durch ein angefügtes Fragezeichen dargestellt.
  • Wiederholungen (ein- oder mehrfach) werden durch ein angefügtes Pluszeichen dargestellt.
  • Optionale Wiederholungen (keinmal, ein- oder mehrfach) werden durch einen angefügten Stern dargestellt.
  • Klammern dienen zur Gruppierung
ziffernfolge::=ziffer+.zahl::=("-")?zifferaussernull(ziffernfolge)?|"0".bezeichner::=buchstabe(buchstabe|ziffer)*.

Dieerweiterte Backus-Naur-Form geht andere Wege. Sie verwendet eckige Klammern[…] für die Option, jedoch geschweifte Klammern{…} für die optionale Wiederholung. Terminale und Nichtterminale werden nicht streng unterschieden. Hier würde das obenstehende Beispiel so dargestellt:

Ziffernfolge=Ziffer{Ziffer};Zahl=["-"]ZifferAusserNull[Ziffernfolge]|"0";Bezeichner=Buchstabe{Buchstabe|Ziffer};

Selbstdefinition einer (modifizierten) BNF

[Bearbeiten |Quelltext bearbeiten]

Eine modifizierte BNF kann sich selbst definieren:

Modifiziertebnf::=|SatzModifiziertebnf.Satz::=Nichtterminal":"":""="Elementliste".".Elementliste::=|ElementElementliste.Element::=Terminal|Nichtterminal.Nichtterminal::=Kleinbuchstabe|KleinbuchstabeNichtterminal.Terminal::=Schluesselwort|AnfSichtbareszeichenAnf.Schluesselwort::=Grossbuchstabe|GrossbuchstabeSchluesselwortGrossbuchstabe::="A"|"B"||"Z".Kleinbuchstabe::="a"|"b"||"z".Sichtbareszeichen::="!"|"$"|"%"|(''allesichtbarenZeichen'').Anf::='"'.

Bei dieser Version werden Schlüsselwörter als Großbuchstaben dargestellt, Nichtterminale als Kleinbuchstaben. Wiederholungen müssen über Rekursionen definiert werden. Davon wird in der eigenen Definition auch Gebrauch gemacht (modifiziertebnf,elementliste,nichtterminal,schlüsselwort).

BNF und Parser-Generatoren

[Bearbeiten |Quelltext bearbeiten]

MancheParsergeneratoren verwenden eine eigene Form der BNF als Eingabe und generieren hieraus einenParser für die zugrundeliegende Programmiersprache.

Das dem BetriebssystemUnix beigegebeneyacc ist so ein Programm. Es generiert einen tabellengesteuerten Parser aus einer BNF-Definition, wobei nur Produktionen (: statt ::=) und Alternativen (|) zulässig sind. Dies ist notwendig, da yacc eineS-Attribution ermöglicht, einem optionalen Teil jedoch kein sinnvoller semantischer Typ des Attributs zugeordnet werden kann. Als Ausgabe erhält man einUnterprogramm in der Programmiersprache C. Die zugrundeliegende Grammatik muss dabei dieLALR-Eigenschaft erfüllen.

Siehe auch

[Bearbeiten |Quelltext bearbeiten]

Literatur

[Bearbeiten |Quelltext bearbeiten]

Weblinks

[Bearbeiten |Quelltext bearbeiten]
Commons: Backus-Naur-Form – Sammlung von Bildern, Videos und Audiodateien

Einzelnachweise

[Bearbeiten |Quelltext bearbeiten]
  1. abJ. W. Backus:The syntax and semantics of the proposed international algebraic language of the Zurich ACM-GAMM conference. Hrsg.: International Business Machines Corp. New York 1959, Syntax of IAL (englisch). 
  2. John Backus:Programming in America in the 1950s – Some Personal Impressions. Hrsg.: IBM research laboratory, San Jose CA. 9. Emil Post and Syntax Description (englisch). 
  3. Saul Gorn:Specification languages for mechanical languages and their processors – a baker’s dozen. In:Communications of the ACM 4, 1961, S. 336–371.
  4. Anton Nijholt:Computers and Languages. North-Holland, Amsterdam 1988,ISBN 0-444-70463-9, S. 207–210.
  5. J. W. Backus, F. L. Bauer, J. Green, C. Katz, J. McCarthy, P. Naur, A. J. Perlis, H. Rutishauser, K. Samelson, B. Vauquois, J. H. Wegstein, A. van Wijngaarden, M. Woodger:Revised Report on the Algorithmic Language Algol 60. Hrsg.: International Federation of Information Processing 1962. 2.1 Letters (englisch). 
Dieser Artikel wurde am 3. März 2006 indieser Version in die Liste derlesenswerten Artikel aufgenommen.
Abgerufen von „https://de.wikipedia.org/w/index.php?title=Backus-Naur-Form&oldid=259766500
Kategorien:

[8]ページ先頭

©2009-2025 Movatter.jp