2013-08-20 2 views
3

Я пытаюсь использовать re2c с вводом, определенным с помощью пары итератора, вместо строки с нулевым завершением.сканеры re2c на источнике итератора C++

Из Руководства:

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 работать с итераторами? (Кроме не используя проверил итераторы.)

ответ

1

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

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

3

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

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

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

2

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

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