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

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

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

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

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

Спасибо.


person Paul Graphov    schedule 11.05.2011    source источник
comment
@justsomebody спасибо за редактирование :)   -  person sehe    schedule 11.10.2012


Ответы (1)


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

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

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

person hkaiser    schedule 05.06.2011
comment
Просто обновление: пример был переименован в SVN в conjure2. - person hkaiser; 07.06.2011