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.
Ver http://stackoverflow.com/questions/6065951/parsing-haskell-preserving-comments-formatting –
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. –
@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. :) –