Erinnerung Hausaufgabe 4

Compiler Construction, WS1213

Die Abgabe ist bis Di, den 12.02.2012 23:59 Uhr fällig!

Für diese Aufgabe soll der mit Hilfe von von BCEL http://commons.apache.org/bcel/ (Hinweise unter http://commons.apache.org/bcel/manual.html) ein Compiler entwickelt werden. Dieser soll folgendes unterstützen:

  • als Eingabe dienen mehrstellige Zahlen >= 0 inklusive beliebigen Nachkommastellen, bspw. 62.231
  • Alternativ muss auch die Exponentialschreibweise unterstützt werden, bspw. 3.81E-6 (dabei gilt: positive und negative Exponenten müssen unterstützt werden)
  • Addition (+) wird korrekt ausgewertet, bspw. 1.33+1.4 ergibt 2.73
  • Subtraktion (-) wird korrekt ausgewertet, bspw. 2.61-1.3 ergibt 1.31
  • Multiplikation (*) wird korrekt ausgewertet, bspw. 5.2*1.5 ergibt 1,8
  • Division (/) wird korrekt ausgewertet, bspw. 8.4/2.8 ergibt 3
  • Geklammerte Ausdrücke werden korrekt ausgewertet, bspw. (3+4)*5 ergibt 35
  • ’Punkt vor Strich’ wird korrekt ausgewertet, bspw. 3+4*5 ergibt 23
  • Es muss möglich sein (mehrbuchstabige) Variablen zu definieren, bspw. ahsd=…
  • Zuweisungen zu Variablen sollen mit Zahlen, anderen Variablen oder eine Mischung dieser möglich sein, bspw. x=y+(3-z)
  • Mehrere Ausdrücke, bspw. y=2 z=5 x=y+(3-z)
  • ‘If’-‘else’-Abfragen müssen unterstützt werden
    • Schachtelung soll möglich sein, d.h. so etwas wie if (…) { if (…) {}else{} }else{}
    • für die If-Bedingung sollen mindestens ==, < und > in Verbindung mit Variablen, Dezimahl- oder Exponentialzahlen möglich sein
    • die If-Bedingung soll beliebig komplex mit Hilfe von &, | und Klammerungen aufgebaut sein können, bspw.  if ( (x < y) & 3 < z | 3.81E-6  == y ) …
  • ‘While’-Schleifen müssen unterstützt werden
    • für die While-Bedingung sollen mindestens ==, < und > in Verbindung mit Variablen, Dezimahl- oder Exponentialzahlen möglich sein, bspw. while x < 22 …
  • Funktionen mit und ohne Parameter müssen definiert und aufgerufen werden können
    • in den Funktionsrümpfen müssen alle hier aufgeführten Strukturen nutzbar sein, d.h. if, while, usw.
  • rekursive Funktionsaufrufe müssen unterstützt werden, bspw. function fibu (number){ if number < 2 {number} else {fibu ( number – 1 ) + fibu ( number – 2 )} }
Zudem sollte eine aussagekräftige Fehlerbehandlung erfolgen, d.h. falls die Generierung einer Class-Datei nicht möglich ist, sollte die fehlerhafte Stelle identifiziert und dem Benutzer ausgegeben werden.
Automatisch korrigierbare Fehler, bspw. eine fehlerhafte Klammerung sollten (sinnvoll) behoben werden und NICHT zu einem Fehlschlagen der Generierung der Class-Datei führen, d.h. ‘1+2*(3-1’ sollte zu ‘1+2*(3-1)‘ ergänzt werden. Das betrifft auch komplexere Ausdrücke wie: ‘if(3>2){1+2*(3-1}else{5}’ sollte zu ‘if(3>2){1+2*(3-1)}else{5}‘ ergänzt werden. 
WICHTIG:
Für alle Funktionalitäten müssen Unit Tests mitgeliefert werden. Jede Funktionalität, für die kein Unit Test vorliegt, gilt als nicht implementiert und kann nicht bewertet werden. Diese Abgabe muss als separates Eclipse-Projekt implementiert und abgegeben werden. Sofern nicht explizit zugelassen, dürfen zusätzliche Bibliotheken Dritter nicht verwendet werden. Im Zweifel bitte bei mir rückversichern.