Flex似乎不支持正则表达式先行断言(快速lex分析器)

时间:2014-03-11 12:56:30

标签: regex flex-lexer

当我尝试在flex中使用regex时,如下定义一个int类型:

int    (?<!\w)(([1-9]\d*)|0)(?!\w)

我打算让这个无效:

int a = 123;
int b = 123f; //the '123' should not filtered as an int type

然而,我得到了这个:

bad character: <
bad character: !
bad character: \
...

更重要的是,似乎正则表达式中的?被忽略了。 我很困惑。 flex是否不支持前瞻断言(?<=xxx)(?<!xxx)

我是flex的新手,我真的需要一些帮助

1 个答案:

答案 0 :(得分:13)

那是对的。 Flex不支持负前瞻断言。它也不支持\w\d,但它允许使用posix样式的字符类([[:alpha:]][[:digit:]][[:alnum:]]等。)

Flex正则表达式与javascript-like或perl / python-like&#34; regular&#34;完全不同。表达式。首先,flex的正则表达式非常规则。

语法flex允许的完整列表位于flex manual。任何未在本手册的该部分中描述的内容都是未通过flex实现

使用&#34; lookbehind&#34;几乎没有什么意义。使用flex,因为flex始终匹配当前输入点的最长标记 。它不会在输入中搜索模式。

Flex 使用/运算符(它不是我所知道的任何正则表达式库的一部分)实现有限形式的正向前瞻。你可以使用它只匹配一系列数字后面没有紧跟一个字母:

[[:digit:]]+/[^[:alpha:]]

但是你需要一些匹配数字序列后跟字母字符的模式,因为flex不会搜索匹配的标记。