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

scoobyはすでに文字ストリームで消費されているため、パーサーはバックトラックできないため、ParseExceptionがスローされますか?このための詳細な実装の説明を探しています。

現時点では、これはバグだと考えています。これは、パーサーが本番ルールのすべての選択肢を検索していないために、パーサーがマッチングを短絡する理由です。

更新

演算子と完全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 に答える