go to start Fragen Und Antworten
|home |print view |recent changes |changed January 31, 2011 |
exact
|You are 107.20.129.212 <- set your identity!

Sections: Infos | Fragen |

Infos ^

Auf dieser Seite werden für alle Fragen im Bezug zur Prüfung beantwortet. Auch Fragen die per E-Mail bei den Dozenten eintreffen werden hier für alle beantwortet.

Fragen ^


F: Stimmen die Angaben in der Parsertabelle 3.12, Seite 35 im Skript mit jenen in der dazugehörigen Grammatik (Tabelle 3.10, Seite 31) überein?

A: Da ist in der Tat ein kleiner Fehler vorhanden. Die Indizes der Regeln bei den Reduces sind alle eins zu hoch. (Korrigiertes PDF liegt auf dem Skripteserver). Wenn du die Regeln der Grammatik aus Tabelle 3.10 von 0 statt 1 an nummerierst, stimmt die Lösung.


F: Prüfung: S.10 Aufgabe 4.2: Was ist der Unterschied betreffend dem Zeitpunkt der Ausführung der semantischen Aktion in den folgenden zwei Zeilen:
Func → '+' Num [ pstack.push(Num.value) ] Func
Func → '-' Num Func [ mstack.push(Num.value) ]
//Func steht einmal vor und einmal nach der semantischen Aktion.
Zusätzlich: Kann es sein, dass die angegebene Grammatik endlos-rekursiv ist?

A: Die Semantische Aktion wird im ersten Fall, nach dem Erkennen des NT Num ausgeführt und bevor das NT Func erkannt wird. Im zweiten Falle wird die Aktion erst nach dem Erkennen von beiden Symbolen Num und Func ausgeführt. Dies resultiert bei der Ausgabe darin, dass die Zahlen, die Addiert werden in verkehrter Reihenfolge ausgegeben werden und die Zahlen der Subtraktionen in der Reihenfolge ausgegeben werden in der sie auftreten.

Ja diese Grammatik ist endlos Rekursiv, hier ist ein Fehler in der Aufgabenstellung, es fehlt die Regel die Func in Epsilon überführt.

Hier zum ausprobieren noch der ANTLR Code für diesen Parser.

grammar sdg;

@members {
	Stack<Integer> pstack = new Stack<Integer>();
	Stack<Integer> mstack = new Stack<Integer>();

	public void print(Object s) {
		System.out.print(s.toString());
	}
}

s	:	e { 	while(!mstack.isEmpty()) { print(mstack.pop()); }
			print("|");
			while(!pstack.isEmpty()) { print(pstack.pop()); }
		 }
	;
e	:	num { pstack.push(new Integer($num.text)); } func
	;
func	:	'+' num {pstack.push(new Integer($num.text));} func 
	|	'-' num func {mstack.push(new Integer($num.text));}
	|
	;
num	:	INT;

INT :	'0'..'9'+;

F: Prüfung: S.11 Aufgabe 4.4 b) Kann es sein, dass die Position von dem Element A[ 3][ 8] 424 und nicht 304 ist?

A: Dies ist abhängig davon wie das Array im Speicher abgelegt wird. Zeilen-orientiert oder Spalten-orientiert. Im letzten Jahr wurden die Übungen, als auch die Prüfungsfragen für Spalten-orientierte Arrays gestellt (leider nicht explizit angegeben).

In diesem Semester gehen wir von Zeilen-orientierten Arrays aus. Entsprechend der Erklärung in der Vorlesung und den Übungsaufgaben.

Eine Berechnung Zeilen-orientiert ergibt für diesen Fall 120 + 8 * 8 + 3 * 10 * 8 = 424


F: Übung 2, Aufgabe 2.2.1.1 (Thompson-Konstruktion): Sind die Übergänge q0 -> q1 und q12 -> q13 nötig? Sie sind nicht Teil der "Bausteine" aus dem Skript und erscheinen ein wenig redundant.

