5

我想解析一些语法,如下所示

OUTPUT data
GROUPBY key
TO location
USING object

子句的顺序GROUPBY TO USING可以变化,但每个子句最多出现一次。

在 FParsec 中是否有一种方便或内置的方法来解析它?我阅读了一些提到 Haskell Parsec permute 的问题和答案。FParsec 中似乎没有置换。如果这是要走的路,我将如何在 FParsec 中构建置换?

4

1 回答 1

3

我认为 FParsec 中没有排列解析器。我看到了一些你可以接受的方向。

  • 一般来说,@FuleSnabel 的建议非常合理,并且可能最容易实现。不要让解析器负责断言每个子句最多出现一次的属性。而是分别解析每个子句,允许重复,然后检查生成的 AST 并在您的属性不存在时出错。

  • 您可以生成解析器的所有排列并将它们与choice. 显然,这种方法无法扩展,但对于三个解析器,我会说这是公平的游戏。

  • 您可以使用以任何顺序应用的解析器集合编写自己的解析原语。这将是many您在每个步骤choice中创建解析器的位置的变体,然后丢弃该解析器。因此,在每一步中,您从一个不断缩小的解析器列表中进行选择,直到您无法再解析,最终返回沿途收集的结果。

  • 您可以使用用户状态来跟踪已使用的解析器,如果解析器在同一上下文中被使用两次,则会失败。不确定这是否会产生一个特别好的解决方案 - 以前没有真正尝试过。

于 2016-08-29T23:17:16.740 回答