如何解析以相同字符开头的简约替代方案

How to parse alternatives in parsimonious that start with same characters

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

例如:

正文:

2 > 3
2 >= 3

语法:

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

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

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

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