Sie sind auf Seite 1von 5

2.

2 Extended Backus-Naur-Form (EBNF)

2.2 Extended Backus-Naur-Form (EBNF)


Eine andere Möglichkeit, die Syntax von Programmiersprachen zu definieren, ist durch die sogenannte
Extended Backus-Naur-Form (kurz: EBNF) gegeben.

2.2.1 Beispiel einer EBNF-Regel


Jede EBNF-Definition besteht im wesentlichen aus einer endlichen Menge von EBNF-Regeln, welche die
Strukturen und Teilstrukturen der Sätze der zu definierenden Sprache festlegen.

Beispiel 2.4. Ein wesentliches Merkmal eines C-Programms sind die Deklarationen von Konstanten und
Variablen. Die EBNF-Regel für die Menge aller syntaktisch zulässigen Deklarationen lautet:
hDeclarationi ::= ˆ[hConstDeclarationiˆ]ˆ[hVarDeclarationiˆ]. 

Informell bedeuten die in der EBNF auftretenden Objekte folgendes:


• hDeclarationi, hConstDeclarationi, hVarDeclarationi heißen syntaktische Variablen, sie bezeichnen
Mengen von syntaktisch zulässigen Zeichenreihen. Insbesondere bei der Definition von Programmier-
sprachen werden wir künftig diese Variablen durch spitze Klammern kennzeichnen. hDeclarationi
bezeichnet z. B. die Menge aller syntaktisch zulässigen Deklarationen.
• ˆ
{...ˆ
} Wiederholungsklammern; was zwischen den Klammern steht, kann beliebig oft hintereinan-
der gestellt werden. Insbesondere ist darin der Fall enthalten, dass das, was zwischen den Klam-
mern steht, keinmal auftritt. Da die geschweifte Klammer gleichzeitig auch als Terminalsymbol der
Sprache C bzw. C0 auftreten kann, sollen zur besseren Lesbarkeit und ggf. zur Herstellung der
Eindeutigkeit von Syntaxdefinitionen künftig die Metazeichen mit einem Dach über dem jeweiligen
Symbol gekennzeichnet werden.
• [ . . . ˆ] Optionsklammern; was zwischen den Klammern steht, kann auftreten oder kann weggelassen
ˆ
werden. Man beachte, dass auch hier das Metasymbol (der Einheitlichkeit wegen) mit einem Dach
gekennzeichnet ist.
• Wörter ohne spitze Klammern sind Terminalsymbole.
• Außerdem kann in EBNF-Regeln der senkrechte Strich ˆ| auftreten; hier kann entweder das links
vom Strich Stehende auftreten oder das rechts vom Strich Stehende.
Die intuitive Bedeutung dieser EBNF-Regel lautet also: Eine Deklaration beginnt mit einer oder keiner
Konstantendeklaration, gefolgt von einer oder keiner Variablendeklaration. Die leere Deklarationsmenge
ist somit als Spezialfall enthalten.

2.2.2 EBNF-Definition
Wie gesagt besteht jede EBNF-Definition aus einer endlichen Menge von EBNF-Regeln. Jede EBNF-Regel
besitzt eine linke Seite und eine rechte Seite. Die linke Seite besteht aus einer syntaktischen Variablen;
die rechte Seite ist ein EBNF-Term.
EBNF-Terme sind aus den syntaktischen Variablen, den Terminalsymbolen und den Metazeichen nach
bestimmten Regeln aufgebaut.

Definition 2.5. Sei V eine endliche Menge von syntaktischen Variablen, und sei Σ eine endliche Menge
von Terminalsymbolen mit V ∩ Σ = ∅. Die Menge ˆ ˆ ˆder EBNF-Terme
∗ über V und Σ, bezeichnet durch
ˆ ˆ ˆ
T (Σ, V ), ist die kleinste Menge T ⊆ V ∪ Σ ∪ {, }, [, ], (, ), | ˆ , so dass folgende Eigenschaften gelten:
1. V ⊆ T .
2. Σ ⊆ T .
3. Wenn α ∈ T , so auch ˆ(αˆ) ∈ T, ˆ{αˆ} ∈ T , ˆ[αˆ] ∈ T .
4. Wenn α1 , α2 ∈ T , so auch ˆ(α1ˆ|α2ˆ) ∈ T , α1 α2 ∈ T . 

