我在头文件中定义了一些常量,其中包含某些字符串的最大长度,这些字符串将由用 flex/bison 编写的文件解析器解析。我想将用于检查字符串长度的代码从 C 代码移到我的正则表达式中,以使事情更加简洁。
现在我有如下规则:
[[:alnum:]]+ { yylval.sval = (char*) strdup(yytext); return STRING; }
在 bison 规则中进行长度检查的位置。
我想修改它,以便它检查不超过 MAX_STR_LEN 的匹配项,它在名为 constants.h 的 header 中定义。如果 MAX_STR_LEN 等于 32,那么我希望得到与以下相同的效果:
[[:alnum:]]{1,32}
是否可以在不通过额外的预处理步骤运行我的 flex 文件的情况下执行此操作?
编辑:
以下规则将失败,因为 MAX_STR_LEN 不是文字数字,它被视为字符串,因此 flex 认为已为单个规则定义了 2 个操作。
[[:alnum:]]{1,MAX_STR_LEN} { do_something(); }
此外,如果有人试图在 flex 文件的声明部分定义一个宏,那么它也会失败。
max_len 32 /* Also fails if 32 is replaces with MAX_STR_LEN */
%%
[[:alnum:]]{1,max_len} { do_something(); }
最佳答案
您可以在操作规则中处理它:
[[:alnum:]]+ { if (yyleng > MAX_STR_LEN) yyless(MAX_STRING_LEN);
yylval.sval = (char*) strdup(yytext); return STRING; }
这使得规则实际上与模式上的 {1,MAX_STR_LEN}
修饰符相同
关于c - 在弹性规则中使用外部定义的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9693995/