2012-09-18 19 views
6

Come esercizio per imparare Haskell (e torturare me stesso), sto pensando di scrivere un abbellitore di codice Haskell configurabile.parser Haskell su AST

Esso sosterrà un file di configurazione scritto in JSON o YAML (o qualcosa di meglio?) Che specifica le scelte come l'ordinamento delle importazioni, l'ordinamento/raggruppamento data e class dichiarazioni, numero di linee tra le sezioni, ecc

Sono cercare un parser per Haskell 98 che genera un albero sintassi astratto (AST) e conserva i commenti. Parsing GHC, con le sue estensioni linguistiche, sarà un bonus.

In assenza di una cosa del genere, credo di poter scrivere un parser ricorsivo-discendente o uno che utilizza Parsec o un generatore di parser. Forse rotolare il mio aumenterà l'apprendimento (e la tortura :-)).

Esiste un parser Haskell-> AST completo disponibile con una delle licenze open source? Se faccio qualche progresso su questo progetto, lo metto su Github.

+0

Uno dei miei animaletti è un brutto codice. La maggior parte del mio lavoro è in Java e mi sorprende sapere come le persone possono controllare il codice senza allineamento del tutore, spaziatura incoerente attorno agli operatori, ecc. Non leggono il loro codice? Non li infastidisce? Forse è il mio OCD. Ad ogni modo, sono d'accordo sul fatto che Haskell fuori dagli schemi è un ordine di grandezza più bello. Ma voglio ancora scrivere un abbellitore :-). – Ralph

+0

Sì. Stavo davvero scherzando, perché mi piace il genere di cose che stai suggerendo. Perché non usare haskell per la lingua del file di configurazione? Sono sicuro di aver letto di qualcuno che sta gradualmente evolvendo il proprio linguaggio specifico per la configurazione fino a quando non si sono resi conto che volevano semplicemente haskell, ma [questo] (http://www.jmreardon.com/posts/2011-07-17-typesafe-config -in-haskell.html) è il più vicino che ho trovato. Oppure puoi usare il pacchetto [ConfigFile] (http://hackage.haskell.org/package/ConfigFile). – AndrewC

risposta

16

C'è un parser disponibile nel pacchetto haskell-src-exts. Il parser non solo analizza la maggior parte delle estensioni GHC; riconosce anche le estensioni comuni come i letterali XML sintattici e così via. È necessario utilizzare la funzione parseModuleWithComments se si desidera anche accedere alle informazioni sui commenti.

Nota, tuttavia, che i commenti non sono memorizzati nell'albero di sintassi effettivo; sono memorizzati come un elenco separato di commenti con informazioni sulla posizione. Dovrebbe essere piuttosto banale includere i commenti nell'albero, se è davvero necessario averli lì, unendo l'albero alla lista usando un algoritmo di fusione lineare (entrambe le sequenze possono essere considerate "ordinate"). I commenti possono anche essere archiviati insieme ai nodi AST associati, poiché gli AST "annotati" possono contenere metadati arbitrari in ciascun nodo (per impostazione predefinita, solo SrcSpanInfo). Il motivo per cui questo non è stato fatto nel pacchetto haskell-src-exts effettivo è presumibilmente perché il parser AST è stato scritto prima del parser dei commenti.

2

Ho scritto uno strumento super semplice che autoforma il codice Haskell. Lo fa usando le funzioni di parsing e pretty printing da haskell-src-exts. Puoi trovarlo allo https://github.com/djv/small/blob/master/tidy.hs. Potrebbe essere un inizio per qualcosa di più flessibile e potente.