ydTextToPHP-Tool leicht verbessert
Beim Einbauen der Fehlerbehandlung ins ydForum war ich wieder einmal übers ydTextToPHP-Tool gestolpert, weshalb ich das Tool leicht verbessert habe.
ydTextToPHP ist zwar zum einem praktisch, da es speziell die
Generierung der Doks erleichtert, weil es aber kein richtiger
Parser ist, sondern mit preg_match() arbeitet, macht es
laufend Probleme. Um dies zu lösen habe ich in den letzten
Tagen ausprobiert mit
phpJay (YACC für PHP)
eine bessere Lösung zu schreiben.
Handgeschriebener Lexer
Weil phpLex ein C#-Programm ist und ich hier weder .NET noch
Mono installiert habe, ist der Lexer handgeschrieben. Ist schnell
gemacht und im Gegensatz zu einem handgeschriebenem Parser bliebt
ein Lexer auf Dauer gut lesbar.
Möglichst einfach oder so ähnlich
Um möglichst schnell was einsetzbares zu haben sollte der Parser
möglichst einfach sein. Sprich nicht den gesamten Quelltext 'verstehen',
sondern sich auf das wichtigste beschränken. Andererseits enthalten
die .ytp-Quelltexte Bereiche in denen die Formatierung von
Bedeutung ist und reiner Text steht, der direkt
als Dokumentation übernommen werden muss. Um das zu erreichen arbeitet
der Lexer ein wenig kontextspezifisch und erkennt welche Bereiche
er als Token und welche als Text zurückgeben muss. Für die Texte werden
TOKEN_TEXT_LINE und TOKEN_TEXT_INDENT für
einzeiligen und mehrzeiligen, eingerückten Text zurückgegeben.
Syntax-Baum oder Array?
Als nächstes hatte ich dann probiert, die Eingabe in Form eines
PHP-Arrays oder eines Syntax-Baums für die nachfolgende Codegenerierung
zu speichern. Im Moment ist es in dieser Kombination implementiert.
Die Dokumentations-Bereiche werden in Arrays und der Quelltext in
einem Syntax-Baum abgelegt.
Erst mal nur der Lexer
Das Ganze nun zu komplettieren, um es benutzen zu können, dürfte
noch so drei Tage dauern. Um nun erst mal wieder am Forum weitermachen
zu können, habe ich zunächst die alte Version von ydTextToPHP aufgebohrt
und dort den Lexer eingebaut. Der gibt nicht nur die Tokens zurück,
sondern zugleich den dazugehörigen Quelltextabschnitt im unveränderten
Original. Das wird nun dazu genutzt, um fast den gesamten Quelltext
unverändert durchzuschleifen und nur die ydNotice()-,
ydWarning()- und
ydError()-Makros zu erkennen und umzuwandeln. Womit das
Ausgangsproblem einigermaßen gelöst ist.
Parser später
Der Rest wird dann früher oder später für eine komplette Parserlösung
des Tools eingesetzt werden, welche zudem eine weiterentwickelte
Syntax benutzen wird. Die jetzige ist auf preg_match()
ausgelegt - mit dem echten Parser sind ein paar Sachen eleganter umzusetzen.
