1

我正在尝试使用Flex 手册中提到的正则表达式 (?rs: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)”,那么它会编译,但在执行后它总是会进入最后一条规则,即“神秘角色......”

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

4

2 回答 2

0

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

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

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

%%
%option case-insensitive
[a] {printf("color"); }
%%
于 2012-06-18T14:12:47.810 回答
0

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

现在关于用[] 括号括起来的内容。它之所以有效,是因为根据[]正则表达式规则,它将尝试匹配任何个人(, ?, i, :,a). 这就是为什么a得到认可而不是A(因为它不在列表中)。

于 2012-05-26T15:16:17.763 回答