2011-06-02 17 views
13

¿Hay alguna biblioteca en hackage que pueda analizar código haskell y verificar si es código válido o no?Biblioteca para analizar y verificar el código Haskell?

Estoy dispuesto a jugar un poco con un modelo evolutivo y quiero comprobar si las cadenas producidas de código se compilarán sin tener que escribirlas en el disco y ejecutar el compilador.

Idealmente, sería bueno poder ejecutar el código en las cadenas también, pero solo se puede verificar la validez del código.

Si conoce las librerías de analizadores (en haskell) que buscan otros idiomas (ceceo, C, ...) también sería bueno.

+1

Ver http://stackoverflow.com/questions/6065951/parsing-haskell-preserving-comments-formatting –

+2

Hay un punto obvio: "no generar programas sintácticamente incorrectos en primer lugar". Hay muchos ejemplos de EDSL en Haskell que siguen este dictum. Incluso para la programación genética, debe poder generar código válido. –

+1

@stephen tetley Hola. Tengo una razón específica para permitir programas incorrectos. No estoy interesado en usar programación genética para generar programas para resolver un problema específico, pero estoy interesado en la evolución de las cadenas de códigos. Solo quiero ver si puedo escribir una función de aptitud que permita que un programa sintácticamente correcto evolucione a partir de una población de cadenas aleatorias autorreplicantes. No es un problema de CS, pero tal vez un problema de biología teórica. Parece muy poco probable, pero quiero intentarlo de todos modos. :) –

Respuesta

14

Para analizar el código Haskell, puede utilizar cualquiera

Este último se encarga de todas las extensiones de GHC (y algo más), mientras que los primeros análisis sintácticos solamente Haskell 98. Aquí hay un ejemplo de uso:

Prelude> import Language.Haskell.Exts.Parser 

Prelude Language.Haskell.Exts.Parser> parseModule "main = putStrLn \"Hello\"" 
ParseOk (Module (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 1, srcColumn = 1}) (ModuleName "Main") [] Nothing (Just [EVar (UnQual (Ident "main"))]) [] [PatBind (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 1, srcColumn = 1}) (PVar (Ident "main")) Nothing (UnGuardedRhs (App (Var (UnQual (Ident "putStrLn"))) (Lit (String "Hello")))) (BDecls [])]) 

Prelude Language.Haskell.Exts.Parser> parseModule "main == putStrLn \"Hello\"" 
ParseFailed (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 1, srcColumn = 25}) "TemplateHaskell is not enabled" 

Tenga en cuenta que incluso si el código analiza correctamente, esto no significa que vaya a typecheck:

Prelude Language.Haskell.Exts.Parser> parseModule "main = putStrLn2 \"Hello\"" 
ParseOk (Module (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 1, srcColumn = 1}) (ModuleName "Main") [] Nothing (Just [EVar (UnQual (Ident "main"))]) [] [PatBind (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 1, srcColumn = 1}) (PVar (Ident "main")) Nothing (UnGuardedRhs (App (Var (UnQual (Ident "putStrLn2"))) (Lit (String "Hello")))) (BDecls [])]) 

Así que para su caso de uso específico, es probable que sea mejor utilizar GHC API que también le permite typecheck código analizado, o simplemente Ejecute ghc -c en su archivo.

Para analizar el código C, hay language-c.

Si necesita analizar algún otro idioma, eche un vistazo a la categoría this en Hackage. Por ejemplo, aquí está a parser for S-expressions.

+1

Vea también [sugerencia] (http://hackage.haskell.org/package/hint) para una forma más fácil de enganchar en la API de GHC. – luqui

+0

¡Genial! ¡¡Gracias!! –

+0

Has mencionado el idioma-c. ¿Conoces alguna buena fuente de documentación/código de ejemplo para este paquete? –

Cuestiones relacionadas