Boost.Spirit: отчет об ошибках Lex Qi

#c #boost #error-handling #lex #boost-spirit

#c #повышение #обработка ошибок #lex #boost-spirit

Вопрос:

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

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

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

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

Спасибо.

Ответ №1:

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

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

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

Комментарии:

1. Просто обновление: пример был переименован в SVN в conjure2.