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

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

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

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

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

Спасибо.

11
задан just somebody 11 October 2012 в 10:01
поделиться