RE2C Как отказаться от текущего согласованного правила и продолжать попытки?

Может ли правило быть условно отброшено после сопоставления и продолжать пробовать другие правила с более низким приоритетом?

<SOME_STATE>{rule} {
if(condition) {
return TOKEN;
}
// discard
// continue and try the other rules below...
}

<SOME_STATE>{other_rule} {
return OTHER_TOKEN;
}

...

PS: condition зависит от других разрешений, которые не могут быть сопоставлены с регулярным выражением

PS2: я уже искал руководства :)

PS3: я не могу решить эту проблему, выдвигая новое состояние

4

Решение

Я предполагаю, что вы используете параметры командной строки по умолчанию, пожалуйста, дайте мне знать, если иначе (пример -f может что-то поменять, но в конце концов я должен проверить).

В качестве краткого ответа я бы сказал, нет, это невозможно.

Длинный ответ:

Лично я нахожу вопрос немного странным, может быть, вам нужно переосмыслить логику сканера (игнорировать токен на верхнем уровне или проверить состояние до того, как блок re2c затем используйте другой блок re2c?).

Даже если возможно сохранение курсора и с некоторыми идти к будет по-прежнему неэффективным, потому что первое правило всегда будет соответствовать.

#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;
}

Если вы можете предоставить минимальный пример реализации вашей функции, правила и параметры командной строки будут полезны.

1

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


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