A: Ja sie sind nötig für eine korrekte Thompson-Konstruktion. Wenn Sie das Beispiel aus Abbildung 2.7 betrachten, sehen Sie, dass vor jedem Terminal ebenfalls ein Epsilon-Übergang steht. In Abbildung 2.6 war dies leider nicht korrekt und ist bereits korrigiert.


F: Kapitel 3.3.2: Dort (rechte Spalte, 2. Absatz) steht, dass a Element von T sei wobei T alle Nicht-Terminale bedeutet. Kann sein, dass N gemeint ist? L(G) (vor den Bullet Points auf derselben Seite) verstehe ich sonst nämlich nicht, weil für mich T* bedeuten würde, dass die akzeptierte Sprache von G aus Nicht-Terminalen besteht.

A: Die Aussage isoliert betrachtet wäre richtig, falls man die dortige Definition von T nicht für die folgenden Teile weiterziehen würde. Dies wäre jedoch sehr verwirrend. Wir werden diesen Teil überarbeiten, um Klarheit zu schaffen. Bis dahin: Ja, es sollte nicht T sondern N heissen in jener beschreibung. (In aktueller Version korrigiert)


F: Kapitel 3.7.5: Die Tabelle für LR(0) und SLR(1) Parsing entsteht ja anders (bei ersterer wird Reduce für alle Terminale eingetragen, bei letzterer nur für Follow-Set). Aber ist Algorithmus für Parsing mit SLR(1)-Tabelle identisch wie LR(0)-Parsing? Wenn nein: Wo ist der Unterschied?

A: Ja, der Unterschied von LR(0) zu SLR(1) besteht lediglich darin, dass die Parse-Tabelle anders aufgebaut wird. Das Parsen wird jedoch gleich abgewickelt.


F: Kapitel 4.6.3: Gibt's irgendein Rezept zur Entfernung der Linksrekursion in einer linksrekursiven Grammatik mit semantischen Attributen?

A: Wir haben die allgemeine Form nicht betrachtet. Dennoch gäbe es diese (Die Zahlen hinter den Nichtterminalen sind Indizes).

Ausgangslage (Grammatik mit Linksrekursion):

A → A1 Y {A.a = g(A1.a, Y.y)}
A → X {A.a = f(X.x)}

Lösung (Linksrekursion entfernt):

A → X {R.i = f(X.x) R {A.a = R.s}}
R → Y {R1.i = g(R.i, Y.y)} R1 {R.s = R1.s}
R → epsilon {R.s = R.i}


F: Übung 4.4: Haben die Epsilons in 4, 5, und 6 eine spezielle Bedeutung bzw. "müssen" sie da sein? Im Skript hat's keine Epsilons.

A: Die Epsilons haben die übliche Bedeutung: Das leere Wort. Per Konvention müssen diese da stehen (Nicht zu verwechseln mit ANTLR, wo dies nicht der Fall ist). Dies ging im Skript vergessen bei Kapitel 4.6.2. (In aktueller Version korrigiert)


F: Übung 4.5: Gibt's eine Musterlösung?

A: Ja, der ANTLR Code wurde ins PDF der Lösung integriert.


F: Kapitel 5.2: Existiert Algorithmus für Erstellung von DAG, damit man keine Fehler macht?

A: Ja, dieser ist in Abschnitt 5.2.1 textuell beschrieben. Wenn Sie gerne eine syntaxgerichtete Definition dafür hätten, können Sie die von Tabelle 5.1 betrachten. Dort werden in den semantischen Regeln jeweils neue Knoten erstellt für den Syntaxbaum. Für die Erstellung von DAGs kann dieselbe verwendet werden, jedoch wird dabei nicht immer ein neuer Knoten erstellt. Dies ist nur nötig, falls der Knoten der erstellt würde nicht bereits im Array der existierenden Knoten vorkommt. Bzw. genauer gesagt, falls nicht bereits ein Knoten mit identischer Signatur darin vorkomment. Sollte ein solcher Knoten gefunden werden, wird einfach dieser zurückgegeben.


