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