lexer — сканеры re2c на итераторе C ++

Я пытаюсь использовать 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 работал с итераторами? (За исключением не использования проверенных итераторов.)

3

Решение

Используете ли вы re2c в модели pull, где он вызывает YYFILL (n), или push-модель, передавая -f?

В модели pull объявите YYFILL (n) для вызова return, когда ваш итератор исчерпан.

В модели push ваш цикл итератора будет определять, когда ввод будет выполнен, и вы больше не будете вызывать анализатор.

3

Другие решения

Посмотрите примеры на сайте re2c: http://re2c.org/examples/examples.html (они подробно объясняют, как правильно использовать YYFILL или как остановить лексер без YYFILL).

Если вы хотите переопределить модель ввода по умолчанию (например, использовать re2c с итераторами и потоками STL), взгляните на общий API ввода: http://re2c.org/manual/features/generic_api/generic_api.html

2

AFAICT, все, что вам нужно сделать, это установить YYLIMIT чтобы указать один символ после конца, и иметь YYFILL() вернуть, если больше нет данных (что в вашем случае, вероятно, всегда).

Возможно, вы захотите взглянуть на примеры re2c, в частности, пример strip_comments, который читает из файла вместо строки с нулевым символом в конце.

1
По вопросам рекламы [email protected]