【问题标题】:Library to parse and check Haskell code?解析和检查 Haskell 代码的库?
【发布时间】:2011-09-06 17:55:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • 有一点很明显——“首先不要生成语法错误的程序”。 Haskell 中有很多 EDSL 的例子都遵循这个格言。即使是基因编程,您也应该能够生成有效代码。
  • @stephen tetley 嗨。我有特定的理由允许不正确的程序。我对使用遗传编程生成程序来解决特定问题不感兴趣,但我对代码字符串的演变感兴趣。我只是想看看我是否可以编写一个适应度函数,它允许一个语法正确的程序从一群自我复制的随机字符串中进化而来。这不是 CS 问题,而可能是理论生物学问题。这似乎不太可能,但我还是想试试。 :)

标签: parsing haskell code-generation


【解决方案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 [])])

因此,对于您的特定用例,最好使用GHC API,它还可以让您对已解析的代码进行类型检查,或者只对您的文件运行ghc -c

用于解析C代码,有language-c

如果您需要解析其他语言,请查看 Hackage 上的 this 类别。例如,这里是a parser for S-expressions

【讨论】:

  • 另请参阅hint,以更轻松地连接 GHC API。
  • 你提到了语言-c。你知道这个包的任何好的文档/示例代码来源吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
相关资源
最近更新 更多