Coding parsers…

…wird mit der libphorward jetzt immer geiler! Seit gestern gibts ein neues README-File mit schönem Demoprogramm und neuer Featureliste… damit mal Tacheles gesprochen wird, wozu das Ding eigentlich da ist:

Schneller kann man keinen Parser definieren, ausführen und den Parsebaum als Ergebnis sehen… und alles direkt im C-Code!

Alleinstellungsmerkmal?? 🙂 I hope so…

Schönere Grammatik ;)

Soo die libphorward hat jetzt auch eine schönere Grammatik für ihre BNF-Sprache. Die bereits beim self-hosting Prozess verwendete Grammatik sieht jetzt so aus:

Kann sich doch eher sehen lassen, oder? Die $-Zeichen definieren Terminaldeklarationen, es sind auch anonyme Terminaldeklarationen erlaubt, und Inline-Terminals werden jetzt über einen Pattern-Matching-Mechanismus auf existenz geprüft, so dass diese nicht extra definiert werden müssen (so wie % und  ;).

Ausserdem ist die Entwicklung jetzt erstmal nach Bitbucket umgezogen, weil Sourceforge der Meinung war, meinen Benutzernamen mit dem Namen eines indischen Java-Entwicklers, mit dem ich nichts gemeinsam habe, zu verlinken, weil da irgendein blöder Bug drin ist. Ausserdem benutzen wir Bitbucket auch bei mausbrand, und bin damit bisher sehr gut gefahren :).

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…

Lets Rutsch

Alloah zusammen,

nun, gestern kam dann nochmal das vernichtende Urteil von ihr. Ich kann es verstehen. Ich habe Mist gebaut. Ich werde es besser machen ab heute. Keiner von euch weiß davon. Es ist auch besser so. Ich liebe sie. Ich liebe sie wirklich. Nur die Sache ist jetzt gelutscht. Aus und zu Ende.

Naja, was gibts Neues? Muss momentan Home Office machen weil in der Firma der Fußboden jetzt endlich versiegelt wird. Heute nur phantastischen Klamauk gemacht im Vi, könnt ihr euch, wie immer auf Bitbucket angucken.

Krasser Scheiss, bin heute um 9 Uhr aufgewacht und seit dem am Rechner, war nur vorhin einmal kurz einkaufen… uptime für heute 16 Stunden 23 Minuten, na das ist doch mal was. Und das obwohl mir der Rechner mehrmals fast abgekackt wäre, habe heute endlich mal nen Swapspace eingerichtet… das ist so wie das pagefile.sys unter Windoofs, aber unter Linux kann man das “mal eben” im laufenden Betrieb machen und plöööötzlich läuft das System viel performanter. Klasse, nicht? Ein Betriebssystem das funktioniert, das unendlich viele Möglichkeiten bietet und so wunderbar stabil ist. Ich mag Linux. Und diese Neidfaces unter euch, die immer meinen auf Linux rumlabern zu müssen: Wenn man keine Ahnung hat, einfach mal Fresse halten! 🙂

Andi empfahl mir heute Gronkhs “Lets Rutsch”. Das Youtube-Video ist eigentlich eher weniger ein Video sondern vielmehr ein Hörspiel, die Gedanken von Gronkh, dem Spielemeister… sehr interessant, ich habe es mir wirklich komplett angehört (ja es geht zwei Stunden!) und es zeigt einem die Gefühlswelt anderer so wie man sie eigentlich selber sieht.

Ich finde es gut. Wer’s sich anhören möchte (wie Andi sagt, ab der 5ten Minute wirds gut!):

Tja, was war sonst noch? Mein Entwicklerfreund Sergiy Shatunov aus Kiew hat wieder ein paar commits in den JS/CC gemacht. Ich finde das toll, dass ich doch mal ein Open Source Projekt gestartet habe welches Mitstreiter findet, die echt was auf dem Kasten haben. Habe Sergiy auch eben als Admin für das JS/CC-Projekt eingetragen. Ich denke er macht seinen Job gut, und er hat oft gute Ideen, auch wenn ich ihm im Chat über Jabber meist nicht so gut folgen kann, weil er glaub ich gedanklich auf einem ganz anderen Level ist. Er hat JS/CC auf Node.js gebracht, und ich finds klasse! 🙂 Wär wirklich klasse wenn libphorward ähnliches wiederfahren würde, aber ich glaube nicht. C ist geil, und C ist out. Niemand programmiert mehr C, ausser die Freaks. So wie ich.

Und sonst? Ich hab mich heute bei Twitter angemeldet. Hatte das schon seit einiger Zeit vor, aber nun hab ich endlich mal dran gedacht und auch die Zeit dafür gehabt. Schaut doch mal vorbei: https://twitter.com/codepilot85 😉

