加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

有什么功能语言的LL解析器生成器,如Haskell或Scala?

发布时间:2020-12-16 09:37:31 所属栏目:安全 来源:网络整理
导读:我注意到在功能语言中创建解析器的LL解析器的缺乏。对于我一直在寻找没有成功的理想的寻找是为ANTLR风格的LL(*)语法(模式小格式化语法)生成一个Haskell解析器,并且令人惊讶的是,每个最后的解析器生成器具有功能我发现的语言目标是某种LR解析器。 我想转换
我注意到在功能语言中创建解析器的LL解析器的缺乏。对于我一直在寻找没有成功的理想的寻找是为ANTLR风格的LL(*)语法(模式小格式化语法)生成一个Haskell解析器,并且令人惊讶的是,每个最后的解析器生成器具有功能我发现的语言目标是某种LR解析器。

我想转换我正在使用的这种语言的解析器,它具有ANTLR的功能特性,以语言本身的自主主机,如果我可以使用另一种功能语言几乎可以正确地使用我的语言,这将有很大的帮助(最好是我熟悉的,Haskell和Scala),而不是完全从头开始重写它,尽管最终我可能会这样做,因为核心语言很小。

在这一点上,甚至不止一个解决方案,我非常好奇为什么没有这样的LL(*)甚至LL(k)解析器生成器,但是许多LR发生器,因为LL似乎更容易。

解决方法

这样做的主要原因是大多数用功能语言编写的LL(k)解析器只是使用解析器组合器实现的,因为生成解析器组合器库的最简单的路径是 recursive descent。

Haskell的parsec,attoparsec和polyparse和Scala的库存解析器组合器都生成了有效的LL(*)解析器。

parsec和attoparsec都要求您使用明确的尝试组合器来获得回溯,但这只是为了提高效率,而scala parser combinators也可以处理packrat parsing。

考虑以下片段从布兰特Yorgey最近unbound包announcement:

parseAtom = parens parseTerm
    <|> var <$> ident
    <|> lam <$> brackets ident <*> parseTerm

很容易看到原始语法。

LR解析器需要更复杂的预处理才能生成表来高效执行,因为使用像recursive ascent这样的代码的直接手编码相当可怕。

通过将您的解析器组合器实现为EDSL而不是外部工具,可以更好地使用编程语言的高级功能。您可以使语法的一部分更高级,将lexer hack直接构建到解析器等中。典型的LR解析器生成器不能执行这些操作,或者只能在有限的上下文中提供它们,因为需要能够最后发出表。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读