2011-05-11 2 views
11

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

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

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

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

Спасибо.

+0

@justsomebody Редактировать :) – sehe

ответ

10

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

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

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

+0

Спасибо большое, Хартмут! –

+2

Просто обновление: этот пример был переименован в SVN в conjure2. – hkaiser

Смежные вопросы