Использование SkipTo правильно - PullRequest
0 голосов
/ 09 октября 2018

Я использовал pyparsing в прошлом, но только для небольших задач, на этот раз я пытаюсь использовать его для чего-то более сложного.

Я пытаюсь пропустить блок архитектуры VHDL, которыйвыглядит так:

architecture Behav of Counter is
  ...many statements I'm not interested in at this point...
end architecture;

Вот что я пробовал:

import pyparsing as pp
pp_identifier = pp.Regex(r'([a-zA-Z_][\w]*)')('identifier')
def Keyword(matchString):
    'VHDL keywords are caseless and consist only of alphas'
    return pp.Keyword(matchString, identChars=pp.alphas, caseless=True)

pp_architecture = (
    Keyword('architecture')
    + pp_identifier
    + Keyword('of').suppress()
    + pp_identifier
    + Keyword('is').suppress()
    + Keyword('end')
    + Keyword('architecture')
    )

print(pp_architecture.parseString('''
architecture beh of sram is end architecture
''', parseAll=True))

# this works as I expected, it prints
# ['architecture', 'beh', 'sram', 'end', 'architecture']

Но после изменения pp_architecture на использование SkipTo не получается:

pp_architecture = (
    Keyword('architecture')
    + pp_identifier
    + Keyword('of').suppress()
    + pp_identifier
    + Keyword('is').suppress()
    + pp.SkipTo(Keyword('end') + Keyword('architecture'))
    )

print(pp_architecture.parseString('''
architecture beh of sram is end architecture
''', parseAll=True))
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
  File "C:\Python27\lib\site-packages\pyparsing.py", line 1125, in parseString
    raise exc
pyparsing.ParseException: Expected end of text (at char 29), (line:2, col:29)

Iтакже попытался добавить другой текст между is и end (который я ожидаю пропустить), чтобы убедиться, что это не проблема «пустого пропуска», но это тоже не помогло.

Что я делаю не так?

1 Ответ

0 голосов
/ 09 октября 2018

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

Вы можете либо:

  1. добавить Keyword('end') + Keyword('architecture') после выражения SkipTo, либо
  2. передать include=True в конструктор выражения SkipTo, сказав, что нужно перейти к и разобрать заданные строки.
...