Man beachte: Die Zuordnung eines Symbols zu V bzw. Σ ergibt sich ausschließlich aus den jeweiligen
Mengendefinitionen. Da V ∩ Σ = ∅ gilt, ist diese Zuordnung immer eindeutig möglich.

21
2 Syntax von Programmiersprachen

Beispiel 2.6. Betrachten wir jetzt die Zeichenreihe, die die Menge aller syntaktisch zulässigen Blöcke in
C beschreibt: {hDeclarationiˆ[hStatementSequenceiˆ]}. In der Tat ist diese Zeichenreihe ein EBNF-Term,
wie die folgende Zerlegung zeigt:
{ hDeclarationi ˆ[ hStatementSequencei ˆ] }
|{z} | {z } | {z } |{z}
∈Σ ∈V ∈V ∈Σ
|{z} | {z } | {z } |{z}
∈T ∈T ∈T ∈T
| {z }| {z }
∈T ∈T
| {z }
∈T
| {z }
∈T


Definition 2.7. Eine EBNF-Definition ist ein Tupel E = (V, Σ, S, R), wobei
• V endliche Menge (syntaktische Variablen)
• Σ endliche Menge (Terminalsymbole)
• S ∈ V (Startsymbol)
• R endliche Menge von EBNF-Regeln der Form v ::= α mit v ∈ V und α ∈ T (Σ, V ). Weiterhin gilt,
dass für jede syntaktische Variable v genau eine EBNF-Regel mit v als linker Seite in R enthalten
ist. 

Beispiel 2.8. Sei E = (V, Σ, S, R) eine EBNF-Definition mit V = {S, A}, Σ = {a, b, c} und

R: S ::= ˆ{cˆ}A
A ::= ˆ(ˆ(aAbˆ) ˆ| aˆ)

Die EBNF-Definition E enthält also die zwei syntaktischen Variablen S und A und die Terminalsymbole
a, b und c. Des weiteren enthält sie zwei EBNF-Regeln; z. B. ist die rechte Seite der zweiten Regel der
EBNF-Term ˆ(ˆ(aAbˆ) ˆ| aˆ). Man beachte, dass der Alternativstrich geringere Priorität als die Konkatenation
hat. Es ist deshalb üblich, die den Vorrang kennzeichnenden runden Klammern wegzulassen. 

2.2.3 Übersetzung von EBNF-Definitionen in Syntaxdiagramme


Wir kennen nun zwei verschiedene Syntaxbeschreibungssprachen: Syntaxdiagramme und EBNF. Jetzt
wollen wir eine schematische Übersetzung einer EBNF in ein System von Syntaxdiagrammen angeben.
Schematisch ist diese Übersetzung in dem Sinne, dass man sie auf jede EBNF-Definition anwenden kann.
(Übrigens gibt es auch eine schematische Übersetzung in die andere Richtung, auf die wir aber nicht
eingehen wollen.) Die Übersetzung soll so sein, dass die Sprachen, welche von der EBNF-Definition
definiert wird (siehe Abschnitt 2.2.4), die gleiche ist wie die, die durch das Syntaxdiagramm erzeugt
wird.

Definition 2.9. Sei E = (V, Σ, S, R) eine EBNF-Definition. Sei v ∈ V und sei v ::= α die EBNF-Regel,
bei der v auf der linken Seite steht.
Dann übersetze den EBNF-Term α in ein Syntaxdiagramm aus SynDia(Σ, V ). Diesem Syntaxdiagramm
ordnen wir den Namen v zu. 

Die Übersetzung trans : T (Σ, V ) → SynDia(Σ, V ) ist induktiv über den Aufbau von EBNF-Termen defi-
niert.1

1. Sei v ∈ V ; trans(v) = v

2. Sei w ∈ Σ; trans(w) = w
3. Sei α ∈ T (Σ, V );
1 Beachte, dass die Ovale um trans(α) im Folgenden nicht als Zeichen für Terminalsymbole zu verstehen sind, sondern als
komplette Syntaxdiagramme, die einzufügen sind indem die entsprechende Regel von trans ausgeführt wird.

22
2.2 Extended Backus-Naur-Form (EBNF)

• trans( ˆ
{αˆ
})=

trans(α)
Beachte: Der Eingang zum Syntaxdiagramm trans(α) ist rechts und der Ausgang links.

• trans( ˆ[αˆ] ) = trans(α)

• trans( ˆ(αˆ) ) = trans(α)


