2011-06-02 69 views
13

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

我愿意打了一下与进化模型,我想检查的代码生成字符串将编译而不必将它们写入磁盘并运行编译器。

理想情况下,能够在字符串中运行代码也很好,但只能检查代码的有效性。

如果你知道关于检查其他语言(LISP,C,...),这将是很好过的解析器库(在Haskell)。

+1

请参阅http://stackoverflow.com/questions/6065951/parsing-haskell-preserving-comments-formatting – 2011-06-02 01:18:26

+2

有一个明显的观点 - “首先不要生成语法错误的程序”。 Haskell中有许多EDSL遵循这个格言。即使对于遗传编程,您也应该能够生成有效的代码。 – 2011-06-02 06:52:38

+1

@stephen tetley嗨。我有一个特定的原因允许错误的程序。我对使用遗传编程生成解决特定问题的程序不感兴趣,但我对代码字符串的演变感兴趣。我只想看看我是否可以编写一个适应函数,使得语法上正确的程序能够从自我复制的随机字符串群发展而来。这不是一个CS问题,但也许是理论上的生物学问题。这似乎不太可能,但我想试试。 :) – 2011-06-02 12:38:36

回答

14

为了解析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类别上Hackage。例如,这里是a parser for S-expressions

+1

另请参阅[提示](http://hackage.haskell.org/package/hint),以获取更简单的方法来连接到GHC API。 – luqui 2011-06-02 01:42:55

+0

太棒了!谢谢!! – 2011-06-02 11:56:43

+0

您提到了language-c。你知道这个包的文档/示例代码的好来源吗? – 2016-04-03 02:59:27