Is there any library in hackage that can parse haskell code and check if it is valid code or not?
I\'m willing to play a bit with an evolutionary model and I want to che
For parsing Haskell code, you can use either
The latter handles all of the GHC extensions (and then some), while the former parses only Haskell 98. Here's an example of usage:
Prelude> import Language.Haskell.Exts.Parser
Prelude Language.Haskell.Exts.Parser> parseModule "main = putStrLn \"Hello\""
ParseOk (Module (SrcLoc {srcFilename = ".hs", srcLine = 1, srcColumn = 1}) (ModuleName "Main") [] Nothing (Just [EVar (UnQual (Ident "main"))]) [] [PatBind (SrcLoc {srcFilename = ".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 = ".hs", srcLine = 1, srcColumn = 25}) "TemplateHaskell is not enabled"
Note that even if the code parses correctly, it doesn't mean it will typecheck:
Prelude Language.Haskell.Exts.Parser> parseModule "main = putStrLn2 \"Hello\""
ParseOk (Module (SrcLoc {srcFilename = ".hs", srcLine = 1, srcColumn = 1}) (ModuleName "Main") [] Nothing (Just [EVar (UnQual (Ident "main"))]) [] [PatBind (SrcLoc {srcFilename = ".hs", srcLine = 1, srcColumn = 1}) (PVar (Ident "main")) Nothing (UnGuardedRhs (App (Var (UnQual (Ident "putStrLn2"))) (Lit (String "Hello")))) (BDecls [])])
So for your specific use case, it is probably better to use GHC API which also lets you typecheck parsed code, or just run ghc -c
on your file.
For parsing C code, there is language-c.
If you need to parse some other language, take a look at this category on Hackage. For example, here's a parser for S-expressions.