Boost.Spirit: сообщения об ошибках Lex + Qi - PullRequest
11 голосов
/ 11 мая 2011

Я пишу парсер для довольно сложных конфигурационных файлов, в которых используются отступы и т. Д. Я решил использовать Lex для разбиения ввода на токены, поскольку это, кажется, облегчает жизнь.Проблема в том, что я не могу найти никаких примеров использования инструментов сообщения об ошибках Qi (on_error) с анализаторами, которые работают с потоком токенов вместо символов.

Обработчик ошибок, который будет использоваться в on_error, требует некоторогобыть в состоянии точно указать, где ошибка во входном потоке.Все примеры просто строят std::string из пары итераторов и выводят их.Но если используется Lex, то итераторы являются итераторами последовательности токенов, а не символов.В моей программе это привело к зависанию конструктора std::string, прежде чем я заметил неправильный тип итератора.

Как я понимаю, токен может содержать пару итераторов входного потока в качестве значения.Это тип атрибута по умолчанию (если тип похож на lex::lexertl::token<>).Но если я хочу, чтобы мой токен содержал что-то более полезное для синтаксического анализа (int, std::string и т. Д.), Эти итераторы будут потеряны.

Как создать удобные для пользователя сообщения об ошибках, указывающие положение во входном потокепри использовании Лекса с Ци?Есть ли примеры такого использования?

Спасибо.

1 Ответ

10 голосов
/ 05 июня 2011

Извините за поздний ответ, но мне потребовалось некоторое время, чтобы подготовить достойный пример того, чего вы пытаетесь достичь.Теперь я добавил новый пример лексера в Spirit: conjure_lexer.Это модифицированная версия примера conjure (Qi), реализующая небольшой язык программирования.Основное отличие состоит в том, что он использует лексер вместо чистой грамматики ци.

Новый пример conjure_lexer демонстрирует несколько вещей: а) он использует новый класс position_token, который расширяет существующие token тип.Он всегда хранит пару итераторов, указывающих на соответствующую согласованную входную последовательность (в дополнение к обычной информации, такой как идентификатор токена, значение токена и т. Д.).б) он использует эту информацию о местоположении для сообщения об ошибках; в) и демонстрирует, как использование лексера может упростить грамматику.

Новый пример в SVN (транк) и будет доступен в Boost.V1.47 (будет выпущен в ближайшее время).Он находится в этом каталоге: $ BOOST_ROOT / libs / spirit / example / qi / compiler-tutorial / concure_lexer.

...