Humboldt-Universität zu Berlin - Mathematisch-Naturwissenschaftliche Fakultät - Systemanalyse

Compilerbaupraktikum - Aufgabenblatt 2

Generelles

Abgabetermin

So, 25.05.2014 23:59 Uhr

Allgemeine Hinweise

Für alle Praktikumsaufgaben gilt, dass Einsendungen, die nicht in der jeweils mitgegebenen Testumgebung laufen, mit null Punkten bewertet werden! Das beinhaltet insbesondere alle Programme, die sich nicht fehlerfrei kompilieren lassen. Als Testsystem werden wir dabei star mit den dort installierten Compilern und Compilerwerkzeugen benutzen. Prüfen Sie bitte rechtzeitig vor der Abgabe, ob ihr Programm auch dort lauffähig ist. Die Aussage „aber bei mir zuhause hat es funktioniert“ führt entgegen mancher Erwartungen nicht zur Punktevergabe.

Ebenfalls mit null Punkten werden alle Abgaben bewertet, die sich nicht exakt an die vorgegebenen Formate halten. Hier sollen insbesondere falsch gepackte Archive erwähnt werden (die nicht alle nötigen/die falschen/zu viele Dateien enthalten, eine falsche Verzeichnisstruktur besitzen, …). Kleiner Tipp (der bisher jedes Jahr von mindestens fünf Studenten ignoriert wurde): Vor der Abgabe einfach mal selbst das Archiv auspacken und nachsehen was drin ist.

Bei Fragen wenden Sie sich bitte an Ihren Praktikumsbetreuer während des Praktikums.

Sollten wir beim persönlichen Beantworten von Fragen feststellen, dass unsere Aufgabenstellung nicht präzise genug war, so werden wir einen konkretisierenden Eintrag in der Newsgroup erstellen. Zur Bewertung wird die Aufgabenstellung inklusive aller von uns erstellten Nachrichten in der Newsgroup herangezogen. Schauen Sie daher bitte ab und zu ebendort nach, ob sich die Aufgabenstellung inzwischen eventuell leicht geändert hat und ob ihre bereits fertige Lösung nochmal bearbeitet werden muss.

Abgabemodus

Die Abgabe erfolgt digital über das Goya-System. Die Flex-Eingabe-Datei ist in einer Datei loesung.tar.gz verpackt abzugeben. In dieser tar.gz-Datei soll ausschließlich die Datei minako-lexic.l (ohne irgendwelche Unterverzeichnisse!) enthalten sein.

Zur Lösung der Aufgaben steht für Sie eine Datei aufgabenblatt-2.tar.gz zur Verfügung. Sie enthält für Aufgabe 3 ein Unterverzeichnis c0-scanner mit einem vorgegebenen makefile, einer Test-Datei testscanner.c und einer Header-Datei minako.h sowie einer Testeingabe demorgan.c0 und der erwarteten Testausgabe demorgan.sol.

Noch ein Hinweis zu den Compilerwarnungen: Nach wir vor gilt, dass wir für Warnungen bei der Kompilation Punkte abziehen. Nun gibt es leider drei Warnungen, die man bei von flex generierten Quelltexten leider nicht vermeiden kann. Daher tolerieren wir die folgenden beiden Warnungen (die und nur die):
lexer3.l: In function `yylex':
lexer3.l:77: warning: label `find_rule' defined but not used
lexer3.l: At top level:
lexer3.l:885: warning: `yy_flex_realloc' defined but not used
lexer3.l:410:12: warning: 'input' defined but not used [-Wunused-function]

Aufgabe 3 (100 Punkte)

Kurzbeschreibung

Implementieren Sie mit Hilfe von flex einen Scanner, der in einem Eingabestrom bzw. in einer Eingabedatei die Token der Sprache C0 erkennt..

Aufgabenstellung

In den Praktikumsveranstaltungen wurde bzw. wird der Umgang mit dem Scannergenerator flex gezeigt. Mittels dieses Werkzeuges sollen sie einen Scanner implementieren, der aus einem Eingabestrom die Token der Sprache C0 extrahiert.

Die Lexik der Sprache C0 befindet sich hier. Zusätzlich sind folgende Punkte zu beachten:

  • wenn man den Scanner ohne Kommandozeilenparameter aufruft, soll er von stdin lesen, ansonsten aus der auf der Kommandozeile angegebenen Datei (dabei sollen eventuell auftauchende Dateizugriffsfehler wie üblich abgefangen werden)
  • die Implementation hat in einer Datei namens minako-lexic.l zu erfolgen
  • Whitespaces (Leerzeichen, Tabulatoren, Zeilenenden) sollen vom Scanner erfolgreich ignoriert werden.
  • C- (/* */) und C++- (//) Kommentare sollen ebenfalls überlesen werden
  • es sind nur die in der Headerdatei minako.h definierten Token (z.B.: "==") als Konstanten (im Bsp.: EQ) zurückzugeben; bei allen nicht in minako.h erwähnten Zeichen (die aber laut Lexikbeschreibung zur Lexik von C0 gehören, z.B.: "+"), soll einfach der ASCII-Wert des Zeichens zurückgegeben werden
  • alle nicht in C0 erlaubten Zeichen (z.B.: "&") sollen zu einem lexikalischen Fehler führen (also wie immer: sinnvolle Fehlerausgabe und Abbruch des Programms)
  • wenn sie den Scanner auf das mitgelieferte C0-Beispielprogramm demorgan.c0 ansetzen, sollte genau die in demorgan.sol stehende Ausgabe erfolgen - bitte sehen Sie von einer Abgabe ihrer Lösung ab, solange dies nicht der Fall ist