Seite 1 von 1

4. Aufgabenblatt

Verfasst: 13. Feb 2013 15:41
von Martek
Zur letzten Aufgabe: Das mit dem ANTLR habe ich noch nicht so wirklich verstanden

Wie genau rufe ich ANTLR denn in der Console auf? Der Befehl in den Folien funktioniert bei mir nicht. Wenn ich ANTLRWorks starte kann ich auch nichts erstellen weil die CALC.tokens Datei fehlt. Sollen wir die auch selbst erstellen?

Re: 4. Aufgabenblatt

Verfasst: 13. Feb 2013 16:13
von LordHoto
Martek hat geschrieben:Zur letzten Aufgabe: Das mit dem ANTLR habe ich noch nicht so wirklich verstanden

Wie genau rufe ich ANTLR denn in der Console auf? Der Befehl in den Folien funktioniert bei mir nicht. Wenn ich ANTLRWorks starte kann ich auch nichts erstellen weil die CALC.tokens Datei fehlt. Sollen wir die auch selbst erstellen?
Calc.tokens sollte dir erstellt werden, wenn du ANTLR mit Calc.g als Parameter ausführst.

Die ANTLR Version auf der Webseite lässt sich wie folgt ausführen:

Code: Alles auswählen

java -jar antlr-3.5-complete.jar Calc.g

Re: 4. Aufgabenblatt

Verfasst: 13. Feb 2013 16:39
von Martek
Okay ich habe nun alles kompilieren können und versuche nun den interpreter auszuführen.

Leider weiß ich nicht genau wie dieser zu benutzen ist.

nach hinzufügen von antlr im classpath kann ich java Calc aufrufen und ich bekomme eine Eingabemaske. Aber egal was ich eintippe, ich bekomme keine Ausgabe. Wie benutze ich Calc denn dann und gibt es die Möglichkeit etwas mit einer Textdatei einlesen und Calc speichert das Ergebnis auch in eine Textdatei? Wäre ja sinnvoll für die Aufgabe.

Re: 4. Aufgabenblatt

Verfasst: 13. Feb 2013 16:55
von Jens Huthmann
Ich habe in der aktuellen Version von Calc.tgz leider das Testprogramm vergessen was ich Ihnen mitliefern wollte.

Das Programm enthält nur diesen Code, ich werde das Archiv so schnell es geht aktualisieren.

Code: Alles auswählen

// ex1.calc -- valid Calc program
var n: integer;
var x: integer;
n := 2+4-1;
x := n+3+7;
print(x);
Calc arbeitet im Moment mit stdin und stdout. Beachten Sie das in der Version die ich Ihnen geliefert habe der Interpreteraufruf auskommentiert ist.

Edit:
Das Archiv enhält jetzt auch das obige Programm.

Re: 4. Aufgabenblatt

Verfasst: 13. Feb 2013 17:06
von Martek
Ich verstehe aber weiterhin nicht wie ich den Code eingebe. Ich habe den Interpreter einkommentiert und den TriangleConverter auskommentiert. Eigentlich müsste dann ja was passieren, wenn ich den Code eingebe. Aber leider bekomme ich keinerlei Ausgabe auf der Console wenn ich Calc starte. Ich habe natürlich den Code mal eingegeben, aber das Programm wartet soweit ich es erkenne ja dass stdin beendet wird oder nicht? Aber wie soll das gehen?

Edit: Unter Unix beendet man die Eingabe mit ctrl + d (war mir neu ;))

Re: 4. Aufgabenblatt

Verfasst: 13. Feb 2013 17:17
von LordHoto
Martek hat geschrieben:Ich verstehe aber weiterhin nicht wie ich den Code eingebe. Ich habe den Interpreter einkommentiert und den TriangleConverter auskommentiert. Eigentlich müsste dann ja was passieren, wenn ich den Code eingebe. Aber leider bekomme ich keinerlei Ausgabe auf der Console wenn ich Calc starte. Ich habe natürlich den Code mal eingegeben, aber das Programm wartet soweit ich es erkenne ja dass stdin beendet wird oder nicht? Aber wie soll das gehen?

Edit: Unter Unix beendet man die Eingabe mit ctrl + d (war mir neu ;))
Du solltest normalerweise auch via "program < datei" den Inhalt aus einer Datei via stdin an ein Program leiten können. Ist vllt. nützlich wenn du nicht immer alles zum Testen abtippen willst ;-)

Re: 4. Aufgabenblatt

Verfasst: 13. Feb 2013 19:20
von Martek
Zu spät, bin nun schon fertig mit der Aufgabe :P Hat dann ja auch so funktioniert ^^ Aber gut zu wissen ja.

Re: 4. Aufgabenblatt

Verfasst: 13. Feb 2013 21:02
von Martek
Noch eine Frage zu Aufgabe 1:


Wie genau sollen wir denn den Visitor imitieren?

Um keine Lösung der Aufgabe selbst zu nennen, hier mal ein eigenes Beispiel:

Möglichkeit a)
__________________________________________
execute[if n > 4 then putint(4) else putint(n)]
__________________________________________
evaluate [n > 4]
JUMPIF(0) Lelse
execute [C1]
JUMP Lfi
execute [C2]
Lelse: Lfi:
__________________________________________
evaluate [n]
evaluate [4]
CALL lt
JUMPIF(0) Lelse
execute [C1]
JUMP Lfi
execute [C2]
Lelse: Lfi:
_________________________________________