Ja… was war sonst? Die Vereins-Homepage ist jetzt auch bei meinem Lieblingswebhoster all-inkl.com, habe das einfach mal in die Wege geleitet… weg von SCHEISS 1&1, hin zu einem Hoster ders wirklich drauf hat. Und all-inkl.com ist wirklich gut, bin da seit 10 Jahren Kunde und bin mit denen sowas von zufrieden.

Ich will endlich wieder fliegen. Naja… das wars erstmal. Ich sag mal bis denne. Und hoffe das ich so stabil bleibe wie jetzt. Der Tag heute war wirklich nicht schön.

Nachtrag: So es ist 2:41, die Uptime beträgt 17 Stunden… aber kestrel kommt an merlin nicht dran… wird er auch nie… dafür hab ich kestrel viel zu lieb! 😉

uptime_2015-01-06Gute Nacht.

libphorward on the way!

Obwohl ich ja nur noch privat C programmiere, mache ich es inzwischen sogar wieder viel lieber als es zu Zeiten von MEGA noch war.

Tja, was macht man so als Nerd wenn man Freitagnacht wieder mal vorm Rechner sitzt weil man keine Freunde hat die mit einem Biertrinken gehen? Richtig, man trinkt Bier vorm Rechner und codet fleißig an seiner Software, die eh keiner braucht.

Naja jedenfalls hat die libphorward in letzter Zeit echt ziemlich krasse Sprünge gemacht, und mausert sich von der “Phorward Foundation Library” zum “Phorward Toolkit”. Eine universelle C-Bibliothek, die vor allem die Features

  • Erweiterte Datenstrukturen (parray, plist)
  • Erweiterte Stringfunktionalitäten
  • Reguläre Ausdrücke (pregex, plex)
  • Parser (zzt. ppgram)

unterstützt. Derzeit bin ich daran, die libphorward vor allem eines zu machen: Einfacher! 🙂

Ich bin jetzt auch von den negativen Gedanken bzgl. des Rpa/tk weg, weil ich das eh nicht mehr toppen kann. Daher: Einfachheit, Flexibilität, Features.

Das Resultat kann sich sehen lassen, es geht richtig gut voran momentan. Regex Library überarbeitet, so dass man damit (ENDZIEL!!!) JavaScript-kompatible Regular Expressions bauen kann sowie Lexer.

Das Parser Modul wird jetzt soweit gehackt, bis es sich selbst als Parser compiliere und ausführen kann (bootstrapping!) und dann gucken wir mal was draus wird.

libphorward_2014-11-15In jedem Fall wird das Teil immer geiler. Und das Beste: Der UniCC Parser Generator, der zwar nicht mehr weitergepflegt wird, wird damit immernoch am Leben gehalten. Musste zwar schon viel umbauen aber er lebt weiterhin und compiliert!

Was war heute sonst noch?

  • Die Ruhrcon 7 Reg eröffnet
  • Interstellar geschaut… kein so guter Film. Eigentlich ne coole Story, viel zu viel Amerikanerdreck, Schnulze und Unlogik. Naja nicht nochmal.

Naja. Was solls. Interessiert ja eh keinen, mein Bier ist leer und ich geh jetzt pennen, damit ich morgen ausschlafen kann und dann ab schön nach Hengsen 🙂 (my Graceland!).

 

Got you!

So gehts also. Hätte ich auch mal eher drauf kommen können!

bei input “X+X+X” als Rekursiv Descent Parser:

(1) Probiere alle nicht-linksrekursiven Produktionen aus (e : ‘Y’, e : ‘X’)
(2) Parse tree merken (“X”)
(3) Probiere alle links-rekursiven Produktionen aus (e : e ‘+’ ‘Y’, e : e ‘+’ ‘X’), setze für e vorherigen ParseTree ein (“X+X”)
(4) Probiere alle links-rekursiven Produktionen aus (e : e ‘+’ ‘Y’, e : e ‘+’ ‘X’), setze für vorherigen ParseTree ein (“X+X+X”)
(5) Probiere alle links-rekursiven Produktionen aus (e : e ‘+’ ‘Y’, e : e ‘+’ ‘X’), setze für vorherigen ParseTree ein (“X+X+X”), keine weitere Eingabe vorhanden
(6) Ergebnis: “X+X+X”

Es kann ja so einfach sein. Wieso denke ich so dümmlich kompliziert? Der Martin hat’s jedenfalls genauso gelöst.

Got’ya! Jetzt nur in eigenen Code gießen… 🙂

Das erklärt im übrigen auch normalizeleftrecursion()

Mausbrand Viur / vi

Aside

