1
>>> 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']
4

1 回答 1

2

MatchFirst(或“|”)通过设计进行短路。要强制检查所有备选方案,请使用Or(或“^”)。 oneOf("scooby scoobydoo")也会起作用,因为oneOf会短路,但只有在重新排列具有领先重叠的替代词之后。

于 2011-04-25T13:33:35.460 回答