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