如何解析以相同字符开头的简约替代方案
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 解析器。它不是具体的。
我正在使用 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 解析器。它不是具体的。