Как использовать pyparsing для сопоставления нескольких строк при использовании итератора для чтения файла

В определении моей грамматики Pyparsing есть некоторые грамматики, которые будут соответствовать строкам, которые занимают несколько строк. Если я использую API, как:

PyGrammar.parseString(open('file_name').read())

Если будете вести себя правильно.

Однако, если я хочу использовать итератор для чтения файла, как

with open('file_name') as f:
   for line in f:
      PyGrammar.parseString(line)

парсер сломается

Есть ли способ обойти это дело. Спасибо...

1 ответ

По словам Павла (автор pyparsing)

with open('file_name') as f:
   for line in f:
      PyGrammar.parseString(line)

Приведенный выше код не является правильным способом использования pyparsing. Pyparsing должен видеть все исходные тексты перед анализом текстов. Поэтому, когда я вызываю parseString для каждой строки текста, это не работает. Другой способ - использовать обертку для него. лайк:

    # set up a generator to yield a line of text at a time
    linegenerator = open('big_hairy_file.txt')
    # buffer will accumulate lines until a fully parseable piece is found
    buffer = ""

    for line in linegenerator:
        buffer += line

        match = next(grammar.scanString(buffer), None)
        while match:
            tokens, start, end = match
            print tokens.asList()

            buffer = buffer[end:]
            match = next(grammar.scanString(buffer), None) 
Другие вопросы по тегам