FParsec 解析无序子句

KFL*_*KFL 5 f# fparsec

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

OUTPUT data
GROUPBY key
TO location
USING object
Run Code Online (Sandbox Code Playgroud)

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

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

scr*_*wtp 3

我不认为 FParsec 中有排列解析器。我看到了一些你可以采取的方向。

  • 总的来说,@FuleSnabel 的建议非常合理,而且可能最容易实现。不要让解析器负责断言每个子句最多出现一次的属性。相反,单独解析每个子句,允许重复,然后检查生成的 AST,如果您的属性不成立,则会出错。

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

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

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