Я предполагаю, что вы используете параметры командной строки по умолчанию, сообщите мне, если в противном случае (пример -f
может изменить ситуацию, но в итоге я должен проверить).
Как короткий ответ я бы сказал, нет, это невозможно.
Длинный ответ:
Лично я считаю, этот вопрос немного странно, может быть, вам нужно переосмыслить логику сканер (игнорировать маркер на верхнем уровне или проверить состояние перед блоком re2c затем использовать другой блок re2c?).
Даже если возможно сохранение курсора и с некоторыми goto будет по-прежнему неэффективным, потому что первое правило всегда будет соответствовать.
#include <stdio.h>
#include <string.h>
#define RET(n) printf("%d\n", n); return n
int scan(int i, char *s, int l){
char *p = s;
char *q;
#define YYCTYPE char
#define YYCURSOR p
#define YYLIMIT (s+l)
#define YYMARKER q
/*!re2c
re2c:yyfill:enable = 0;
any = [\000-\377];
*/
YYCTYPE *sc = YYCURSOR; /* save cursor */
/*!re2c
"rule" {printf("rule match\n");if(i==1) {RET(1);}}
any {goto other;}
*/
other:
YYCURSOR = sc;
/*!re2c
"rule2" {printf("rule2 match\n"); RET(2);}
any {if(YYCURSOR==YYLIMIT) RET(0);}
*/
}
int main(int argc, char **argv) {
int i;
for (i=1; i < argc; i++) {
fprintf(stderr, "[%d]:%s\n", i, argv[i]);
scan(i, argv[i], strlen(argv[i]));
}
return 0;
}
Если вы можете обеспечить минимальный пример вашей функции implemntation, правила и параметры командной строки, было бы полезно.
Чтобы быть уверенным, это ваш вопрос о [this re2c] (http://re2c.org/)? Если да, то какая версия и какие параметры командной строки вы используете? – Alex
Да, версия is re2c 0.13.5. Руководство находится по адресу http://re2c.org/manual.html – marcio