Почему упорядоченный выбор в pyparsing не подходит для моего варианта использования? - PullRequest
1 голос
/ 25 апреля 2011
>>> g = MatchFirst( Literal("scoobydoo"), Literal("scooby") )
>>> g.parseString( "scooby" )
pyparsing.ParseException: Expected "scoobydoo" (at char 0), (line:1, col:1)

Выдается ли исключение ParseException, поскольку scooby уже используется в потоке символов и, следовательно, анализатор не может вернуться назад? Я ищу подробное объяснение реализации этого.

В данный момент я считаю это ошибкой, потому что почему анализатор закорачивает соответствие, так как он не ищет все варианты в производственном правиле.

UPDATE :

Похоже, MatchFirst не совсем эквивалентно оператору |. Почему?

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

1 Ответ

2 голосов
/ 25 апреля 2011

MatchFirst (или '|') замыкает замыкание. Чтобы принудительно проверить все альтернативы, используйте Or (или '^'). oneOf("scooby scoobydoo") также будет работать, поскольку oneOf будет иметь короткое замыкание, но только после перестановки альтернативных слов, которые имеют начальные совпадения.

...