Как игнорировать pyparsing ParseException и продолжить? - PullRequest
1 голос
/ 22 апреля 2019

Я хотел бы проигнорировать строку в файле, которая не соответствует всем предопределенным парсерам, и продолжить.Строки, которые я хотел бы игнорировать, находятся в широком диапазоне, и я не смог их проверить и определить синтаксический анализатор для каждой из них.

Я использую try..except с pass, как только ParseException перехватывается.Однако синтаксический анализ немедленно прекращается.

try:
    return parser.parseFile(filename, parse_all)

except ParseException, err:
    msg = 'Error during parsing of {}, line {}'.format(filename, err.lineno)
    msg += '\n' + '-'*70 + '\n'
    msg += err.line + '\n'
    msg += ' '*(err.col-1) + '^\n'
    msg += '-'*70 + '\n' + err.msg
    err.msg = msg

    print(err.msg)
    pass

Я бы хотел продолжить, даже если существует ParseException.

1 Ответ

2 голосов
/ 22 апреля 2019

Pyparsing на самом деле не имеет опции «продолжить при ошибке», поэтому вам нужно настроить парсер так, чтобы он не вызывал ParseException в первую очередь. То, что вы можете попробовать, это добавить в свой анализатор что-то вроде | SkipTo(LineEnd())('errors*') в качестве последней ловушки. Затем вы можете посмотреть на имя результатов ошибок, чтобы увидеть, какие строки сбились с пути (или добавить действие разбора к этому выражению, чтобы захватить не только текущую строку).

import pyparsing as pp

era = "The" + pp.oneOf("Age Years") + "of" + pp.Word(pp.alphas)

era.runTests("""
    The Age of Enlightenment
    The Years of Darkness
    The Spanish Inquisition
    """)

Печать:

The Age of Enlightenment
['The', 'Age', 'of', 'Enlightenment']

The Years of Darkness
['The', 'Years', 'of', 'Darkness']

The Spanish Inquisition
    ^
FAIL: Expected Age | Years (at char 4), (line:1, col:5)

Добавьте эти строки и снова вызовите runTests:

# added to handle lines that don't match
unexpected = pp.SkipTo(pp.LineEnd(), include=True)("no_one_expects")
era = era | unexpected

Печать:

The Age of Enlightenment
['The', 'Age', 'of', 'Enlightenment']

The Years of Darkness
['The', 'Years', 'of', 'Darkness']

The Spanish Inquisition
['The Spanish Inquisition']
 - no_one_expects: 'The Spanish Inquisition'
...