hackage中是否有任何库可以解析haskell代码并检查它是否是有效代码?
我愿意尝试一下进化模型,我想检查生成的代码字符串是否可以编译,而无需将它们写入磁盘并运行编译器。
理想情况下,也可以在字符串中运行代码,但只检查代码的有效性就可以了。
如果您了解检查其他语言(lisp、C、...)的解析器库(在 haskell 中),那也很好。
最佳答案
要解析 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 .
如果您需要解析其他语言,请查看 this关于黑客的类别。例如,这里是 a parser for S-expressions .
关于parsing - 解析和检查 Haskell 代码的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6209283/