#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.