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ß
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.