我在头文件中定义了一些常量,这些常量包含由flex/bison中写入的文件解析器解析的某些字符串的最大长度。我想将检查字符串长度的代码从c代码移到我的正则表达式中,以使事情更简洁一些。在flex规则中使用外部定义的常量
现在我有一个看起来像规则:
[[:alnum:]]+ { yylval.sval = (char*) strdup(yytext); return STRING; }
凡长度检查发生在野牛规则。
我想修改这一点,以便它检查比赛比MAX_STR_LEN不再这是在头叫constants.h定义。如果MAX_STR_LEN等于32,比我想同样的效果:
[[:alnum:]]{1,32}
反正有没有做到这一点无需经过预处理的额外步骤运行我的Flex文件?
编辑:
下面的规则将失败,因为MAX_STR_LEN不是文字数,它被看作是一个字符串,因此柔性认为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(); }
请注意,如果您执行了上述'yyless',则您将重新扫描作为另一个'STRING'标记的多余部分,给出扫描仪中的其他功能。这实际上是原始问题的问题,但至少可以说,将ABCDEFG作为三个单独的字符串ABC,DEF,G(使用3作为此示例的最大值)是非常不寻常的。 (这也是低效率的,但是再次,所以呢?) – torek 2012-03-22 19:15:43
这可能是最接近我最初问的。我确实决定采取这种方法,因为它看起来更灵活一些。 – msikora 2012-03-24 21:41:28