Tag 3 bei Mausbrand, und sehr zufrieden mit der neuen Stelle: Super Kollegen, tolle Atmosphäre, interessante Software und ein kleines Projekt. Auf dem Rechner läuft Fedora Linux 20 mit Enlightenment sehr stabil… ich glaube das ich bald vielleicht wirklich von Arch Linux weggehen werde, da mir Fedora bisher sehr sympathisch erscheint.

Meine ersten “Schritte” bei Mausbrand sind bisher kleinere Features und Bugfixes im Tool “vi” (sozusagen das Web-basierte Viur Backend), diese kann sogar man auf bitbucket.org verfolgen, da es sich ja um ein Open Source Projekt handelt 🙂 => https://bitbucket.org/viur/vi

normalizeleftrecursion()

…dieser geniale DrecksackTyp!

lrecEinmal mit, einmal ohne. Hier wird die Schleife sichtbar…

Nachtrag… ich kriegs irgendwie nicht hin. Naja, jedenfalls wollte ich ihn nicht beleidigen. Ich ziehe meinen Hut…

 

Learning Python with pain…

… nein, der Titel dieses Posts soll Python nicht schlecht machen, im Gegenteil, es ist ein nettes Wortspiel in diesem Zusammenhang ;).

Um mal ein wenig in die Programmiersprache Python, die bei Mausbrand verwendet wird, reinzukommen, habe ich mir glaube ich das trockendste Thema überhaupt ausgesucht :-D… ich muss aber zu meiner Verteidigung sagen, dass ich der Meinung bin, man kann eine Programmiersprache nur erfolgreich lernen und einsetzen, wenn man damit auch Programme schreibt, die einen konkreten Nutzen haben und mit denen man auch etwas bewirken kann.

Nun, für mein erstes Python-Programm habe ich mir ausgesucht, dass ich für den Verein eine Schnittstelle benötige, um SEPA-Lastschriften automatisiert per Datei bei der Bank einzureichen. Dies wurde in der Vergangenheit immer händisch gemacht und ist ein langweiliger, undankbarer Job.

Das kleine Skript sepa_pain.py implementiert das Nachrichtenformat SEPA-PAIN Version 008-002 des EBICS (Electronic Banking Internet Communication Standard). Ich muss dazu sagen, dass ich einen Großteil der Logik aus einer kleinen PHP-Library geklaut habe, nur ich wollte mich ja erst mal ein wenig mit Python vertraut machen.

Nun hier ist das Programm! Für Augenkrebs und sonstiges übernehme ich keine Haftung. Ich denke auch, dass ich einiges hätte eleganter machen können, das Problem ist nur, das ich mich dazu noch zu wenig mit Python auskenne um solche Tricks zu kennen.

Daher: Quick&Dirty!

Das schöne: Die Dateien, die dieses Skript ausgibt, werden sogar im Online-Banking eingelesen und akzeptiert. Es scheint also weitestgehend valide zu sein.

Allerdings muss man ja schon anmerken, dass sich die Finanzbehörde mit dem namen PAIN mal wieder alle Mühe gegeben hat… es ist wirklich schmerzhaft, diese komischen XML-Tags zu entziffern wie z.B. DtOfSgntr oder DrctDbtTxInf… wunderbar! 🙁

Der Drang nach Perfektion

Momentan bin ich, auch aufgrund meiner beruflichen Situation, mal wieder ziemlich damit beschäftigt, meine alten Ideen von damals mal wieder nach vorne zu bringen.

Es geht vor allem um mein Sorgenkind, was man schon fast als Vaporware bezeichnen könnten… RapidBATCH 6. RapidBATCH ist ein Projekt, welches ich 2001 mit 15 Jahren begonnen habe und was Aufgrund durch eine immense Medienpopularität wahrlich äusserst bekannt geworden ist: Eine einfache Batchsprache mit EXE-Compiler. Programmiert, damals, in QuickBasic. Der Compiler war natürlich eher Fake, es war eher ein Obfuscator, der Code an einen Interpreter, der diesen Code aus sich selbst ließt und dann ausführt, hängt. Aber es hatte den anschein, man hätte einen EXE-Compiler. Selbiges Konzept ging bis zur Version 5.1, die letzte veröffentlichte RapidBATCH-Version einher.

