Я пишу синтаксический анализатор для языка запросов с использованием 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
, но я не смог понять, как заставить это работать.