【问题标题】:Parsing unordered sequence with parsing expression grammar用解析表达式语法解析无序序列
【发布时间】:2011-07-17 11:22:05
【问题描述】:

parsing expression grammar (PEG) 中是否有(简单)方法来表达“无序序列”?

之类的规则
Rule <- A B C

要求 A、B 和 C 按顺序匹配。诸如

之类的规则
Rule <- (A B C) / (B C A) / (C A B) / (A C B) / (C B A) / (B A C)

允许它们以任何顺序匹配(这是我们想要的),但是在序列中有更多术语的情况下,它在实践中很麻烦且不适用。

是使用语法较宽松的规则的唯一解决方案,例如

Rule <- (A / B / C){3}

并在语义上检查每个规则是否只匹配一次?

事实上,例如,Relax NG Compact Syntax 有一个 "unordered list" operator 来解析 XML,这让我暗示没有明显的解决方案。

最后一个问题:您认为添加这样的运算符会给 PEG 带来歧义吗?

【问题讨论】:

    标签: parsing grammar


    【解决方案1】:

    语法规则精确地表达了您想要的形式序列,而不管您选择何种解析引擎(例如,PEG、LALR、LL(k)、...)。

    使用 BNF 规则表达您想要某事物的所有可能序列的唯一方法是您提出的丑陋的大规则。

    标准解决方案是简单地定义:

    rule <- (A | B | C)* 
    

    (或解析器生成器为列表接受的任何语法)并从语义上计算出只提供了 3 种形式并且它们是唯一的。

    构建解析器生成器的人通常会添加特殊的“扩展 BNF”符号来让它们描述特殊情况;您给出了一个示例,使用 {3} 作为特殊语法,这意味着您只想要“3 of”,假设解析器生成器接受此表示法并执行适当的执行。可以想象一个扩展符号 {unique} 让您描述您的情况。我从未见过实现该想法的解析器生成器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多