如何解析以相同字符开头的简约选项

时间:2016-11-28 00:14:25

标签: python parsing peg parsimonious

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

例如:

文本:

2 > 3
2 >= 3

语法:

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

文本的第一行将正确解析,但第二行不会被解析。它似乎匹配&#34;&gt;&#34;然后卡住,因为它看到&#34; =&#34;。它永远不会匹配&#34;&gt; =&#34;作为一个整体。如何做到这一点,而不必仔细指定这些?我尝试使用&#34;&amp;&#34;对于前瞻性匹配,但似乎不起作用。

1 个答案:

答案 0 :(得分:3)

简约是基于PEG的。 PEG的一个显着特性是订购替代运营商,即总是从左到右尝试替代选择,并且第一次成功匹配获胜。因此,PEG语法永远不会含糊不清,但在编写语法和相应的订购备选方案时,您必须了解此属性。 PEG实际上是递归下降解析器的规范。

在您的情况下,您应该对operator制作中的匹配进行重新排序,以便首先尝试>=。另一种解决方案是,如果后跟>,则阻止=匹配成功。这是使用语法谓词Not实现的。在简约中用!表示,所以这也应该起作用: operator = ">" !"=" / "==" / "<" / ">=" / "<=" 这通常适用于所有PEG解析器。它不具有简约性。