f# - FParsec 解析无序子句

标签 f# fparsec

我想解析一些语法如下

OUTPUT data
GROUPBY key
TO location
USING object
GROUPBY TO USING的顺序子句可以变化,但每个子句最多只能出现一次。

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

最佳答案

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

  • 总的来说,@FuleSnabel 的建议非常合理,而且可能最容易实现。不要让解析器负责断言每个子句最多出现一次的属性。而是分别解析每个子句,允许重复,然后检查生成的 AST 并在您的属性不成立时出错。
  • 您可以生成解析器的所有排列并将它们与 choice 结合起来。 .显然这种方法不能扩展,但对于三个解析器我会说这是公平的游戏。
  • 您可以使用以任何顺序应用的解析器集合编写自己的用于解析的原语。这将是 many 的变体在每一步中,您都会创建一个 choice的解析器,然后丢弃该解析器。因此,在每一步中,您都从一个不断缩小的解析器列表中进行选择,直到无法再进行解析,最后返回沿途收集的结果。
  • 您可以使用 user state跟踪已使用的解析器,如果解析器在同一上下文中使用两次,则会失败。不确定这是否会产生一个特别好的解决方案 - 之前没有真正尝试过。
  • 关于f# - FParsec 解析无序子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39190310/

    相关文章:

    .net - CLR .tail 指令是否禁用抢占式 GC?

    f# - F# 中 NumericLiteralN 的含义是什么?

    f# - 如何从 F# 列表中提取数据

    f# - 如何解析 FParsec 中的递归语法

    f# - fsyacc/fslex 或 FParsec 选择什么?

    .net - 在多线程环境中使用TraceSource

    c# - 什么任务最适合用函数式编程风格完成?

    f# - FParsec:如何从错误消息中省略 `many` 解析器失败

    c# - C#/F# 中的 cooking 测量

    parsing - FParsec:如何保存解析器成功的文本