PyParsing lookaheads и жадные выражения

Я пишу синтаксический анализатор для языка запросов с использованием PyParsing, и у меня возникла (как мне кажется) проблема с прогнозированием . Один тип предложения в запросе предназначен для разделения строк на 3 части (имя поля, оператор, значение), так что имя поля - одно слово, оператор - одно или несколько слов, а значение - слово, строка в кавычках или список в скобках. эти.

Мои данные выглядят так:

author is william
author is 'william shakespeare'
author is not shakespeare
author is in (william,'the bard',shakespeare)

И мой текущий синтаксический анализатор для этого предложения записан как:

fieldname = Word(alphas)

operator = OneOrMore(Word(alphas))

single_value = Word(alphas) ^ QuotedString(quoteChar="'")
list_value = Literal("(") + Group(delimitedList(single_value)) + Literal(")")
value = single_value ^ list_value

clause = fieldname + originalTextFor(operator) + value

Очевидно, это не удается из-за того, что элемент operator является жадным и поглощает значение , если это возможно. Прочитав другие похожие вопросы и документы, я понял, что мне нужно управлять этим прогнозом с помощью NotAny или FollowedBy , но я не смог понять, как заставить это работать.

11
задан Michael C. O'Connor 11 February 2012 в 17:57
поделиться