So much to code…

…so little time!

Wie wahr doch dieser Spruch ist!

Momentan bin ich wieder ziemlich dabei, Phorward Software weiter zu bringen. Was mich ein wenig nervt ist (wieder mal) mein Perfektionsdrang, der sich zur Zeit in einer radikalen Änderung der libphorward wiederspiegelt, wie auch in der Tatsache, dass der UniCC Parser Generator, ein Projekt an dem ich 6 Jahre (!) sporadisch gearbeitet habe, sozusagen für die Katz war. Das Programm ist Feature complete, und ich sehe darin auch keine große Zukunft – weil es nicht flexibel genug ist. Letztendlich. Hm.

Nein, die Zukunft liegt momentan eher in der libphorward, und der Erweiterung die ich vor einiger Zeit mal vorgestellt hatte als pggrammar. Inzwischen ist aus diesem Anfang schon eine beachtliche Menge Code geworden. pggrammar, oder das, was daraus wird, wird eine Spielwiese für Grammatiken, Lexer und Parser, also das, was UniCC als Code Generator verkörpert, nur in Form einer Library. Das schöne dabei ist, dass man bei einer Library – basierend auf einem objektorientiertem Ansatz – eine extrem flexible Software machen kann, die letztendlich keine Wünsche mehr offen lässt. Zumindest denke ich das.

Zur Zeit versuche ich das, was in diesem Klassendiagramm zu finden ist, in die libphorward einzubauen.

pggrammarDas ganze versuche ich natürlich wieder in C zu programmieren – wo auch schon das nächste Problem liegt. Eigentlich würde C++ hier mehr Sinn machen, zumal ich C++ auch gerne mal wirklich lernen würde. Aber dann kann man es nicht mehr in C benutzen… was mich doch wieder dazu veranlasst, es nicht zu tun, und dafür ein wirrwarr an Strukturen und komisch benannten Funktionen aufzubauen… verdammter Perfektionsdrang. Naja, mal sehen. Es macht ja eigentlich gar keinen Sinn, eine C-Library, in die man echt viel Zeit und Arbeit gesteckt hat, jetzt “einfach mal” auf C++ umzuschreiben – zumal dann ein Großteil der Library Funktionen wieder überflüssig wird, denke man nur an die Funktionen für verkettete Listen, Hash-Tables, dynamische Array… sowie das neue Objekt plist, welches sowohl doppelt verkettete Liste, Array als auch Hashtable sein kann. Krank, nicht?? 🙁

Ursprünglich war geplant, das Regular Expression Modul der libphorward nun darauf umzustellen, dass man auch direkt auf FILE-streams arbeiten kann…aber das wäre wieder nicht flexibel genug. Nach reichlicher Überlegung habe ich mich daher nun dazu entschlossen, anstatt das regex-Modul wieder komplett umzukrempeln (und ich finde gerade das ist mir bisher ziemlich gelungen!) nun die pggrammar-Idee in drei Module der libphorward aufzuteilen:

  1. grammar (pgrammar)
    • pgrammar
    • pterminal
    • pnonterminal
    • pproduction
  2. lexer (plexer)
    • plexer
  3. parser (pparser)
    • pparser

Die Module grammar und parser (was den LR/LALR-Teil angeht) sind momentan ja schon auf einem guten Wege, nur zur Zeit noch vereint als Modul “parser” in der libphorward. Das Modul lexer würde dann die Schnittstelle zwischen dem Modul regex und dem parser aufbauen, wäre aber auch ohne beide Module lauffähig.

Ein Modul der libphorward wird immer anhand des Verzeichnisses in src definiert. Die Funktionen sind alle in einer Library, aber bestimmten Themen zugeordnet.

libphorward_module

Die libphorward würde dann aus folgenden Bereichen bestehen:

  • base (Basis-Funktionen, Datenstrukturen)
    • debug
    • llist** (leider geil, da einfach zu bedienen! – sehr häufig benutzt)
    • hashtab*
    • stack*
    • plist (hash-table, double-linked list, stack als einzelnes Objekt)
  • string (erweiterte String Funktionen)
  • regex (Funktionen für reguläre Ausdrücke, NFA/DFA, Zeichenklassen)
  • union* (dynamische Datentypstruktur)
  • xml* (XML-DOM Tools)
  • util* (System-Werkzeuge)
  • grammar*** (Grammatik-Tools)
  • lexer*** (Tools zur Erstellung lexikalischer Analysatoren)
  • parser*** (Tools zur Erstellung von Parsern (LR, LL) auf Basis von grammar und lexer)

* Modul/Datenstruktur nicht mehr sinnvoll?
** Die Datenstruktur LIST, auch LLIST oder llist genannt, ist ein Phänomen. Die Funktionen dafür habe ich mal anno 2006 oder so programmiert – und diese Library ist unschlagbar geil, weil sie so simpel ist. Einfach verkettete Pointer-Listen ohne viel Schnickschnack: LIST. Selbst in pggrammar habe ich viele davon benutzt, weil sie so extrem simpel ist. Daher wird plist “nur” in Fällen genutzt, wo es wirklich Sinn macht – also alles, was hashtab, llist und/oder array sein soll und muss. Wegoptimieren von LIST? Unmöglich. Aber LIST ist cool!:
*** Modul in Planung!

So sieht’s momentan aus. Tja… viel Gedankenmüll. Und das um sinnlose Software. Aber: Ich find’s geil! 😀 Und ist es nicht das, worauf es ankommt?