Контекст
Я поднимаюсь по кривой обучения Nearley и пытаюсь написать грамматику для анализатора поисковых запросов.
Цель
Я хотел бы написать грамматику, которая может анализировать строку запроса, которая содержит логические операторы (например, AND
, OR
, NOT
).Давайте используем AND
для этого вопроса в качестве тривиального случая.
Например, грамматика должна распознавать эти примеры строк как допустимые:
- брюки
- брюки Иноски
- прыжковые домкраты
Попытка
Моя наивная попытка выглядит примерно так:
query ->
statement
| statement "AND" statement
statement -> .:+
Проблема
Приведенная выше попытка грамматики неоднозначна, поскольку .:+
будет соответствовать буквально любой строке.Что я действительно хочу, так это чтобы первое условие соответствовало любой строке, которая не содержит AND
.Как только появляется «И», я хочу ввести только второе условие.
Вопрос
Как я могу обнаружить эти два разных случая, не имея двусмысленной грамматики?
Я волнуюсьЯ упускаю что-то фундаментальное;Я могу представить массу вариантов использования, когда мы хотим, чтобы произвольный текст разделялся по известным операторам.