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

Compilerbaupraktikum - Aufgabenblatt 3

Generelles

Abgabetermin

So, 08.06.2014 23:59 Uhr

Allgemeine Hinweise

Für alle Praktik​umsaufgaben 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.

Abgabemodus

Zur Lösung der Aufgabe steht für Sie eine Datei aufgabe3.tar.gz zur Verfügung. Sie enthält für Aufgabe 3 ein makefile, einen Scanner minako-lexic.c und eine Header-Datei minako.h sowie die Testeingabe beispiel.c-1.

Die Abgabe erfolgt digital über das Goya-System. Der Parser ist in einer Datei loesung3.tar.gz verpackt abzugeben. In dieser Datei soll ausschließlich die Datei minako-syntax.c enthalten sein ohne irgendeine Verzeichnisstruktur.

Aufgabe 3 (70 Punkte)

Kurzbeschreibung

Implementieren Sie von Hand einen Parser, der die Sprache C(-1) (eine Teilsprache von C0) erkennen kann. Verwenden sie dazu wahlweise Ihren Scanner aus dem Praktikumsaufgabenblatt 2 oder den beigelegten Scanner.

Aufgabenstellung

Nachdem Sie in der letzten Praktikumsaufgabe einen Scanner für die lexikalische Analyse gebaut haben, sollen Sie sich diesmal mit der syntaktischen Analyse beschäftigen. Wie Sie bereits in der Vorlesung gelernt haben, gibt es mehrere Ansätze, einen Parser zu bauen. Insbesondere wird dabei zwischen handgeschriebenen Parsern und (durch Parsergeneratoren) generierten Parsern unterschieden.

In dieser Aufgabe soll ein handgeschriebener Parser nach dem Prinzip des rekursiven Abstiegs implementiert werden. Da ein handgeschriebener Parser in der Regel ziemlich umfangreich ist, haben wir uns dazu entschlossen, die Sprache C0 (die ja durch Abrüsten aus C entstanden ist) noch einmal zu vereinfachen, um Ihnen extreme Tipporgien zu ersparen.

Sie finden die Grammatik von C(-1) hier. Zusätzlich sind folgende Punkte zu beachten:

  • wenn man den Parser 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-syntax.c zu erfolgen

  • der Parser gibt im erfolgreichen Fall nichts aus und beendet sich mit dem Rückgabewert 0

  • bei einem Parserfehler wird eine Fehlermeldung ausgegeben und das Programm mit einem Rückgabewert ungleich 0 beendet

  • wenn Sie den Parser auf das mitgelieferte C(-1)-Beispielprogramm beispiel.c-1 ansetzen, sollte er entsprechend nichts ausgeben und sich mit Rückgabewert 0 beenden