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