我想解析一些语法,如下面的
OUTPUT data
GROUPBY key
TO location
USING object
允许GROUPBY TO USING
子句的顺序不同,但每个子句最多只能出现一次。
在FParsec中是否有方便或内置的方法来解析它?我读了一些提到Haskell Parsec的问题和答案。在FParsec中似乎没有置换。如果这是要走的路,那么我将如何在FParsec中建立一个置换?
答案 0 :(得分:3)
我认为FParsec中没有排列解析器。我看到了一些你可以接受的指示。
一般来说,@ FuleSnabel建议的声音非常合理,而且可能最简单。不要让解析器负责声明每个子句最多出现一次的属性。而是分别解析每个子句,允许重复,然后检查生成的AST并在您的属性不成立时出错。
您可以生成解析器的所有排列,并将它们与choice
结合使用。显然这种方法不能扩展,但对于三个解析器我会说这是公平的游戏。
您可以使用以任何顺序应用的解析器集合编写自己的原语进行解析。这将是many
的变体,在每个步骤中,您创建一个解析器的choice
,然后丢弃该解析器。因此,在每个步骤中,您都会从一个不断缩小的解析器列表中进行选择,直到您再也无法解析为止,最后返回在此过程中收集的结果。
您可以使用user state来跟踪已使用的解析器,如果解析器在同一个上下文中使用两次,则会失败。不确定这是否会产生一个特别好的解决方案 - 之前没有真正尝试过。