RE2C如何丢弃当前匹配的规则并继续尝试
RE2C How to discard current matched rule and keep trying?
规则匹配后是否可以有条件地丢弃,并继续尝试其他优先级较低的规则?
<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;
}
如果您可以提供一个函数实现的最小示例,那么规则和命令行选项将非常有用。
相关文章:
- 循环后如何继续阅读
- 此代码是否违反一个定义规则
- 生成文件不对文件使用隐式规则
- 我正在尝试使用 c++ 创建一个货币转换程序,我不知道如何继续
- 变量可能尚未初始化[MIRA 2012规则9.1,强制性]
- 静态结构和一个定义规则
- 尽管遵循了规则,内存泄漏在哪里
- C++:继续创建新的变量可以吗
- 这是关于成员访问规则的正确摘要吗
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 增强精神解析器规则以检测语句中的特殊结尾
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 为什么此指针值不能转换为整数的规则是什么?
- 传递通用函数,用于梯形规则的数值积分
- C++内存模型中的确切规则阻止在获取操作之前重新排序
- C++ 如何暂停控制台输出,以便用户可以在继续之前阅读信息
- 模板如何影响C++中隐式声明的规则?
- RE2C如何丢弃当前匹配的规则并继续尝试