Entdecken Sie eBooks
Kategorien
Entdecken Sie Hörbücher
Kategorien
Entdecken Sie Zeitschriften
Kategorien
Entdecken Sie Dokumente
Kategorien
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ˆ].
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.
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(α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
trans(a)
= a A b
a
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
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
seien. Dann gilt: W (E, A) = Jˆ(aAb ˆ| aˆ)K(ρ). Das lässt sich folgendermaßen verifizieren:
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
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
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}
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