ошибка разбора - PullRequest
       33

ошибка разбора

4 голосов
/ 08 февраля 2012

Я застрял в этой ошибке в pyparsing

from pyparsing import Word,alphas,nums,Or,Regex,StringEnd
ws = Regex('\s*')
dot = "."
w = Word(alphas) + (ws | dot) + StringEnd()
w.leaveWhitespace()
w.parseString('AMIT.')

Возвращает следующую ошибку:

ParseException: Expected end of text (at char 4), (line:1, col:5)

1 Ответ

6 голосов
/ 08 февраля 2012

| создает выражение «соответствует первому», а не «соответствует самому длинному».

Первой альтернативой является регулярное выражение, которое будет соответствовать 0 или более пробельным символам. Фактически, это соответствует , поэтому точка не анализируется.

Тогда следующий элемент для разбора - StringEnd, но позиция разбора по-прежнему находится в «.», Так что не получится!

Вот несколько более подробных выводов путем добавления вызовов setDebug() к вашим выражениям грамматики:

>>> w = Word(alphas).setDebug() + (ws.setDebug() | dot.setDebug()) + StringEnd()
>>> w.parseString('AMIT.')
Match W:(abcd...) at loc 0(1,1)
Matched W:(abcd...) -> ['AMIT']
Match Re:('\\s*') at loc 4(1,5)
Matched Re:('\\s*') -> ['']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\python26\lib\site-packages\pyparsing-1.5.6-py2.6.egg\pyparsing.py", line 1032, in parseString
    raise exc
pyparsing.ParseException: Expected end of text (at char 4), (line:1, col:5)

Чтобы заставить вашу грамматику работать, вы могли бы:

  • изменить оператор | на ^ (совпадение самое длинное, а не совпадение первым)

  • изменить регулярное выражение на \s+ вместо \s* (чтобы для совпадения требовался хотя бы один пробел)

  • измените свой второй срок на Optional(dot)

Как правило, явное тестирование для пробелов не согласуется с философией pyparsing - pyparsing отличается от re.

...