我假设您使用的是默认命令行选项,否则请告诉我(示例-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;
}
如果您可以提供函数实现的最小示例,规则和命令行选项会很有帮助。