рекурсивный pyparsing не вызывает исключение - PullRequest
1 голос
/ 03 ноября 2011

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

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']]

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

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

1 Ответ

1 голос
/ 03 ноября 2011

queryexpression = querycondition + ZeroOrMore (Word ("and") + querycondition)

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

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

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

...