Я пытаюсь использовать re2c с вводом, определенным парой итераторов вместо строки с нулевым символом в конце.
Из руководства:
YYCURSOR
[...]
On entry, YYCURSOR is assumed to point to the first character of the current token.
On exit, YYCURSOR will point to the first character of the following token.
Этот последний пункт означает, что он пытается перебрать конец.
Есть ли хитрость, чтобы re2c работал с итераторами? (За исключением не использования проверенных итераторов.)
Используете ли вы re2c в модели pull, где он вызывает YYFILL (n), или push-модель, передавая -f?
В модели pull объявите YYFILL (n) для вызова return, когда ваш итератор исчерпан.
В модели push ваш цикл итератора будет определять, когда ввод будет выполнен, и вы больше не будете вызывать анализатор.
Посмотрите примеры на сайте re2c: http://re2c.org/examples/examples.html (они подробно объясняют, как правильно использовать YYFILL или как остановить лексер без YYFILL).
Если вы хотите переопределить модель ввода по умолчанию (например, использовать re2c с итераторами и потоками STL), взгляните на общий API ввода: http://re2c.org/manual/features/generic_api/generic_api.html
AFAICT, все, что вам нужно сделать, это установить YYLIMIT
чтобы указать один символ после конца, и иметь YYFILL()
вернуть, если больше нет данных (что в вашем случае, вероятно, всегда).
Возможно, вы захотите взглянуть на примеры re2c, в частности, пример strip_comments, который читает из файла вместо строки с нулевым символом в конце.