解析和检查 Haskell 代码的库?

2024-01-09

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

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

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

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


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

  • Haskell-src http://hackage.haskell.org/package/haskell-src
  • or Haskell-src-exts http://hackage.haskell.org/package/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 http://www.haskell.org/haskellwiki/GHC/As_a_library它还可以让您检查解析的代码,或者只是运行ghc -c在你的档案上。

对于解析C代码,有c语言 http://hackage.haskell.org/package/language-c.

如果您需要解析其他语言,请查看this http://hackage.haskell.org/packages/archive/pkg-list.html#cat%3alanguageHackage 上的类别。例如,这里是S 表达式的解析器 http://hackage.haskell.org/package/lispparser.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析和检查 Haskell 代码的库? 的相关文章

随机推荐

  • 如何使用java正则表达式捕获带括号的组

    我有一些像这样的字符串 a b c d 并希望使用 java 正则表达式捕获带括号的组 我以为这个简单的正则表达式 Pattern p Pattern compile Pattern DOTALL 会做这项工作 但它没有 这有什么问题吗 不
  • 将 php curl 转换为 GAE urlfetch 以用于 iTunes InApp verifyReceipt

    有人可以帮忙将此 PHP Curl 转换为 UrlFetch 吗 这用于 Apple iTunes verifyReceipt if getiTunesProductionLevel app id sandbox sandbox overr
  • Android 设备上的输入失去焦点

    我在 Android 设备上遇到输入焦点问题 我为移动设备制作了一个画布外菜单 在此菜单中我有一个搜索输入 问题是 在android上 当我点击输入时 它会聚焦 然后键盘出现 然后输入失去焦点 键盘消失 我读到我可能必须更改清单元素中的 w
  • 基于循环内背景颜色变量的条件CSS

    我意识到这是一个与此类似的问题基于背景颜色变量的条件CSS https stackoverflow com questions 21600825 conditional css based on background color varia
  • 为什么 C# 编译器从这段代码创建 PrivateImplementationDetails ?

    我发现下面的代码 public static class MimeHelper public static string GetMimeType string strFileName string retval switch System
  • 以与 python2 和 python3 兼容的方式将字节写入标准输出

    我想要一个返回文件对象的函数 用它我可以将二进制数据写入标准输出 在Python2中sys stdout就是这样一个物体 在python3中是sys stdout buffer 检索此类对象以使其适用于 python2 和 python3
  • 使用 GPUImage 实时过滤视图

    我正在尝试使用 GPUImage 来过滤视图 因为它以一种 iOS 7 样式覆盖更新 为此 我在 NSTimer 上运行以下代码 但是我的 NSLog 显示 self backgroundUIImage imageFromCurrently
  • ListView BaseAdapter 中的 EditText 奇怪行为

    我有一个 ListView 使用填充BaseAdapter 在列表视图项中有一个数字 EditText
  • Angular 2:{{object}} 有效,{{object.child}} 抛出错误

    使用 Angular v1 已有一段时间了 自从 Angular v2 推出 Beta 版以来 我一直在研究它 现在我已经有了这段代码 但无法让它工作 真的不知道为什么 不知何故 当我打印时 profileUser json 一切正常 pr
  • 将 C++ 库与 Objective-C 应用程序链接和使用

    我正在编写一个图形应用程序 使用 Objective C 作为前端 使用 C 进行图形处理和网络通信 我在苹果网站上四处阅读 寻找一种方法来链接 dylib or so将我的 C 代码添加到我的 Xcode 项目中 但似乎没有任何效果 我能
  • 有时 GET 返回 304 而不是 200

    我正在使用 Node js 和 mongodb 我似乎有时会收到 200 有时会收到未修改的 304 router get add to bag id req res next gt req session bag push req par
  • Java JTable 更新行

    我正在创建一个像这样的 JTable String colName new String ID Country Name Page titel Page URL Time Object products new Object 123 USA
  • 为什么 PhoneGap 总是显示默认的启动画面图像?

    我现在正在测试一个示例 iOS 应用程序 尽管我在 Xcode 项目目标屏幕的 摘要 选项卡 中设置了所有新的启动图像 但 PhoneGap 3 0 仍然显示其默认启动屏幕 为什么 即使闪屏是一个插件并且现在默认情况下不包含在 PhoneG
  • 使用 WebFlux 从资源中读取和解析文件的反应方式?

    我想知道从资源中读取 解析和提供文件的正确方法是什么 目前 我做了这样的事情 fun getFile request ServerRequest Mono
  • Android HttpsUrlConnection eofException

    我有一个问题 当我尝试读取任何输入时 我的 HttpsURLConnection 将抛出 EOFException 该代码适用于某些网络调用 但不适用于其他网络调用 如果我尝试从连接中读取任何内容 则会失败并出现上述错误 Example u
  • RXJS中异步流是如何传输的?

    我试图了解流是如何通过 RXjs 中的管道传输的 我知道这不应该成为一个问题 因为这就是异步流的整个想法 但仍然有一些我想理解的事情 看这段代码 var source Rx Observable range 1 3 flatMapLates
  • 如何在 Visual Studio 中启用 CUDA 项目的单独编译

    我是 CUDA 新手 我正在尝试编写一个应用程序 在其中从另一个内核函数调用一个内核函数 但我收到错误 内核启动自device or global函数需要单独的编译模式 在构建应用程序时 这是我的完整代码 任何帮助 将不胜感激 includ
  • 手风琴与 for 循环一次仅打开一项

    我正在尝试向我的手风琴添加一个交互式 id 但是我的代码中出现了一些问题 手风琴会打开每个手风琴项目 我想要的只是在单击它时能够一次打开一个手风琴项目 for study in studies div class accordion div
  • 什么是 Swift.AnyClass?

    我正在调查UITableView类 我发现 open func register cellClass Swift AnyClass forCellReuseIdentifier identifier String Reading here
  • 解析和检查 Haskell 代码的库?

    hackage中是否有任何库可以解析haskell代码并检查它是否是有效代码 我愿意尝试一下进化模型 我想检查生成的代码字符串是否可以编译 而无需将它们写入磁盘并运行编译器 理想情况下 如果也能够在字符串中运行代码就好了 但只检查代码的有效