<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Attributgrammatik</id>
	<title>Attributgrammatik - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Attributgrammatik"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Attributgrammatik&amp;action=history"/>
	<updated>2026-06-04T16:44:18Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Attributgrammatik&amp;diff=376029&amp;oldid=prev</id>
		<title>imported&gt;Karlito: G=(N,T,P,Z) wird nicht in der referenzierten Seite zu CFG verwendet. Um Verwirrung vorzubeugen, hier korrigiert zu G=(N,T,P,S) wie im Artikel zu CFG zumindest als Alternative dargestellt</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Attributgrammatik&amp;diff=376029&amp;oldid=prev"/>
		<updated>2021-02-18T16:20:25Z</updated>

		<summary type="html">&lt;p&gt;G=(N,T,P,Z) wird nicht in der referenzierten Seite zu CFG verwendet. Um Verwirrung vorzubeugen, hier korrigiert zu G=(N,T,P,S) wie im Artikel zu CFG zumindest als Alternative dargestellt&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Eine &amp;#039;&amp;#039;&amp;#039;Attributgrammatik&amp;#039;&amp;#039;&amp;#039; ist eine [[kontextfreie Grammatik]], die um Attribute sowie Regeln und Bedingungen erweitert ist. Angewandt wird das Konzept im [[Compilerbau]], um beispielsweise die Einhaltung von Regeln zu überprüfen, die mit [[Kontextfreie Grammatik|kontextfreien Grammatiken]] nicht formuliert werden können. Solche Regeln sind z. B. die, dass jede Variable [[Deklaration (Programmierung)|deklariert]] sein muss und ihrem [[Datentyp]] entsprechend verwendet wird. Das Konzept der Attributgrammatiken wurde ursprünglich von [[Donald E. Knuth]] eingeführt.&amp;lt;ref&amp;gt;{{Literatur|Autor=Donald E. Knuth|Titel=Semantics of context-free languages|Sammelwerk=Mathematical systems theory|Band=2|Nummer=2|Seiten=127–145|ISSN=0025-5661|DOI=10.1007/BF01692511|Online=https://link.springer.com/article/10.1007/BF01692511|Abruf=2017-01-08}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Literatur|Autor=Donald E. Knuth|Titel=Semantics of context-free languages: Correction|Sammelwerk=Mathematical systems theory|Band=5|Nummer=2|Seiten=95–96|ISSN=0025-5661|DOI=10.1007/BF01702865|Online=https://link.springer.com/article/10.1007/BF01702865|Abruf=2017-01-08}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Compiler überprüft die Einhaltung dieser Regeln während der [[Compiler#Semantische Analyse|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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die Programmierung der betreffenden Teile des Compilers vereinfacht sich, wenn die Produktionen der Grammatik selbst mit entsprechenden Attributen versehen werden.&lt;br /&gt;
