Поиск парсера строк в C / C ++ - PullRequest
0 голосов
/ 18 ноября 2009

Я работаю над проектом с открытым исходным кодом, ориентированным на библейские тексты. Я хотел бы создать стандартный формат строки для создания строки поиска. Затем мне нужно будет проанализировать строку поиска и запустить поиск с указанными параметрами. Существует множество различных опций, от области поиска до поиска по нескольким текстам, подстановочных знаков и т. Д.

Я думаю, что использование чего-то вроде lex / yacc для генерации парсера для этого формата может быть хорошей идеей. Я думаю, что проект Xapian использует lemony для достижения аналогичной цели. Мой вопрос заключается в том, является ли использование одного (или нескольких) из этих инструментов лучшим способом для достижения этой цели?

В дополнение к вопросу, я был бы признателен за любые ссылки на ресурсы по этим инструментам (и любые другие, которые могут быть варианты). Самая большая проблема, с которой я столкнулся на данный момент, заключается в том, что большинство примеров и руководств ориентированы либо на язык программирования, либо на что-то простое, например калькулятор, а не на разбор строкового формата.

Ответы [ 3 ]

1 голос
/ 18 ноября 2009

Инструменты, такие как Lex и Yacc, подходят для ваших целей. Синтаксический анализатор для строки поиска ничем не отличается от синтаксического анализатора для языка программирования (большая разница в том, что синтаксический анализатор строки поиска генерирует правила, управляющие поиском, в то время как синтаксический анализатор языка программирования генерирует дерево разбора, из которого генерируется код)

Я предполагаю, что ваш синтаксис будет содержать правила, подобные следующим:

expression : word
           | expression AND expression
           | expression OR expression
           | NOT expression
           | '(' expression ')'

Все это легко выразить в Yacc.

Вы можете посмотреть Компактное руководство по Lex & Yacc , которое я нашел очень полезным для изучения Lex и Yacc

1 голос
/ 18 ноября 2009

Если вы пытаетесь создать парсер в C ++, взгляните на

повышение :: шпринтов

Конечно, это продвинутый C ++, но он будет создавать довольно сложные и производительные парсеры из шаблонов C ++ без генерации кода. Мне потребовалось несколько дней, чтобы разобраться в этом, но с использованием и модификацией сэмплов это было просто. Я также рекомендую прочитать следующую книгу:

Метапрограммирование шаблонов C ++: концепции, инструменты и методы, созданные Дэвидом Абрахамсом и Алексеем Гуртовым из Boost и Beyond *

0 голосов
/ 18 ноября 2009

Держите в уме «диагностику и сообщение о синтаксической ошибке» - если пользователь совершает ошибку, анализатор в стиле рекурсивного спуска ручной работы может иметь представление о том, что он до сих пор сканировал, какую ошибку мог допустить пользователь сделал. Если вы собираетесь использовать автоматизированный инструмент, обязательно проверьте, как он реагирует на типичные пользовательские опечатки - гениальные программисты могут обрабатывать зашифрованные сообщения от своего компилятора, в то время как кажется, что вы нацелены на гораздо менее искушенного пользователя, который поэтому нуждается в дружественный интерфейс.

...