>>> 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']
答案 0 :(得分:2)
MatchFirst
(或'|')通过设计进行短路。要强制检查所有替代项,请使用Or
(或“^”)。 oneOf("scooby scoobydoo")
也会有效,因为oneOf
会短路,但只有在重新排列有重叠的替代词之后才会发生。