我正在使用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;对于前瞻性匹配,但似乎不起作用。
答案 0 :(得分:3)
在您的情况下,您应该对operator
制作中的匹配进行重新排序,以便首先尝试>=
。另一种解决方案是,如果后跟>
,则阻止=
匹配成功。这是使用语法谓词Not
实现的。在简约中用!
表示,所以这也应该起作用:
operator = ">" !"=" / "==" / "<" / ">=" / "<="
这通常适用于所有PEG解析器。它不具有简约性。