&lt;br /&gt;
== Notation ==&lt;br /&gt;
* &amp;lt;math&amp;gt;X_i.a := f(\ldots,X_j.b,\ldots) \in R(p)&amp;lt;/math&amp;gt; ist ein Attribut &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, das zu einem Nichtterminal &amp;lt;math&amp;gt;X_i&amp;lt;/math&amp;gt; der Produktion &amp;lt;math&amp;gt;p:X_0 \rightarrow X_1\ldots X_n&amp;lt;/math&amp;gt; gehört, mit &amp;lt;math&amp;gt;0 \le i,j \le n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Definitionen ==&lt;br /&gt;
&amp;lt;math&amp;gt;AG = (G,A,R,B)&amp;lt;/math&amp;gt; ist eine Attributgrammatik, die durch folgende Komponenten definiert ist:&lt;br /&gt;
* &amp;lt;math&amp;gt;G=(N,T,P,S)&amp;lt;/math&amp;gt; ist eine [[kontextfreie Grammatik]].&lt;br /&gt;
* &amp;lt;math&amp;gt;A=\bigcup_{X\in(T\cup N)}A(X)&amp;lt;/math&amp;gt; ist eine endliche Menge von Attributen, die jeweils eindeutig einem Symbol &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; zugeordnet sind. Die einzelnen Attributmengen &amp;lt;math&amp;gt;A(X)&amp;lt;/math&amp;gt; sind disjunkt, es gilt also &amp;lt;math&amp;gt;A(X) \cap A(Y) \ne \varnothing \Rightarrow X = Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;R=\bigcup_{p\in P}R(p)&amp;lt;/math&amp;gt; ist eine endliche Menge von Attributionsregeln.&lt;br /&gt;
* &amp;lt;math&amp;gt;B=\bigcup_{p\in P}B(p)&amp;lt;/math&amp;gt; ist eine endliche Menge von Bedingungen. Die Bedingung &amp;lt;math&amp;gt;B(p)&amp;lt;/math&amp;gt; einer Produktion &amp;lt;math&amp;gt;p:X_0 \rightarrow X_1\ldots X_n&amp;lt;/math&amp;gt; kann in der Form &amp;lt;math&amp;gt;X_0.b&amp;lt;/math&amp;gt; auch als Attribut der linken Seite aufgefasst werden, daher sind mit den Attributen auch alle Bedingungen erfasst.&lt;br /&gt;
* &amp;lt;math&amp;gt;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)\}&amp;lt;/math&amp;gt; ist die Menge der Attribute, die in den Regeln &amp;lt;math&amp;gt;R(p)&amp;lt;/math&amp;gt; einer Produktion &amp;lt;math&amp;gt;p \in P&amp;lt;/math&amp;gt; definiert sind.&lt;br /&gt;
&lt;br /&gt;
Die Attribute &amp;lt;math&amp;gt;A(X)&amp;lt;/math&amp;gt; eines Symbols lassen sich in zwei [[Disjunkt|disjunkte]] Klassen unterteilen, da es für alle Attribute &amp;lt;math&amp;gt;a \in A(X)&amp;lt;/math&amp;gt; nur eine Berechnungsregel der Form &amp;lt;math&amp;gt;X.a \leftarrow f(\ldots)&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; gibt:&lt;br /&gt;
* &amp;lt;math&amp;gt;AS(X) := \{X.a \; \vert \; \exists \; p:X \rightarrow X_1\ldots X_n \in P \land X.a \in AF(p)\}&amp;lt;/math&amp;gt; ist die Menge der synthetisierten (abgeleiteten) Attribute. Dies sind die Attribute, die in den Regeln &amp;lt;math&amp;gt;r \in R(p)&amp;lt;/math&amp;gt; einer Produktion &amp;lt;math&amp;gt;p \in P&amp;lt;/math&amp;gt; definiert sind, bei der &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; auf der linken Seite steht.&lt;br /&gt;
* &amp;lt;math&amp;gt;AI(X) := \{X.a \; \vert \; \exists \; q:Y \rightarrow uXv \in P \land X.a \in AF(q)\}&amp;lt;/math&amp;gt; ist die Menge der ererbten (inherited) Attribute. Dies sind die Attribute, die in den Regeln &amp;lt;math&amp;gt;r \in R(p)&amp;lt;/math&amp;gt; einer Produktion &amp;lt;math&amp;gt;p \in P&amp;lt;/math&amp;gt; definiert sind, bei der &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; auf der rechten Seite steht.&lt;br /&gt;
&lt;br /&gt;
== Zirkularität ==&lt;br /&gt;
Attributgrammatiken sind zirkulär, wenn der Abhängigkeitsgraph der Attributvariablen, der durch die funktionale Abhängigkeit induziert wird, eine Schleife enthält.&lt;br /&gt;
&lt;br /&gt;
Diese Zirkularität lässt sich in exponentieller Zeit testen.&lt;br /&gt;
&lt;br /&gt;
Ein vereinfachter Test, der weniger Grammatiken zulässt, berechnet das Problem in polynomieller Zeit.&lt;br /&gt;
&lt;br /&gt;
== Grammatiktypen ==&lt;br /&gt;
&lt;br /&gt;
=== S-Attributgrammatiken ===&lt;br /&gt;
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-Parser|LR(k)-Parsers]] berechnet werden. Implementiert in [[yacc]].&lt;br /&gt;
&lt;br /&gt;
=== L-Attributgrammatiken ===&lt;br /&gt;
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-Parser|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.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
# &amp;lt;math&amp;gt; A \rightarrow B C, a.1=a.0, b.0=b.1, c.2=c.1, c.2=c.0&amp;lt;/math&amp;gt; (erlaubt)&lt;br /&gt;
# &amp;lt;math&amp;gt; A \rightarrow B C, a.1=a.2&amp;lt;/math&amp;gt; (verboten)&lt;br /&gt;
&lt;br /&gt;
Das erleichtert die vorwärtsgerichtete Deklaration von Variablen und Funktionen.&lt;br /&gt;
&lt;br /&gt;
=== LR-Attributgrammatiken ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== ECLR-Attributgrammatiken ===&lt;br /&gt;
Eine Variante der LR-Attributgrammatiken; sie benutzt eine [[Äquivalenzrelation]], um die Attributauswertung zu optimieren. Implementierung: rie.&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Compilerbau]]&lt;br /&gt;
[[Kategorie:Theorie formaler Sprachen]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Karlito</name></author>
	</entry>
</feed>