Attributgrammatik

Eine Attributgrammatik ist eine kontextfreie Grammatik, die um Attribute sowie Regeln und Bedingungen für diese Attribute erweitert ist. Angewandt wird das Konzept im Compilerbau, um die Einhaltung von Regeln zu überprüfen, die mit kontextfreien Grammatiken nicht formuliert werden können. Solche Regeln sind z. B. die, dass jede Variable deklariert sein muss und ihrem Datentyp entsprechend verwendet wird.

Ein Compiler überprüft die Einhaltung dieser Regeln während der semantischen Analyse. Dabei hat er nur die Informationen zur Verfügung, die im Syntaxbaum des Programms enthalten sind. Zusätzliche Informationen, die die semantische Analyse erleichtern, kann man als Attribute in den Syntaxbaum integrieren.

Zum Beispiel kann der Typ eines Ausdrucks als Attribut an den entsprechenden Knoten im Syntaxbaum annotiert werden. Durch Attributregeln und -bedingungen können zusätzlich Abhängigkeiten von anderen Attributen (auch anderer Knoten im Syntaxbaum) angegeben werden.

Die Programmierung der betreffenden Teile des Compilers vereinfacht sich, wenn die Produktionen der Grammatik selbst mit entsprechenden Attributen versehen werden.

Inhaltsverzeichnis

Notation

  • X_i.a := f(\ldots,X_j.b,\ldots) \in R(p) ist ein Attribut a, das zu einem Nichtterminal Xi der Produktion p:X_0 \rightarrow X_1\ldots X_n gehört, mit 0 \le i,j \le n.

Definitionen

AG = (G,A,R,B) ist eine Attributgrammatik, die durch folgende Komponenten definiert ist:

  • G = (N,T,P,Z) ist eine kontextfreie Grammatik.
  • A=\bigcup_{X\in(T\cup N)}A(X) ist eine endliche Menge von Attributen, die jeweils eindeutig einem Symbol X zugeordnet sind. Die einzelnen Attributmengen A(X) sind disjunkt, es gilt also A(X) \cap A(Y) \ne \varnothing \Rightarrow X = Y.
  • R=\bigcup_{p\in P}R(p) ist eine endliche Menge von Attributionsregeln.
  • B=\bigcup_{p\in P}B(p) ist eine endliche Menge von Bedingungen. Die Bedingung B(p) einer Produktion p:X_0 \rightarrow X_1\ldots X_n kann in der Form X0.b auch als Attribut der linken Seite aufgefasst werden, daher sind mit den Attributen auch alle Bedingungen erfasst.
  • AF(p):=\{X_i.a \; \vert \; p:X_0 \rightarrow X_1\ldots X_n,0 \le i \le n, X_i.a:=f(\ldots) \in R(p)\} ist die Menge der Attribute, die in den Regeln R(p) einer Produktion p \in P definiert sind.

Die Attribute A(X) eines Symbols lassen sich in zwei disjunkte Klassen unterteilen, da es für alle Attribute a \in A(X) nur eine Berechnungsregel der Form X.a \leftarrow f(\ldots) in R gibt:

  • AS(X) := \{X.a \; \vert \; \exists \; p:X \rightarrow X_1\ldots X_n \in P \land X.a \in AF(p)\} ist die Menge der synthetisierten (abgeleiteten) Attribute. Dies sind die Attribute, die in den Regeln r \in R(p) einer Produktion p \in P definiert sind, bei der X auf der linken Seite steht.
  • AI(X) := \{X.a \; \vert \; \exists \; q:Y \rightarrow uXv \in P \land X.a \in AF(q)\} ist die Menge der ererbten (inherited) Attribute. Dies sind die Attribute, die in den Regeln r \in R(p) einer Produktion p \in P definiert sind, bei der X auf der rechten Seite steht.

Zirkularität

Attributgrammatiken sind zirkulär, wenn der Abhängigkeitsgraph der Attributvariablen, der durch die funktionale Abhängigkeit induziert wird, eine Schleife enthält.

Diese Zirkularität lässt sich in exponentieller Zeit testen.

Ein vereinfachter Test, der weniger Grammatiken zulässt, berechnet das Problem in polynomieller Zeit.

Grammatiktypen

S-Attributgrammatiken

S-Attributgrammatiken, kurz SAG sind Attributgrammatiken, die nur auf synthetischen Attributen arbeiten. So können sie direkt bei den Reduce-Schritten des Parse-Vorgang eines LR(k)-Parsers berechnet werden. Implementiert in yacc.

L-Attributgrammatiken