4. Sei α1 , α2 ∈ T (Σ, V );

• trans(α1 α2 ) = trans(α1 ) trans(α2 )

• trans( ˆ(α1 ˆ| α2ˆ) ) = trans(α1 )

trans(α2 )

Beispiel 2.10. Gegeben sei die EBNF-Definition E = (V, Σ, S, R), wobei V = {S, A}, Σ ={a,b,c} und
R enthalte die Regeln S ::= ˆ
{cˆ
}A sowie A ::= ˆ(aAb ˆ|aˆ).
Diese EBNF wollen wir in ein System von Syntaxdiagrammen übersetzen. Zunächst betrachten wir S

S : trans(ˆ
{cˆ
}A) = trans( ˆ
{cˆ
} ) trans(A)

= A

trans(c)

= A

A : trans( ˆ(ˆ(aAbˆ) ˆ| a ˆ) ) = trans( aAb )

trans(a)

= trans(a) trans(A) trans(b)

= a A b

a


2.2.4 Bedeutung einer EBNF-Definition


Nun erhebt sich die Frage, welche Objektsprache durch eine EBNF-Definition E beschrieben wird. Wir
werden dies hier nur informell angeben.

23
2 Syntax von Programmiersprachen

Wir verbinden mit der EBNF-Definition E = (V, Σ, S, R) die Vorstellung, dass zu jeder syntaktischen
Variablen v ∈ V eine Objektsprache W (E, v) ⊆ Σ∗ gehört. W (E, v) heißt auch syntaktische Kategorie
von v bezüglich E.
Die rechte Seite α der EBNF-Regel v ::= α beschreibt nun, wie die Wörter in W (E, v) aussehen können.
Um das genauer beschreiben zu können, ordnen wir auch jedem EBNF-Term α eine Objektsprache JαK zu,
unter der Annahme, dass jedem v bereits eine Sprache zugeordnet wurde. Wir nennen JαK auch Semantik
von α. Genauer gesagt definieren wir eine Funktion

J.K : T (Σ, V ) −→ V → P(Σ∗ ) → P(Σ∗ )


 

induktiv über den Aufbau ihres Argumentes. (Für zwei beliebige Mengen A und B bedeutet die Schreib-
weise (A −→ B) die Menge aller Funktionen von A nach B.) Statt J.K(α) schreiben wir JαK.
Sei also α ∈ T (Σ, V ) und ρ : V → P(Σ∗ ) eine beliebige Funktion, die jedem v ∈ V eine formale Sprache
über Σ zuordnet. Dann definiere JαK(ρ) wie folgt:
• Wenn α = v ∈ V , dann gilt JαK(ρ) = ρ(v).
• Wenn α ∈ Σ, dann gilt JαK(ρ) = {α}.
Beachte: „{“ und „}“ sind hier übliche Mengenklammern.
• Wenn α = ˆ(α1ˆ), dann gilt JαK(ρ) = Jα1 K(ρ).
• Wenn α = ˆ{α1 ˆ}, dann gilt JαK(ρ) = (Jα1 K(ρ))∗ , d. h. JαK(ρ) ist der Stern von Jα1 K(ρ).
• Wenn α = ˆ[α1ˆ], dann gilt JαK(ρ) = Jα1 K(ρ) ∪ {ε}.
• Wenn α = ˆ(α1ˆ|α2ˆ), dann gilt JαK(ρ) = Jα1 K(ρ) ∪ Jα2 K(ρ).
• Wenn α = α1 α2 , dann gilt JαK(ρ) = Jα1 K(ρ)·Jα2 K(ρ), wobei die Objektsprachen Jα1 K(ρ) und Jα2 K(ρ)
durch Konkatenation verknüpft sind.
Wenn nun E die EBNF-Regel v ::= α enthält, dann muss W (E, v) = JαK(ρ) gelten, wobei für jedes u ∈ V
gilt: ρ(u) = W (E, u).

Beispiel 2.11. Wir betrachten die EBNF-Definition des vorangegangenen Beispiels und den EBNF-Term
α = ˆ(aAb ˆ| aˆ), der sich in die EBNF-Terme α1 , α2 , α3 und α4 zerlegen lässt:

α = ˆ( |{z} A b ˆ| |{z}
a |{z} a ˆ)
α3 α4 α2
| {z }
α1

Nehmen wir nun an, dass die syntaktischen Kategorien von S und A die Sprachen

