...
ользую Boost :: Spirit для создания простого языка «фильтра данных» в моем приложении C ++ GUI для нетехнических пользователей. Язык очень похож на простой английский и разбирается в AST. Меня просят сделать процесс максимально удобным для пользователя, поэтому я хочу предоставить CLang-подобные сообщения об ошибках («Нераспознанный« токен », вы имели в виду« токен »?») И автозаполнение.
Вопрос в том, как использовать грамматику Boost :: Spirit для создания списка возможных токенов для обеих целей (я буду использовать простой алгоритм расстояния до строки, чтобы удовлетворить первое требование)?
Мои идеи пока:
Добавьте позицию и длину в исходном потоке к определению токена, полученному из анализатора.Добавьте специальный неверный токен в грамматику, который будет соответствовать чему угодно ... ну ... не верно :-)Если пользователь нажимает ctrl + пробел, строит AST (с неверным токеном дерево всегда будет построено), затем ищите токен внутри текущей позиции курсораИспользуйте простое сопоставление со всеми возможными токенами (у меня есть список токенов в конце концов) и подготовьте список предложенийПроблема с этим решением - предложение также предложит токены, которые являются недействительными для данного места. И если я добавлю (и я буду) определимые идентификаторы, у меня будет гораздо большая проблема в руках ...
Еще одно ограничение: я хочу, чтобы грамматика для этого языка была определена только в одном месте; Если грамматика изменится, я хочу, чтобы автозаполнение знало об этих изменениях после перекомпиляции