为什么pyparsing中的有序选择失败了我的用例?

时间:2011-04-25 11:03:58

标签: python pyparsing

>>> g = MatchFirst( Literal("scoobydoo"), Literal("scooby") )
>>> g.parseString( "scooby" )
pyparsing.ParseException: Expected "scoobydoo" (at char 0), (line:1, col:1)

是否抛出了ParseException,因为scooby已经在字符流中消耗了&因此解析器无法回溯?我正在寻找详细的实施说明。

目前,我认为这是一个错误,因为解析器为什么会使匹配短路,因为它没有搜索生产规则中的所有选项。

更新

似乎MatchFirst并不完全等同于|运算符。为什么?

>>> g = Literal("scoobydoo") | Literal("scooby")
>>> g.parseString("scooby").asList()
['scooby']
>>> g.parseString("scoobydoo").asList()
['scoobydoo']

1 个答案:

答案 0 :(得分:2)

MatchFirst(或'|')通过设计进行短路。要强制检查所有替代项,请使用Or(或“^”)。 oneOf("scooby scoobydoo")也会有效,因为oneOf会短路,但只有在重新排列有重叠的替代词之后才会发生。