Syntaxbaum
# Syntaxbaum

Ein Syntax-, Ableitungs- oder Parsebaum ist ein Begriff aus der theoretischen Informatik und der Linguistik. Er bezeichnet eine hierarchische Darstellung der Zergliederung eines Textes. Syntaxbäume werden sowohl als Hilfsmittel zur graphischen Visualisierung der Zerlegung eingesetzt als auch, in Form einer Datenstruktur, zur Darstellung dieser Zergliederung für die maschinelle Weiterverarbeitung z. B. in einem Compiler oder Übersetzer.

Die verschiedenen Bezeichnungen werden in der Literatur nicht einheitlich verwendet. Formal präzise definiert ist nur der Terminus Ableitungsbaum, der sich auf den Begriff der Ableitung stützt. Andere Bezeichnungen für verschiedenartige Bäume können dann, wie unten beschrieben, bei Bedarf technisch näher definiert werden.

Anders als in der Informatik, in der Sprachen auch den technischen Möglichkeiten folgend definiert werden können, findet die Linguistik bei der Behandlung natürlicher Sprachen schwierigere Voraussetzungen vor, vor allem weil die Reihenfolge der Bestandteile in einem Satz variieren kann.

## Einleitung

Bei der (mechanischen) Analyse von natürlichsprachlichen Sätzen oder formalen Texten (z. B. Computerprogrammen) findet direkt nach der lexikalischen Analyse (der Zergliederung in Token oder Symbole) oft eine hierarchische Zusammenfassung der Symbole zu zusammenhängenden Satzteilen (Konstituenten) bzw. Teilabschnitten des formalen Textes statt. Umgekehrt kann dies wiederum auch als eine Zergliederung des Textes aufgefasst werden. Im Ergebnis erhält man einen Baum, wie den rechts gezeigten. Neben der zeichnerischen Form werden auch geklammerte Darstellungen für Syntaxbäume verwendet: $[_{S}\ [_{\mathit {NP}}\ John]\ [_{\mathit {VP}}\ [_{V}\ hit]\ [_{\mathit {NP}}\ [_{\mathit {Det}}\ the]\ [_{N}\ ball]]]].$

Technisch bezeichnet man den nebenstehenden Baum auch als konkreten Ableitungsbaum, da er die resultierende Struktur anhand des konkreten Textes exakt darstellt. In der Linguistik sind jedoch auch Modelle gängig, die mehrere Schichten der Repräsentation vorsehen (z. B. Oberflächen- und Tiefenstruktur).

Oftmals werden die Knoten des Baums mit Attributen angereichert (in der Linguistik sind dies dann vor allem morphologische Kategorien). Man erhält so einen attributierten Syntaxbaum mit zugehöriger attributierter Grammatik. Während in den ersten beiden Baumdarstellungen eine kontextfreie Grammatik verwendet wird, kommt in letzterer die Kontextabhängigkeit zum Tragen. Diese Unterschiede spiegeln sich in der Chomsky-Hierarchie wider. Im Compilerbau spricht man in solchen Fällen bereits von semantischer Analyse.

## Ableitungsbäume

Man betrachte eine kontextfreie Grammatik $G=\left(N,\Sigma ,P,S\right)$. Ein Ableitungsbaum dazu ist ein Baum, dessen Knoten mit Symbolen aus $\Sigma \cup N\cup \{\varepsilon \}$ (also Terminal- und Nichtterminalsymbolen und dem leeren Wort) beschriftet sind. Der Baum ist geordnet, d. h. die Kinder jedes Knotens haben eine feste Reihenfolge, und für die Beschriftung gilt:

* Die Wurzel ist mit dem Startsymbol $S$ beschriftet. Diese Eigenschaft wird gelegentlich nicht verlangt. Ein Baum, der sie erfüllt, wird als vollständiger Ableitungsbaum bezeichnet.
* Wenn die Kinder eines mit $A$ beschrifteten inneren Knotens mit den Symbolen $z_{1},\ldots ,z_{m}$ (in dieser Reihenfolge) beschriftet sind, muss die Grammatik die Regel $A\to z_{1}\ldots z_{m}$ enthalten.
* Die Blätter des Baumes sind mit Symbolen aus $\Sigma \cup \{\varepsilon \}$ beschriftet.
* Ist ein Blatt mit $\varepsilon$ gekennzeichnet, so ist es der einzige Nachfolger seines Vorgängerknotens.

