Я хочу проанализировать строку поиска, аналогичную той, которая предоставляется Gmail, используя Perl. Примером ввода будет «tag: thing by: {user1 user2} {-tag: a by: user3}». Я хочу, чтобы положить его в структуру дерева, такие какРазбор синтаксиса расширенного поиска в стиле Gmail?
{and => [
"tag:thing",
{or => [
"by:user1",
"by:user2",
]},
{or => [
{not => "tag:a"},
"by:user3",
]},
}
Общие правила:
- токенов разделенных пространств по умолчанию для оператора AND.
- Токены в фигурных скобках являются альтернативными вариантами (ИЛИ). Скобки могут идти до или после спецификатора поля. то есть «by: {user1 user2}» и «{by: user1 by: user2}» эквивалентны.
- Токены с префиксом дефиса исключаются.
Эти элементы также могут быть объединены и вложены: например, "{by: user5 - {tag: k by: user3}} и т. д.".
Я подумываю написать контекстно-свободную грамматику для представления этих правил, а затем разбора ее в дерево. Разве это не нужно? (Возможно ли это с помощью простых регулярных выражений?)
Какие модули рекомендуются для разбора контекстно-свободных грамматик?
(В конце концов, это будет использоваться для создания запроса к базе данных с DBIx :: Class.)
Спасибо, это убедительный аргумент в пользу использования CFG. Мне действительно нужна рекомендация, какой модуль использовать. –
Ничего, я обнаружил, что Parse :: RecDescent часто рекомендуется. Это работает хорошо. –
Perl 5.10 действительно неплохо вложенные вещи. Это не значит, что это правильное решение, хотя :) –