Библиотека для анализа и проверки кода Haskell?

Есть ли какая-либо библиотека в хаке, которая может анализировать код haskell и проверять, является ли он действительным кодом или нет?

Я готов немного поработать с эволюционной моделью, и хочу проверить, не сгенерированы ли строки кода, не записывая их на диск и не запуская компилятор.

В идеале было бы неплохо иметь возможность запускать код в строках, но только проверка правильности кода в порядке.

Если вы знаете о библиотеках парсеров (в haskell), которые проверяют другие языки (lisp, C,...), было бы неплохо.

Ответ 1

Для разбора кода 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 [])])

Итак, для вашего конкретного случая использования, вероятно, лучше использовать API GHC, который также позволяет вам анализировать код с проверкой typecheck или просто запустить ghc -c в вашем файле.

Для разбора кода C существует language-c.

Если вам нужно проанализировать какой-либо другой язык, взгляните на эту категорию на Hackage. Например, здесь синтаксический анализатор для S-выражений.