Als innere Knoten kommen also nur Nichtterminalsymbole in Frage, sowie für die Blätter nur die Terminalsymbole oder das leere Wort.

### Konstruktion von Ableitungsbäumen

Mögliche Syntaxbäume/diagramme lassen sich für kurze Texte oft leicht durch Befolgen der Produktionsregeln erstellen. Für längere Texte stehen viele mechanische Verfahren zur Verfügung.

Beispielsweise liegen dem einleitend gezeigten Syntaxdiagramm u. a. folgende Regeln zugrunde:

${\begin{array}{lll}S&\rightarrow &NP\ VP\\NP&\rightarrow &{\mathtt {John}}\\NP&\rightarrow &Det\ N\\VP&\rightarrow &V\ NP\\\end{array}}\quad \quad {\begin{array}{lll}V&\rightarrow &{\mathtt {hit}}\\Det&\rightarrow &{\mathtt {the}}\\N&\rightarrow &{\mathtt {ball}}\end{array}}$

Um nun einen Ableitungbaum zu erzeugen, kann man die Regeln schrittweise von der Wurzel aus anwenden, indem man systematisch je ein Nonterminal der linken Seite der Regel durch die Symbole auf der rechten Seite ersetzt, bis nur noch Terminale übrig sind:

$S\ \Rightarrow \ NP\ VP\ \Rightarrow \ {\mathtt {John}}\ VP\ \Rightarrow \ {\mathtt {John}}\ V\ NP\ \Rightarrow \ {\mathtt {John\ hit}}\ NP\ \Rightarrow \ {\mathtt {John\ hit}}\ Det\ N\Rightarrow \ {\mathtt {John\ hit\ the}}\ N\Rightarrow \ {\mathtt {John\ hit\ the\ ball}}$

Bei jedem der Schritte zeichnet man dabei von oben nach unten ein Stück des Syntaxbaums. Man kann die Regeln aber auch umgekehrt anwenden und mit dem niedergeschriebenen Satz beginnen und darüber den Baum schrittweise von unten nach oben aufbauen.

### Ableitungsbäume bei ein- und mehrdeutigen Grammatiken

Falls es für ein Wort der Sprache einer Grammatik mehr als einen Ableitungsbaum gibt, spricht man von einer mehrdeutigen Grammatik, sonst von einer eindeutigen. Beispielsweise ist die folgende Grammatik mehrdeutig

${\begin{array}{lll}S&\rightarrow &S\ S\\S&\rightarrow &a\end{array}}$

da man etwa "a a a" in zwei verschiedenen Weisen einteilen kann: "[a a] a" und "a [a a]". Nur eine mögliche Einteilung erlaubt hingegen folgende Grammatik

${\begin{array}{lll}S&\rightarrow &a\ S\\S&\rightarrow &a\end{array}}$

Bei mehrdeutigen Grammatiken kann die Zahl möglicher Ableitungsbäume für ein und dasselbe Wort mit der Länge des Wortes stark ansteigen. In diesem Fall sind Ableitungsbäume keine geeignete Darstellung für die Gesamtheit möglicher Ableitungen mehr. Bei formalen Sprachen wird die konkrete (Oberflächen-)Grammatik meist eindeutig formuliert. Abstrakte Grammatiken sind dagegen oft mehrdeutig, wobei sich die Eindeutigkeit des abstrakten Ableitungsbaums dann durch den Gang der Analyse aus dem konkreten ergibt.

## Abstrakte Syntaxbäume

Für die Darstellung von Syntaxbäumen als Datenstruktur in einem Rechner wird die Bezeichnung abstrakter Syntaxbaum (engl.: abstract syntax tree (AST)) inzwischen recht einheitlich verwendet, wobei die Terminologie auch hier schwankt und z. B. ebenfalls von abstrakten Ableitungsbäumen, Operatorbäumen o. Ä. die Rede sein kann. Ein exakter Zusammenhang von abstraktem Syntaxbaum und konkretem Ableitungsbaum wird in der Literatur z. T. angedeutet. Allerdings gehen bei diesen neben einer Vergröberung des Ableitungsbaums auch Erfordernisse der weiteren Verarbeitung mit in den Aufbau ein, so dass eine direkte formale Herleitung aus der Oberflächengrammatik meist im Ergebnis nicht zufriedenstellend ist.

