Arbeitsbereich Programmiersprachen Foren-Übersicht
Autor Nachricht

<  Archiv WS 2010/2011  ~  Piglet Interpreter fait

Simson
Verfasst am: 15 Dez 2010 22:51 Antworten mit Zitat
Anmeldungsdatum: 23.10.2007 Beiträge: 55
Hey,

Ich hab den Interpreter mit JUnit mittlerweile anschmeißen können. Allerdings schmeißt er mir immer nur Fehler der Form "Unknown proc label xxx".

Das kommt auch wenn ich die Programme von hier parse und den Interpreter damit fütterere.
z.B.:
Code:
piglet.test.interpreter.EvalRuntimeError: Unknown proc label MT4_Change


Was könnte ich falsch machen?
Benutzer-Profile anzeigen Private Nachricht senden ICQ-Nummer
konrada
Verfasst am: 16 Dez 2010 10:07 Antworten mit Zitat
Anmeldungsdatum: 19.10.2009 Beiträge: 160 Wohnort: Freiburg
Ich seh grad, in template 4.1 wird der ProcDefinitionCollector nicht benutzt. Bis 4.2 draussen ist, empfehle ich, in PigletInterpreter.java, Methode run, folgendes zu aendern:

Code:

      Evaluator ev = new Evaluator(cpc);
      EvalContextImpl ec = new EvalContextImpl();
      try {
           // EINFUEGEN ANFANG
         ProcDefinitionCollector pdc = new ProcDefinitionCollector(ec);
         prog.apply(pdc);
           // EINFUEGEN ENDE
         prog.apply(ev, ec);
      }


Gehts dann?
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Simson
Verfasst am: 16 Dez 2010 12:08 Antworten mit Zitat
Anmeldungsdatum: 23.10.2007 Beiträge: 55
Yeah, danke =)
Benutzer-Profile anzeigen Private Nachricht senden ICQ-Nummer
Simson
Verfasst am: 04 Jan 2011 16:11 Antworten mit Zitat
Anmeldungsdatum: 23.10.2007 Beiträge: 55
Der Interpreter funktioniert mit JUnit mittlerweile wunderbar. Aber bevor ich mich jetzt totsuche: Wie bekomme ich den Interpreter "einfach so" zum laufen? Also ich möchte ihm einfach ein piglet-Program geben und er schreibt mir die Ausgabe auf die Konsole oder in eine Datei. Sowas:
Code:
PrintWriter pw = new PrintWriter("output.txt");
       WriterPrintChannel wpc = new WriterPrintChannel(pw);
       Evaluator e = new Evaluator(wpc);
       PigletInterpreter.run(pProgram, wpc, pw);
ist ja irgendwie nicht so sinnig (und funktioniert auch nicht =).
Code:
 PrintWriter pw = new PrintWriter("output.txt");
       WriterPrintChannel wpc = new WriterPrintChannel(pw);
       Evaluator e = new Evaluator(wpc);
       pProgram.apply(e);
geht auch nicht...

Ich bin mir sicher, es ist ganz einfach Wink
Benutzer-Profile anzeigen Private Nachricht senden ICQ-Nummer
konrada
Verfasst am: 04 Jan 2011 19:43 Antworten mit Zitat
Anmeldungsdatum: 19.10.2009 Beiträge: 160 Wohnort: Freiburg
Beispielsweise auf der Kommandozeile:

Code:

java -cp /bla/blub/MiniJavaToSPiglet/bin piglet.test.PigletInterpreter /wuff/zack/Factorial.pg


Wenn Du was anderes brauchst, ist piglet.test.PigletInterpreter ein Einstieg.
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Simon2
Verfasst am: 11 Jan 2011 2:02 Antworten mit Zitat
Anmeldungsdatum: 07.01.2011 Beiträge: 11
Ich wollt mal gern wissen wie das ist, wenn der Interpreter mit nem StackOverflow aussteigt.

Ich habe das bei Euler.java (In meiner .tar im Testcase Thread) in der 3. Iteration, wo die Funktion mit 188 als Parameter aufgerufen wird (in der test_it() Funktion). Bei um die 100 läuft mein generierter piglet code mit dem Interpreter.

Das bescheuerte was ich nicht kapiere ist, dass es auch mit 188 funktioniert, wenn ich meine ca. 50 Testcases drin habe und der Euler irgendwann zwischendrin läuft. Packe ich nur die Euler.java in den "topiglet" Ordner, gibts den Overflow. Wieso hat das denn einen Einfluss auf den Interpreter, was vorher für ein Programm durchläuft?

Angenommen man kann jetzt aber effizienteren piglet Code generieren der im Interpreter in keinem Fall einen Stack Overflow verursacht, gäbs dann für mich Abzüge, weil mein Code zu Speicherhungrig ist?

Ich gehe mal nicht davon aus, dass ich einen Bug in der Übersetzung habe, wenn es für kleinere Werte läuft mit besagtem Programm.
Benutzer-Profile anzeigen Private Nachricht senden
konrada
Verfasst am: 11 Jan 2011 10:11 Antworten mit Zitat
Anmeldungsdatum: 19.10.2009 Beiträge: 160 Wohnort: Freiburg
Der Piglet-Interpreter macht fuer einen Piglet-Prozeduraufruf auch einen Java-Methodenaufruf; tiefe Rekursion in Piglet-Programmen frisst also auch Java-Speicher im Interpreter.

Man kann bei der JVM einstellen, wie viel Speicher sie max belegen soll. Fuer Eclipse muss man eh auf "gib ihm" stellen, davon profitieren dann wohl auch JUnit-Tests. Der Parameter fuer Stacksize ist laut http://download.oracle.com/javase/1.5.0/docs/tooldocs/solaris/java.html "-Xss" Versuch doch mal

java -Xss4096k -cp undsoweiter
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Simon2
Verfasst am: 11 Jan 2011 15:33 Antworten mit Zitat
Anmeldungsdatum: 07.01.2011 Beiträge: 11
Alles Klar, mit größerem Stack läuft es dann tatsächlich. Smile
Dann probier ich doch mal, noch das GameOfLife zum Laufen zu bekommen.
Benutzer-Profile anzeigen Private Nachricht senden

Beiträge vom vorherigen Thema anzeigen:  

Alle Zeiten sind GMT + 2 Stunden
Seite 1 von 1
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.

Gehe zu:  

Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.