L-Attributgrammatiken (LAG) können in einem Top-down-Durchgang von links nach rechts durch den abstrakten Syntaxbaum ausgewertet werden. Sie können für jede LL-Grammatik ausgewertet werden und somit für Pascal-ähnliche Programmiersprachen verwendet werden. Bei diesen dürfen nur abgeleitete und nachstehende Baumteile auf aktuelle Attribute zugreifen.

Beispiel:

  1.  A \rightarrow B C, a.1=a.0, b.0=b.1, c.2=c.1, c.2=c.0 (erlaubt)
  2.  A \rightarrow B C, a.1=a.2 (verboten)

Das erleichtert die vorwärtsgerichtete Deklaration von Variablen und Funktionen.

LR-Attributgrammatiken

Eine Teilklasse der L-Attributgrammatiken, und zwar gerade diejenigen, die sich in einem Durchgang von links nach rechts während des LR-Parsens auswerten lassen. Implementierung: zyacc; in yacc von Hand über globale Variablen realisierbar. Der Vorteil der größeren Mächtigkeit des LR-Parsens gegenüber dem LL-Parsen manifestiert sich somit spiegelbildlich im Nachteil der geringeren Mächtigkeit der LR-Attributgrammatiken gegenüber den L-Attributgrammatiken.

ECLR-Attributgrammatiken

Eine Variante der LR-Attributgrammatiken; sie benutzt eine Äquivalenzrelation, um die Attributauswertung zu optimieren. Implementierung: rie.


Wikimedia Foundation.

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Attributierte Grammatik — Eine Attributgrammatik ist eine kontextfreie Grammatik, die um Attribute, sowie Regeln und Bedingungen für diese Attribute, erweitert ist. Angewandt wird das Konzept im Compilerbau, um die Einhaltung von Regeln zu überprüfen, die mit… …   Deutsch Wikipedia

  • Compiler-Front-End — Ein Compiler (auch Übersetzer oder Kompilierer genannt) ist ein Computerprogramm, das ein in einer Quellsprache geschriebenes Programm – genannt Quellprogramm – in ein semantisch äquivalentes Programm einer Zielsprache (Zielprogramm) umwandelt.… …   Deutsch Wikipedia

  • Kompilierer — Ein Compiler (auch Übersetzer oder Kompilierer genannt) ist ein Computerprogramm, das ein in einer Quellsprache geschriebenes Programm – genannt Quellprogramm – in ein semantisch äquivalentes Programm einer Zielsprache (Zielprogramm) umwandelt.… …   Deutsch Wikipedia

  • Kompiliert — Ein Compiler (auch Übersetzer oder Kompilierer genannt) ist ein Computerprogramm, das ein in einer Quellsprache geschriebenes Programm – genannt Quellprogramm – in ein semantisch äquivalentes Programm einer Zielsprache (Zielprogramm) umwandelt.… …   Deutsch Wikipedia

  • Maschinencode-Generator — Ein Compiler (auch Übersetzer oder Kompilierer genannt) ist ein Computerprogramm, das ein in einer Quellsprache geschriebenes Programm – genannt Quellprogramm – in ein semantisch äquivalentes Programm einer Zielsprache (Zielprogramm) umwandelt.… …   Deutsch Wikipedia

  • Programmfehler — Ein Programmfehler oder Softwarefehler, häufig auch als Bug (bʌg) benannt, bezeichnet im Allgemeinen ein Fehlverhalten von Computerprogrammen. Dies tritt auf, wenn der Programmierer einen bestimmten Zustand in der Programmlogik beim Umsetzen der… …   Deutsch Wikipedia

  • Programmgenerator — Ein Compiler (auch Übersetzer oder Kompilierer genannt) ist ein Computerprogramm, das ein in einer Quellsprache geschriebenes Programm – genannt Quellprogramm – in ein semantisch äquivalentes Programm einer Zielsprache (Zielprogramm) umwandelt.… …   Deutsch Wikipedia

  • Transcompiler — Ein Compiler (auch Übersetzer oder Kompilierer genannt) ist ein Computerprogramm, das ein in einer Quellsprache geschriebenes Programm – genannt Quellprogramm – in ein semantisch äquivalentes Programm einer Zielsprache (Zielprogramm) umwandelt.… …   Deutsch Wikipedia

  • Transpiler — Ein Compiler (auch Übersetzer oder Kompilierer genannt) ist ein Computerprogramm, das ein in einer Quellsprache geschriebenes Programm – genannt Quellprogramm – in ein semantisch äquivalentes Programm einer Zielsprache (Zielprogramm) umwandelt.… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”