Der kontextfreien Oberflächengrammatik steht dann eine abstrakte Grammatik gegenüber, die im engeren Sinne aber meist ein algebraischer Datentyp ist. Die Syntaxbäume werden dann als vielsortige Terme technisch repräsentiert. Die Analyse befindet sich dabei im Übergang zwischen grammatischen und algebraisch-logischen Begriffen, so dass hier fließend sowohl von Nonterminalen und Typen oder von Bäumen und Termen die Rede sein kann.

### Beispiel

Die nebenstehende Abbildung zeigt konkrete und abstrakte Syntaxbäume für die nachfolgenden Grammatiken.

| konkrete Grammatik | abstrakte Grammatik | algebraischer Typ |
| - | - | - |
| E :: E "+" T -- Ausdruck :: T T :: T "*" F -- Term :: F F :: V -- Faktor :: N :: "(" E ")" V -- Variable N -- Zahl | E :: E "+" E :: E "*" E :: V :: N | typ E = add(E, E); mul(E, E); var(V); num(N) |

Die konkrete Grammatik in diesem Beispiel muss insbesondere die Anwendungsreihenfolge von Operatoren auf die (Teil-)Ausdrücke regeln – also dass Punkt- vor Strichrechnung geht und die Teilausdrücke gleicher Priorität von links nach rechts zusammenzufassen sind. Ebenso wird mit Klammerausdrücken die Möglichkeit angeboten, eine andere Zusammenfassung zu bewirken. Dies sind zusammen mit bestimmten Terminalen (hier "(", ")", "+", "*") lediglich Eigenschaften der syntaktischen Oberfläche, die in der späteren Analyse und Weiterverarbeitung keine Rolle mehr spielen. Insbesondere kann auf die Unterscheidung in verschiedene Arten von Ausdrücken (hier E, T und F) sowie die Schlüsselworte völlig verzichtet werden, wie man am abstrakten Syntaxbaum sieht, der auch deutlich näher am "Inhalt" des Ausdrucks ist. Ferner werden konkrete Ableitungsbäume wegen dieser Oberflächendetails nicht nur schnell unübersichtlich, sondern belegen auch als Datenstruktur im Rechner durch ihre Details mehr Speicherplatz als nötig. Dies schlägt sich ebenfalls in der Laufzeit und Kompliziertheit der Programme nieder, die später den Ableitungsbaum weiter verarbeiten sollen. Auch aus technischen Gründen wird die Zergliederung eines Quelltextes daher meist nicht durch einen konkreten Ableitungsbaum dargestellt.

### Darstellung abstrakter Syntaxbäume

Neben der im Beispiel gezeigten graphischen Darstellung als (Operator-)Baum werden abstrakte Syntaxbäume technisch auch als Terme notiert, z. B.: mul(var('a'), add(var('b'), num(3))).

### Abstrakte Grammatik

Während abstrakte Syntaxbäume Datenstrukturen sind und algebraische Typen bei ihnen in die Rolle der Grammatik treten, wird in der Literatur, speziell im Zusammenhang mit Kalkülen oft nur eine vergröberte, mehrdeutige Grammatik angegeben, die, wie in obigem Beispiel gezeigt, zwar dieselbe Struktur wie die Terme haben, aber noch Schlüsselworte enthalten. Diese Form ermöglicht eine dann vor allem eine angenehme Niederschrift abstrakter Syntaxbäume, die der eigentlichen Quelle oft sehr nahe ist. Meist wird einleitend darauf hingewiesen, dass zur Vereindeutigung Klammern gesetzt werden dürfen. Ein abstrakter Syntaxbaum für das obige Beispiel würde dann tatsächlich als a * (b + 3) niedergeschrieben. Im Kontext dieser Literatur liegt der Blick dabei aber stets auf dem Term. Wie erwähnt, werden die Grenzen zwischen Grammatik und Algebra durch ein Spiel mit der Form verwischt.

Ein typisches Beispiel sind die Ausdrücke im Lambda-Kalkül, deren abstrakte Grammatik oft nur knapp als $E:=\lambda V.E\,|\,EE\,|\,V$ niedergeschrieben wird. Dieselbe Technik wird aber auch für umfangreiche Grammatiken eingesetzt.

