Для анализа кода на Haskell вы можете использовать
Последний обрабатывает все расширения GHC (а затем и некоторые), тогда как первый обрабатывает только Haskell 98. Вот пример использования:
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"
Обратите внимание, что даже если кодправильно анализирует, это не значит, что он будет проверять:
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 [])])
Так что для вашего конкретного случая использования, вероятно, лучше использовать GHC API , который также позволяет проверять анализируемый код,или просто запустите ghc -c
для вашего файла.
Для анализа кода C есть language-c .
Если вам нужно проанализировать какой-либо другой язык, возьмитепосмотрите на эту категорию на Hackage.Например, вот парсер для S-выражений .