F: Kapitel 8.2.3: "Jeder Befehl, der direkt nach einer Sprunganweisung steht, ist ein Anführer".

goto 2;
a = b;

a = b; müsste damit ein Anführer sein, richtig? Wie passt das dann mit dem iffalse() im mittleren Block auf Seite 84 zusammen?

A: Richtig. Die korrigierte Version ist auf dem Skripte-Server.


F: Was müssen wir mit ANTLR an der Prüfung können? Wie sieht es beispielsweise mit den Übungen aus, die auf ANTLR-Bücher verweisen, ohne die die Übungen (mindestens für mich) nicht zu lösen sind?

A: Sie müssen ANTLR-Syntax lesen, verstehen und anwenden können. Beispiel: Eine Grammatik ist gegeben. Bestimmen Sie für einen gegebenen Input ob die ANTLR-Grammatik diesen Erkennt und welche Aktionen dafür ausgeführt werden. Sie werden ANTLR-Syntax NICHT selber schreiben müssen.


F: Ich habe die CompB-Vorlesung im HS 2009 besucht. Im Ordner Slides des HS2010 sind nur wenige Foliensätze drin. Ist es richtig, dass die restlichen Folien aus dem Ordner HS2009 verwendet wurden?

A: Nein das ist falsch. Der Stoff für die Prüfung ist das Skript CompBSkript.pdf im Ordner HS2010. Dieses basiert zu einem grossen Teil auf den Folien des letzten Jahres, beinhaltet aber auch neue und ergänzende Themen.


F: Ich nehme an, dass sich der Umfang der diesjährigen Prüfung an den Themen orientieren wird, die sich auf dem Wiki befinden.

A: Ja das wird so sein. Einen guten Überblick über die Themen bieten auch die Übungen. Der Bereich ANTLR wird wie bereits in anderen Fragen erwähnt nur im Bereich Verständnis der Vorgehensweise und Lesen und verstehen von einfachen Beispielen geprüft.


F: Welche Hilfsmittel sind für die Prüfung zugelassen?

A:


F: Prüfung Aufgabe 3.4 c) Wieso wird bei Schritt 8 nochmals r2 angewendet? Wir befinden uns doch im Zustand 6 und es folgt ein A, somit müsste ein goto4 als Aktion bei Schritt 8 sein.

A: Zeile 8 kann man in der Lösung streichen, da sie vermutlich versehentlich reingerutscht ist. Jedenfalls ist sie falsch.


F: Nach Änderung des Skripts bzgl. Thompson-Konstruktion verstehe ich die Lösung für 2.2.1 immer noch nicht ganz: Die Bausteine aus dem Skript werden ja jeweils bei ihren Endzuständen und q0 zusammengehängt. Warum gibt es dann zwischen q2 und q3 und q10 und q11 nicht einen weiteren Epsilon-Übergang (einer vom Einzel-Symbolübergang und der Eintritt bzw. Ausgang in *-Operator-Baustein)? Oder kann man folgen von Epsilon-Übergängen einfach zusammenklappen, sofern sie nicht verzweigen?

A: Bei der Thompson-Konstruktion sind sich nicht alle Autoren einig, wie viele Epsilon Übergänge wirklich nötig sind. Für die Prüfung gilt folgendes. Folgen mehrere Epsilon Übergänge hintereinander ohne andere Verzweigung, können diese zu einem Einzigen zusammengefasst werden. Aber auch die ausführliche Variante gibt die selben Punkte. Mehrere Übergänge aus dem selben Zustand mit einem Terminal Symbol (Nicht Epsilon) sind nicht korrekt. Hier braucht es zwei aufeinander folgende Epsilon Übergänge.

Beispiel: Im Skript Abbildung 2.9 * operator. Wir werden in der Prüfung auch die vereinfachte Version in der (q0 und q1) zusammengefasst und q4 zum einzigen Endzustand gemacht wird als korrekt bewerten.


|home |print view |recent changes |changed January 31, 2011 |
exact
|You are 107.20.129.212 <- set your identity!

Fragen Und Antworten
go to start