2012-09-18 12 views
6

Als Übung, um Haskell zu lernen (und mich zu quälen), überlege ich, einen konfigurierbaren Haskell Code-Beautifier zu schreiben.Haskell Parser zu AST

Es eine Konfigurationsdatei in JSON oder YAML (oder etwas besser?) Geschrieben unterstützen wird, die Entscheidungen wie das Sortieren Importe, Sortierung/Gruppierung data und class Aussagen, die Anzahl der Linien zwischen den Abschnitten usw.

Ich bin spezifiziert Suchen nach einem Parser für Haskell 98, der einen abstrakten Syntaxbaum (AST) generiert und behält Kommentare bei. Das Parsen von GHC mit seinen Spracherweiterungen ist ein Bonus.

In Ermangelung einer solchen Sache, ich denke, ich kann einen rekursiven Abstieg Parser oder einen mit Parsec oder einen Parser-Generator schreiben. Vielleicht mein eigenes rollen wird das Lernen (und Folter :-)) erhöhen.

Gibt es unter einer der Open-Source-Lizenzen einen vollständigen Haskell-> AST-Parser? Wenn ich bei diesem Projekt Fortschritte mache, werde ich es auf Github setzen.

+0

Eines meiner Haustier ärgert ist hässlicher Code. Der größte Teil meiner Arbeit ist in Java und es erstaunt mich, wie Leute Code ohne Klammerausrichtung, inkonsistenten Abständen um Operatoren usw. einchecken können. Lesen sie nicht ihren eigenen Code? Stört es sie nicht? Vielleicht ist es mein OCD. Wie auch immer, ich stimme zu, dass Out-of-Box Haskell um ein Vielfaches schöner aussieht. Aber ich möchte immer noch eine Verschönerung schreiben :-). – Ralph

+0

Ja. Ich habe wirklich Spaß gemacht, weil ich die Art von Dingen mag, die du vorschlägst. Warum nicht haskell selbst für die Sprache der Konfigurationsdatei verwenden? Ich bin sicher, dass ich gelesen habe, dass jemand seine domänenspezifische Sprache für config weiterentwickelt hat, bis sie feststellten, dass sie nur Haskell haben wollten, aber [this] (http://www.jmreardon.com/posts/2011-07-17-typesafe-config -in-haskell.html) ist das nächste, was ich finden konnte. Oder Sie könnten das Paket [ConfigFile] (http://hackage.haskell.org/package/ConfigFile) verwenden. – AndrewC

Antwort

16

Im Paket haskell-src-exts ist ein Parser verfügbar. Der Parser analysiert nicht nur die meisten GHC-Erweiterungen. Es erkennt auch allgemeine Erweiterungen wie syntaktische XML-Literale und so weiter. Sie sollten die parseModuleWithComments Funktion verwenden, wenn Sie auch Zugriff auf Kommentarinformationen erhalten möchten.

Beachten Sie jedoch, dass die Kommentare nicht im tatsächlichen Syntaxbaum gespeichert werden. Sie werden als separate Liste von Kommentaren mit Standortinformationen gespeichert. Es sollte eher trivial sein, die Kommentare in den Baum aufzunehmen, wenn Sie sie wirklich dort haben müssen, indem Sie den Baum mit der Liste unter Verwendung eines linearen Verschmelzungsalgorithmus zusammenführen (beide Sequenzen können als "sortiert" betrachtet werden). Die Kommentare können sogar zusammen mit zugehörigen AST-Knoten gespeichert werden, da "annotierte" ASTs beliebige Metadaten in jedem Knoten enthalten können (standardmäßig nur SrcSpanInfo). Der Grund, warum dies im tatsächlichen haskell-src-exts-Paket nicht getan wurde, liegt vermutlich daran, dass der AST-Parser vor dem Kommentarparser geschrieben wurde.

2

Ich habe ein super einfaches Tool geschrieben, das Haskell Code automatisch formatiert. Dies geschieht durch Verwendung der Parsing- und hübschen Druckfunktionen von haskell-src-exts. Sie finden es unter https://github.com/djv/small/blob/master/tidy.hs. Es könnte ein Start für etwas flexibler und leistungsfähiger sein.