FParsec解析无序子句

时间:2016-08-28 10:25:05

标签: f# fparsec

我想解析一些语法,如下面的

OUTPUT data
GROUPBY key
TO location
USING object

允许GROUPBY TO USING子句的顺序不同,但每个子句最多只能出现一次。

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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