рекурсивный pyparsing не вызывает исключение

1

У меня есть следующий фрагмент с рекурсивным высказыванием из синтаксического анализа pyparsing:

def parse_query(querystr):
    # <<other parsing stuff>>
    queryexpression = querycondition + ZeroOrMore(Word("and") + querycondition)
    try:
        return queryexpression.parseString(querystr)
    except ParseException as e:
        logger.debug("Error parsing '{0}': \n {1}".format(querystr, e))
        return None

когда я подаю этот запрос:

tokens = parse_query("HR:EE > -28.9 and BL:AA = 0 THISISNOTAND KLAS:TT eq true")
print(tokens)

это дает:

[['HR', ':', 'EE', '>', '-28.9'], 'and', ['BL', ':', 'AA', '=', '0']]

и просто молча пропускает последнее условие. Исключение не было.

Как поймать ошибку в этой строке?

  • 0
    Я не вижу той части, где происходит что-то рекурсивное.
  • 0
    queryexpression = querycondition + ZeroOrMore (Word ("and") + querycondition)
Показать ещё 3 комментария
Теги:
parsing
pyparsing

1 ответ

1
Лучший ответ

queryexpression = querycondition + ZeroOrMore (Word ("и") + условие запроса)

Это не требуется для синтаксического анализа всей строки. ZeroOrMore означает именно это. Он останавливается, когда он сталкивается с чем-то, что не соответствует определению. Он всегда будет успешным, потому что "ноль" является допустимым параметром для количества совпадений вложенного выражения.

Если вы хотите разобрать весь путь до конца строки, вам понадобится выражение, которое явно требует этого, например, путем + LineEnd.

Строки не являются "специальными", если вы их не сделаете. Выражение синтаксического анализа по умолчанию предполагает соответствие префикса ввода, а не всего ввода, потому что вы всегда можете использовать другое выражение для разбора следующего бита.

  • 1
    StringEnd - это то, что я бы предложил, в отличие от LineEnd . Вы также можете сделать это, добавив parseAll=True аргумент в parseString .
  • 0
    @PaulMcGuire, если предположить, что текст передается парсеру по одной строке, конечно. Хотя я предполагаю, что это так, учитывая очевидные ожидания ОП ... Спасибо за указание на аргумент parseAll , тоже. - Эй, подожди, ты не автор pyparsing? :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню