parsing - 解析和检查 Haskell 代码的库?

标签 parsing haskell code-generation

hackage中是否有任何库可以解析haskell代码并检查它是否是有效代码?

我愿意尝试一下进化模型,我想检查生成的代码字符串是否可以编译,而无需将它们写入磁盘并运行编译器。

理想情况下,也可以在字符串中运行代码,但只检查代码的有效性就可以了。

如果您了解检查其他语言(lisp、C、...)的解析器库(在 haskell 中),那也很好。

最佳答案

要解析 Haskell 代码,您可以使用

  • haskell-src
  • haskell-src-exts

  • 后者处理所有 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/

    相关文章:

    java - 字符串 "--"是不允许的,java 项目

    javascript - 使用 Javascript 解析自定义标签

    java - 线程 "main"org.pdfclown.util.parsers.ParseException : 'name' table does NOT exist 中的异常

    visual-studio-2010 - T4 "Compiling transformation: An assembly with the same identity ' ' has already been imported. Try removing one of the duplicate references."?

    使用 Sethi-Ullman 算法的表达式代码生成器

    java - 扩展 Java 语法(卫生宏)的最简单方法是什么

    python - 从文件python解析结构化数据

    haskell - 理解 `bind` 的 `newtype Prob`

    dll - Haskell编译dll

    haskell - 列表的 writer monad 的效率如何?