RE2C如何丢弃当前匹配的规则并继续尝试

RE2C How to discard current matched rule and keep trying?

本文关键字:规则 继续 何丢弃 RE2C      更新时间:2023-10-16

规则匹配后是否可以有条件地丢弃,并继续尝试其他优先级较低的规则?

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

PS:condition取决于无法与regex 匹配的其他分辨率

PS2:我已经搜索了:) 的手册

PS3:我无法通过推送新状态来解决这个问题

我假设您使用的是默认的命令行选项,如果不是这样,请告诉我(例如-f可能会改变,但最终我必须检查)。

作为简短的回答,我会说不,这是不可能的。

长答案:

就我个人而言,我觉得这个问题有点奇怪,也许你需要重新思考扫描仪逻辑(忽略上层的令牌,或者检查re2c块之前的条件,然后使用不同的re2c块?)。

即使可能,保存光标并使用一些转到仍然效率低下,因为第一条规则总是匹配的。

#include <stdio.h>
#include <string.h>
#define RET(n) printf("%dn", 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 = [00-377];
*/
YYCTYPE *sc = YYCURSOR; /* save cursor */
/*!re2c
    "rule"  {printf("rule matchn");if(i==1) {RET(1);}}
    any     {goto other;}
*/
other:
YYCURSOR = sc;
/*!re2c
    "rule2" {printf("rule2 matchn"); 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]:%sn", i, argv[i]);
        scan(i, argv[i], strlen(argv[i]));
    }
    return 0;
}

如果您可以提供一个函数实现的最小示例,那么规则和命令行选项将非常有用。