Nach dem Release der (leider immer noch aktuellen) Version 5.1 und meiner damaligen privaten Situation (die nicht sehr rosig war) habe ich mich sehr viel mit dem Thema Compilerbau beschäftigt. Das hat aber dann immer mehr dazu geführt, dass die Ideen von damals immer mehr in Frage gestellt wurden… es musste immer besser werden… was auch der Grund ist warum es kein RapidBATCH 5.2 gab, welches sogar in seiner damaligen Beta-Version einen echten Rekursiv-Descent Parser mit sich brachte. Aber es war mir zu heikel, dass damals weiter zu machen… RapidBATCH 6 wurde prototypsiert… und immer weiterentwickelt.  Bis hin zu einer wahrlich soliden Basis. Aber sie war mir nicht *perfekt* genug. Ich könnte mir eigentlich sowas von in den Arsch treten damals diese Entscheidung getroffen zu haben. Die Sourcen davon habe ich alle noch, aber sie sind sowas von inkompatibel mit der aktuellen libphorward, welche schon damals in Teilen existierte… man kann sie nicht einfach mal umbiegen und alles läuft so wie vorher.

So ein Scheiß… RapidBATCH 6 war vollends prototypisiert… es hatte einen sogar opimierenden Compiler, basierte vollständig auf einer stack-basierten Virtual Machine namens Phosphor, implementierte bereits eine Basis-Version (konsolenbasiert) der urspünglichen Version 5.1 mit zusätzlichen Features der Version 6

  • Ein ECHTER Compiler!
  • Verschachtelte Funktionsaufrufe
  • Neue Schleifen WHILE…WEND und EACH…IN…NEXT
  • Assioziative Arrays

Ich hatte Klaus F. und Andi H. im Boot… die wären mitgegangen… ich hab es vergeigt.

Bitte…hier… seht euch diese geilen Screenshots an… es ist unglaublich, was das Ding damals konnte… ein geniales Stück Software, doch geschrieben für die Katz.

snapshot4 snapshot5 snapshot6 snapshot7arrays Und nur eine Auswahl der damaligen Demo-Programme, die bereits FUNKTIONIERTEN….

und

…verdammt, ich könnte kotzen, wenn ich dran denke, das alles in die Tonne gepfeffert zu haben. Scheiss Drang zur Perfektion. Scheiss Entscheidung. Alles für’n ARSCH. SCHEISSE!!!

Was hab ich davon heute? UniCC… ein Parser Generator den kein Schwein braucht und der völlig überladen ist. Aber es musste sein. Sowas wie ein Ziel, das erreicht werden muss und keinen Sinn macht. Jetzt bastel ich mir wieder einen zurecht und baue die libphorward zum Multi-Paradigma Parser Generator mit verdammten Features die keine Sau jemals nutzen wird… und dann diese leeren Versprechungen… RapidbATCH 6, die Vaporware, die Niemals kommt… NEIN. Ich will das verdammt nochmal nicht mehr.

Ich wünschte, ich könnte die Zeit zurückdrehen, nach 2008, und mir selbst in den Arsch treten, diesen Weg beschritten zu haben. RapidBATCH hatte seine Chance und ich habe sie vollends in den Sand gesetzt. Alles mir zu verdanken, einem Volldeppen, der mit seiner Perfektion nicht zurecht kam.

Tja, was haben wir heute. Einen haufen Sourcecode, der nicht übersetzbar ist. Nicht ohne massive Anpassung.

  • phosphor, die Virtual Machine
  • rb6core, der RapidBATCH 6 Sprachkern mit Compiler
  • rb6, die RapidBATCH 6 Sprachlibrary mit den Funktionen

Alles nicht mehr übersetzbar. Zu viel zu ändern. Zu viele Ansätze, es besser zu machen.

Ich muss eigentlich nochmal von vorn anfangen, und dann das beste in einem ganzheitlichen Projekt zusammenfassen.. aber selbst das rede ich schon seit Jahren. Immer wieder diese Versuche.

Nur wenn, dann alles als freie Software. Ich glaube, dass RapidBATCH nur so eine Chance hat, weiter zu leben, und vielleicht doch noch mal Anklang in der seit Jahren treuen Community zu bekommen. Die es trägt und was draus macht. Einen anderen Weg gibt es nicht. Und einen anderen Weg will ich auch nicht.

Seit einigen Jahren dümpelt in meinem Sourceverzeichnis auch noch das Verzeichnis rapidbatch rum. Ein Ansatz, das alles unter ein neues Dach, basierend auf libphorward und UniCC, zu bringen. Bisher nicht sehr viel Inhalt. Nur lose Module, ohne wirklichen Zweck und Zusammenhang. Hier mal eine Graphik, da mal ein fetzen Code.

Es muss weiter gehen. Es MUSS.

Ab morgen hab ich den Rest der Woche Urlaub. Möchte das gute Wetter nutzen und fliegen gehen. Und wer weiß… vielleicht schraubt sich diese Tage doch mal ein Entschluss zusammen, der RapidBATCH doch noch dahin bringt, wo es einst in einem Prototypen auf einem sehr gutem Wege war… es wird Zeit… es muss Zeit werden. Es MUSS.