2015-02-20 2 views
4

Можно ли условно отбросить правило после согласования и продолжить попытки использования других правил с более низким приоритетом?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: Я не могу решить эту проблему, толкая новый state

+0

Чтобы быть уверенным, это ваш вопрос о [this re2c] (http://re2c.org/)? Если да, то какая версия и какие параметры командной строки вы используете? – Alex

+0

Да, версия is re2c 0.13.5. Руководство находится по адресу http://re2c.org/manual.html – marcio

ответ

1

Я предполагаю, что вы используете параметры командной строки по умолчанию, сообщите мне, если в противном случае (пример -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, правила и параметры командной строки, было бы полезно.