2012-02-22 22 views
7

Estoy tratando de reformatear/reimprimir el código fuente de haskell (eliminar/agregar espacios en blanco, saltos de línea, cambiar el estilo de inserción ...). Encontré el paquete haskell-src-exts que puede analizar e imprimir bastante el código fuente de haskell.Código fuente de haskell con bastante impresión con comentarios

Usando la función parseFileWithComments :: ParseMode -> FilePath -> IO (ParseResult (Module, [Comment])) También recibo los comentarios incluidos en el código fuente. Ahora quiero imprimir el Módulo/AST con los comentarios en las posiciones originales, pero no puedo encontrar una función que lo haga. Solo puedo imprimir bastante el AST. ¿Tengo que implementar la impresión del AST más los comentarios yo mismo o ya existe esa biblioteca?

Para aclarar consideran siguiente ejemplo:

A.hs archivo:

module A (fn1) where 

-- | Haddock-comment 
fn1 :: 
    String -> 
    String 
fn1 _ = "" -- another comment 

En ghci, escribiendo

Prelude Control.Monad.Reader Language.Haskell.Exts> (liftM prettyPrint) $ (liftM fst) $ (liftM fromParseResult) $ parseFileWithComments defaultParseMode "A.hs"` 

imprime el código fuente del módulo (sin los comentarios, por supuesto) . Puedo usar cualquier función prettyPrint para modificar el formato del código fuente.

Ahora quiero ser capaz de hacer algo como esto:

do 
    (ast, comments) <- fromParseResult $ parseFileWithComments defaultParseMode "A.hs" 
    prettyPrintWithComments ast comments 

para obtener una versión bastante impresa del archivo original, incluyendo los comentarios.

Respuesta

4

Utilice las versiones Annotated de los módulos, p. Language.Haskell.Exts.Annotated contra Language.Haskell.Exts.

+0

Eso es bastante útil, pero no es exactamente lo que quería. Todavía quiero ser capaz de reformatear el código fuente real con un bonito estilo de impresión 'Style' y' PPHsMode'. – haja

+0

@haja: ¿por qué no? Sigue siendo una instancia de la clase 'Pretty' de haskell-src-ext ... – ivanm

+0

pero, de nuevo, ¿cómo pueden incluirse los comentarios originales en la salida de impresión bonita? No puedo encontrar una función que imprima muy bien los comentarios _including_. – haja

2

Dependiendo del tipo de impresión bonita que desee hacer, le recomendamos echar un vistazo al paquete hscolour, que se utiliza para colorear el código fuente de Haskell en varios formatos de salida.

En particular, el módulo Language.Haskell.HsColour.Classify contiene un tokenizador Haskell que conserva el espacio en blanco y los comentarios, lo que podría servir como un buen punto de partida.

+0

gracias, pero no estoy buscando este tipo de impresión bonita. Actualicé mi pregunta para aclarar qué tipo de impresión bonita quiero. – haja

Cuestiones relacionadas