Я пишу синтаксический анализатор для довольно сложных конфигурационных файлов, в которых используются отступы и т. д. Я решил использовать Lex для разбиения ввода на токены, так как это упрощает жизнь. Проблема в том, что я не могу найти примеры использования инструментов отчетов об ошибках Qi (on_error
) с парсерами, которые работают с потоком токенов вместо символов.
Обработчик ошибок, который будет использоваться в on_error
, требует некоторого времени, чтобы указать, где именно ошибка находится во входном потоке. Все примеры просто создают std::string
из пары итераторов и печатают их. Но если используется Lex, эти итераторы являются итераторами последовательности токенов, а не символов. В моей программе это привело к зависанию конструктора std::string
до того, как я заметил недопустимый тип итератора.
Насколько я понимаю, токен может содержать пару итераторов для входного потока в качестве своего значения. Это тип атрибута по умолчанию (если тип похож на lex::lexertl::token<>
). Но если я хочу, чтобы мой токен содержал что-то более полезное для разбора (int
, std::string
и т. д.), эти итераторы теряются.
Как я могу создавать удобные для человека сообщения об ошибках с указанием позиции во входном потоке при использовании Lex с Qi? Есть ли примеры такого использования?
Спасибо.