libphorward selfhosted!

Seit Freitag ist die libphorward nun self-hosted.

Was heißt das nun konkret? Nun es hört sich ein wenig an wie autofellatio, ist aber noch viel, viel geiler! Die libphorward wurde nun um ein weiteres Modul, das Programm ppgram2c  erweitert.

ppgram2c ist ein Code-Generator, welcher eine Backus-Naur-notierte Parser-Beschreibung aus einer Datei einliest und anschließend als C-Programm wieder ausgibt, also sozusagen die Funktionsaufrufe, die nötig sind, um die gewünschte Grammatik direkt in C mit dem libphorward Funktion des parser-Moduls zu definieren.

Aus der BNF-Notation für die eigene BNF-Sprache mit der Syntax:

Ich muss gestehen, das diese Grammatik noch recht unschön definiert ist, was aber daran liegt, das noch ein paar Bugs vorliegen (equal, percent und semicolon mussten wegen Mehrfachverwendung als eigene Symbole definiert werden, sollte später so nicht sein).

Aus dieser Grammatik erzeugt ppgram2c nun folgenden C-Code (mit ein wenig awk-Hokuspokus drumherum):

Also wer’s nachtesten will, es ist

ppgram2c –indent 1 src/parse/gram.syn

was hier im Hintergrund aufgerufen wird. Es erzeugt das meiste von dem Code above.

OK nun zum Highlight des ganzen: Der Parser parst seine eigene Grammatik und erzeugt den Code für sich selbst. Folglich konnte der Parser erfolgreich durch sein eigenes Duplikat ersetzt werden. Die nachfolgenden Parser der libphorward sind allesamt Klone von sich selbst, also werden mit sich selbst geparst und dann selbst Bestandteil der Toolchain. Diesen Mechanismus nennt man im Compilerbau bootstrapping, und wurde bisher bei all meinen Compilerprojekten erfolgreich umgesetzt, also JS/CC, UniCC (welcher min_lalr1 benutzt) und nun auch der libphorward.

Damit wurden der rekursive-absteigende Parser der libphorward sowie die handgeschriebene LALR(1)-Grammatik hinfällig, da sie durch ihren eigenen Klon ersetzt wurden. (Hoffentlich hat der Klon keinen Fehler…)

Damit ist die libphorward selfhosted (selbst-gastgebend) und kann sich selbst compilieren (zumindest den Parser ;-)). Was nun folgt ist pure geile Scheiße! 😀

Man liest sich…