ρ(S) = W (E, S) = {cn ak abk | n, k ≥ 0} bzw. ρ(A) = W (E, A) = {ak abk | k ≥ 0}

seien. Dann gilt: W (E, A) = Jˆ(aAb ˆ| aˆ)K(ρ). Das lässt sich folgendermaßen verifizieren:

Jˆ(aAb ˆ| aˆ)K(ρ) = JaAbK(ρ) ∪ JaK(ρ)


= JaK(ρ) · JAK(ρ) · JbK(ρ) ∪ JaK(ρ)
= {a} · JAK(ρ) · {b} ∪ {a}
= {a} · W (E, A) · {b} ∪ {a}
= {a} · {ak abk | k ≥ 0} · {b} ∪ {a}
= {ak abk | k ≥ 1} ∪ {a}
= {ak abk | k ≥ 0}

Auf ähnliche Weise beweist man, dass W (E, S) = Jˆ{cˆ} AK(ρ) ist. 

Formal definiert man W (E, v) als W (E, v) = ρ̂(v), wobei ρ̂ das kleinste ρ : V → P(Σ∗ ) ist mit

∀(v ::= α) ∈ R : ρ(v) = JαK(ρ)

24
2.2 Extended Backus-Naur-Form (EBNF)

und die Abbildungen des Typs V → P(Σ∗ ) wie folgt (partiell) geordnet sein sollen:

ρ1 ≤ ρ2 ⇔ ∀v ∈ V : ρ1 (v) ⊆ ρ2 (v) .

An dieser Stelle muss man beweisen, dass ρ̂ wohldefiniert ist, d. h., dass es existiert und eindeutig ist.
Dafür bedient man sich des Fixpunktsatzes von Tarski (siehe appendix B.8) und nutzt die folgende
äquivalente Formulierung der Definition: Sei f : (V → P(Σ∗ )) → (V → P(Σ∗ )) definiert für jedes v ∈ V
durch f (ρ)(v) = JαK(ρ) wenn (v ::= α) ∈ R. Dann ist ρ̂ der kleinste Fixpunkt von f . (Ein Fixpunkt einer
Funktion f ist ein Element ρ, welches unter f auf sich selbst abgebildet wird, d. h., f (ρ) = ρ.) Nun lässt
sich zeigen, dass unsere Ordnung auf V → P(Σ∗ ) und die Funktion f die Eigenschaften erfüllen, die im
Fixpunktsatz von Tarski gefordert werden. Wir erhalten das Ergebnis, dass der kleinste Fixpunkt von f
eindeutig bestimmt ist, und zwar mit

∀v ∈ V : ρ̂(v) = i≥0 f i (⊥)(v) ,


S

wobei ⊥ jedes Element in V auf die leere Sprache abbildet, d. h. ⊥(v) = ∅ für jedes v ∈ V .

Beispiel 2.12. Für die EBNF-Definition aus Beispiel 2.8 wollen wir jetzt mit Hilfe der Fixpunktsemantik
die syntaktischen Kategorien W (E, S) und W (E, A) ermitteln. Dazu schreiben wir die Abbildungen des
Typs V → P(Σ∗ ) als Spaltenmatrizen auf, wobei der obere Eintrag das Bild von S enthält, der zweite
das Bild von A.
Dann berechnen wir wie folgt.
     n   n k k 
∅ f ∅ f {c a | n ≥ 0} f {c a ab | n ≥ 0, 0 ≤ k ≤ 1}
7−→ 7−→ 7−→ .
∅ {a} {aab} ∪ {a} {ak abk | 0 ≤ k ≤ 2}

Allgemein gilt für jedes i ≥ 2:


  i  n k k 
∅ f {c a ab | n ≥ 0, 0 ≤ k ≤ i − 2}
7−→ .
∅ {ak abk | 0 ≤ k ≤ i − 1}

Diese Behauptung lässt sich durch vollständige Induktion beweisen, siehe Beispiel B.43. Somit erhalten
wir:
f i (⊥)(S)
  S   n k k 
W (E, S) i≥0 {c a ab | n, k ≥ 0}
= S i = ,
W (E, A) i≥0 f (⊥)(A) {ak abk | k ≥ 0}

insbesondere ist also die Sprache der EBNF: W (E, S) = {cn ak abk | n, k ≥ 0}. 

25

Das könnte Ihnen auch gefallen