Библиотека для анализа и проверки кода на Haskell? - PullRequest
13 голосов
/ 02 июня 2011

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

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

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

1 Ответ

15 голосов
/ 02 июня 2011

Для анализа кода на 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-выражений .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...