flex的使用(?r-s:pattern)

时间:2012-05-14 13:06:12

标签: flex-lexer

我正在尝试使用the Flex manual中提到的正则表达式(?r-s:pattern)。

以下代码仅在我输入小写字母'a'而不是大写'A'

时起作用
%%
[(?i:a)] { printf("color"); }
\n { printf("NEWLINE\n"); return EOL;}
. { printf("Mystery character %s\n", yytext); }
%%

输出

a
colorNEWLINE
A
Mystery character A
NEWLINE

反向也是如此,即如果我将线(?i:a)改为(?i:A),它只将'A'视为有效输入而不是'a'。 如果我删除方括号,即[],它会给出错误

"ex1.lex", line 2: unrecognized rule

如果我附上“(?i:a)”然后它会编译但是在执行之后它总是会进入最后一条规则,即“神秘人物......”

请让我知道如何正确使用它。

2 个答案:

答案 0 :(得分:0)

我想我迟到了.. :)无论如何,您使用的是flex版本,我安装了版本2.5.35并正确识别上述模式。也许你正在使用旧版本!!!

现在关于括号[]括号。它有效,因为根据[]正则表达式规则,它会尝试匹配任何单个(?i:a)。这就是为什么a被识别而不是A的原因(因为它不在列表中)。

答案 1 :(得分:0)

我阅读本手册的方式,没有方括号的规则应该执行您正在寻找的不区分大小写的匹配 - 我无法解释为什么在编译时出现错误。但您可以通过两种方式之一实现相同的行为。一,您可以枚举字符类中的大写和小写字符:

%%
[Aa] { printf("color"); }
%%

二,您可以在命令行中指定-i--case-insensitive或.l文件中不区分大小写的扫描程序选项:

%%
%option case-insensitive
[a] {printf("color"); }
%%