c - 在弹性规则中使用外部定义的常量

标签 c flex-lexer

我在头文件中定义了一些常量,其中包含某些字符串的最大长度,这些字符串将由用 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/

相关文章:

yacc - yytext [0]是什么意思?

c - 避免警告 : unreferenced find_rule label

c - 我的代码不打印名为 coin 的变量

c - 为什么需要 offsetof 宏?

c - 如何在linux中的c中获取pid的所有后代子进程id

c - 如何使用 FFMpeg 将图像转换为视频以用于嵌入式应用程序?

c++ - 带 flex 的正则表达式

regex - 使用正则表达式匹配utf-8编码中的任何中文字符

将 Swift CChar 数组转换为字符串