Und so weiter

Möglichkeit b)
__________________________________________
execute[if n > 4 then putint(4) else putint(n)]
__________________________________________
evaluate [n > 4]
...
__________________________________________
evaluate [n]
...
__________________________________________
fetch[n]
...
__________________________________________
LOAD n
...
__________________________________________
LOAD n
evaluate[4]
...
__________________________________________

Und so weiter.


Die "..." meine ich wirklich wortwörtlich, weil der Rest hier noch nicht erzeugt ist. Der Visitor würde ja eher wie in Beispiel b) vorgehen und jeden Visitor-Knoten weiter absteigen, bevor die restliche Schablone benutzt wird. Durch den Rekursiven Abstieg im Baum wird jede Erzeugung intern ja unterbrochen wenn ein aufzulösender neuer Knoten gefunden wird.

Übersichtlicher und intuitiver zu verstehen als Mensch ist aber Lösung a) mMn.

Re: 4. Aufgabenblatt

Verfasst: 13. Feb 2013 22:49
von LordHoto
Martek hat geschrieben:Noch eine Frage zu Aufgabe 1:


Wie genau sollen wir denn den Visitor imitieren?

Um keine Lösung der Aufgabe selbst zu nennen, hier mal ein eigenes Beispiel:

Möglichkeit a)
__________________________________________
execute[if n > 4 then putint(4) else putint(n)]
__________________________________________
evaluate [n > 4]
JUMPIF(0) Lelse
execute [C1]
JUMP Lfi
execute [C2]
Lelse: Lfi:
__________________________________________
evaluate [n]
evaluate [4]
CALL lt
JUMPIF(0) Lelse
execute [C1]
JUMP Lfi
execute [C2]
Lelse: Lfi:
_________________________________________

Und so weiter

Möglichkeit b)
__________________________________________
execute[if n > 4 then putint(4) else putint(n)]
__________________________________________
evaluate [n > 4]
...
__________________________________________
evaluate [n]
...
__________________________________________
fetch[n]
...
__________________________________________
LOAD n
...
__________________________________________
LOAD n
evaluate[4]
...
__________________________________________

Und so weiter.


Die "..." meine ich wirklich wortwörtlich, weil der Rest hier noch nicht erzeugt ist. Der Visitor würde ja eher wie in Beispiel b) vorgehen und jeden Visitor-Knoten weiter absteigen, bevor die restliche Schablone benutzt wird. Durch den Rekursiven Abstieg im Baum wird jede Erzeugung intern ja unterbrochen wenn ein aufzulösender neuer Knoten gefunden wird.

Übersichtlicher und intuitiver zu verstehen als Mensch ist aber Lösung a) mMn.
Hier sollen eigentlich die Codeschablonen so angewendet werden, wie sie in der Vorlesung vorgestellt wurden. Das sollte wie dein erster Vorschlag aussehen (genau geprüft habe ich es jetzt nicht), nur dass halt C1 etc. ersetzt werden müssen.

Re: 4. Aufgabenblatt

Verfasst: 14. Feb 2013 01:08
von Martek
Das tue ich ja in beiden Versionen, nur schreibt Version 1 erst die Code-Schablone komplett hin und wertet dann den nächsten Ausdruck aus und Version 2 schreibt alles hin, bis ein Ausdruck auftaucht der rekursiv ausgewertet werden muss.

Aber das mit C1 habe ich nur vergessen hier zu ersetzen, das sollte natürlich putint(4) bzw putint(n) sein.

Re: 4. Aufgabenblatt

Verfasst: 14. Feb 2013 12:36
von LordHoto
Martek hat geschrieben:Das tue ich ja in beiden Versionen, nur schreibt Version 1 erst die Code-Schablone komplett hin und wertet dann den nächsten Ausdruck aus und Version 2 schreibt alles hin, bis ein Ausdruck auftaucht der rekursiv ausgewertet werden muss.
Die Codeschablonen sind eher die Idee hinter der Methode, von daher sollen sie komplett "expandiert" werden.

Re: 4. Aufgabenblatt

Verfasst: 26. Feb 2013 00:28
von StudyForFun
Ist es eigentlich auch erlaubt für die letzte Aufgabe ANTLR 4 zu benutzen?

Re: 4. Aufgabenblatt

Verfasst: 26. Feb 2013 12:03
von Jens Huthmann
StudyForFun hat geschrieben:Ist es eigentlich auch erlaubt für die letzte Aufgabe ANTLR 4 zu benutzen?
Verwenden Sie bitte die vorgegebene ANTLR Version. Sie können aber wenn Sie das möchten es noch zusätzlich mit ANTLR4 machen :wink:

Re: 4. Aufgabenblatt

Verfasst: 27. Feb 2013 00:57
von StudyForFun
Reicht es in der letzten Aufgabe den Assemblercode auf der Konsole auszugeben oder muss der Code automatisch assembliert und ausgeführt werden?

Re: 4. Aufgabenblatt

Verfasst: 27. Feb 2013 11:48
von Jens Huthmann
Auf der Konsole ausgeben, das kann man dann mit dem Umleitungsoperator > in eine Datei ausgeben.