3

我正在使用parsimonious进行一些解析,但我无法弄清楚如何正确解析在无序中共享第一个字符的替代方案:

例如:

文本:

2 > 3
2 >= 3

语法:

expr = ~"[0-9]+" space operator space ~"[0-9]+"
operator = ">" / "==" / "<" / ">=" / "<="
space = ~"[\\s]*"

文本的第一行将正确解析,但第二行不会。看起来它匹配“>”然后因为看到“=”而被卡住。它从不匹配 ">=" 作为一个整体。我如何做到这一点而不必仔细指定这些?我尝试使用“&”进行前瞻匹配,但这似乎不起作用。

4

1 回答 1

3

parsimonious 基于 PEG。PEG 的一个显着特性是替代运算符是有序的,即总是从左到右尝试替代选择,并且第一个成功的匹配获胜。因此,PEG 语法永远不会模棱两可,但在编写语法并相应地排序替代方案时,您必须注意此属性。PEGs 实际上是递归下降解析器的规范。

在您的情况下,您应该真正重新排序operator生产中的匹配项,以便>=首先尝试。另一种解决方案是防止>匹配成功,如果后面跟着=. 这是使用语法谓词来实现的Not。在简约中,它用 表示!,所以这也应该起作用: operator = ">" !"=" / "==" / "<" / ">=" / "<=" 这通常适用于所有 PEG 解析器。它不是吝啬的具体。

于 2016-11-28T14:22:33.843 回答