Testeingaben für euren Interpreter!

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Testeingaben für euren Interpreter!
Sers Leute!

Unter dem Link findet ihr Code-Eingaben die mit eurem Interpreter laufen sollten: (Ist vom Übungsleiter Tobias Werth)

http://wwwcip.informatik.uni-erlangen.de/~sitowert/java/examples.html

Viel Spass

Toby


super link, danke

bei mir klappen mittlerweile alle


danke auch, ist echt klasse zum testen.

bei mir funktioniert allerdings das 3. programm noch nicht. das letzte y wird nicht addiert. hat jemand nen kleinen tipp für mich, was ich vergessen oder falsch gemacht habe?


höchstwahrscheinlich im expression block das letzte minus nicht richtig implementiert


bei mir sieht das so aus:

...
(( operator1:SYM_PLUS 
| 
operator2:SYM_MINUS) 
arg2=term
{
if ( operator2 == null ){
       e = new ALGOPlusExpression ( arg1, arg2 );
}
else if ( operator1 == null ) {
	e = new ALGOMinusExpression ( arg1, arg2 );
}	
}
)*
...

ich nehme an, e ist Dein Rueckgabewert der Funktion

[quote]e = new ALGOPlusExpression ( arg1, arg2 );
[/quote]
Dann musst Du hier arg1 durch e ersetzen, ausserdem musst du natuerlich die Zeile e = arg1 vor der operator Abfrage hinzufuegen.

Dadurch wird der Ausdruck e, der zurueckgegeben wird zusammengesetzt aus dem Ausdruck, der bereits geparset und erzeugt wurde (also e) und dem, der neu hinzugefuegt wurde, naemlich arg2.


wenn ich mir das so anschaue dann kann deine lösung net passen

stell dir vor du hast a+b+c+d+e+f+g

dann würdest du a+g machen nach deiner implementierung

(…)* heist aber dass es mehr als eines geben kann

also hast du wenn du es durchgehen lässt
((((((a+b)+c)+d)+e)+f)+g)

verstehst du was ich meine?


…so habe ich das eigentlich auch gedacht…

das mit e statt arg1 funktioniert, danke! hatte sowas ähnliches mal probiert, aber die lösung kam irgendwann unter die räder.

das problem war allerdings, ich habe vergessen, die operatoren wieder auf null zu setzten, wenn die schleife einmal durchlaufen ist…


was passiert eingentlich wenn dort 2±1 steht? das ham wir garnet berücksichtigt oder?

dann müsste nämlich die -1 geklammert sein


das funktioniert, weil unter number in der grammatik berücksichtigt wird, dass es auch zahlen mit negativem vorzeichen geben kann:

number	
	: 
         (
           SYM_MINUS 
	   SYM_NUMBER 
	  | 
	   SYM_NUMBER
	  )
	;

damit läuft das programm richtig, ohne dass du selbst eine nestedExpression bastelst.


gestern ist nem kumpel und mir noch aufgefallen, dass variablen und konstanten etwas unsauber bahandelt werden.

denn es ist erlaubt und einer kostante und einer variable den gleichen namen zuzuweisen, aber wenn man sie dann wieder auslesen will, dann geht das natürlich nicht. oder er nimmt, wie es zur zeit der fall ist, nur die variable.

kann man aber eigentlich ganz einfach verhindern, den code gibts hier:
http://forum.iukt.de/index.php?topic=115.msg827#msg827

also, wer noch lust hat, die fleißarbeit zu machen, dem wünsch ich viel spaß :smiley:


Ich wär mir nicht so sicher ob das wirklich die Musterlösung zu dem Problem ist … Java will ja auch dass wir alle unsere Variablen deklarieren und macht da keien eigene Deklaaration falls wir das vergessen haben … :-/


seh ich genauso, is ne variable nicht definiert (und damit vorallem ihr typ ebenso nicht), sollte man wohl eher zu einer exception greifen, als einfach die variable mitten im block zu defnieren… denk mal kaum, dass es gedacht ist, die definition am anfang eines blocks nicht zwingend zu machen.