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: я не могу решить эту проблему, выдвигая новое состояние
1 ответ
Я предполагаю, что вы используете параметры командной строки по умолчанию, пожалуйста, дайте мне знать, если иначе (пример -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;
}
Если вы можете предоставить минимальный пример реализации вашей функции, вам помогут правила и параметры командной строки.