正则表达式警告规则无法匹配

时间:2014-05-04 18:39:10

标签: regex flex-lexer lexer

我为:

定义了正则表达式
[a-zA-Z0-9._\-]+  {yylval.str=strdup(yytext); return hostname;}
[a-zA-Z_]+[a-zA-Z0-9_]*  {yylval.str=strdup(yytext); return variable;}

我得到一个词法分析器警告,规则不能与我匹配。

我理解当两个规则相似时会发出此警告。

但我打算: 主机名:可以包含ASCII字母数字字符,句点,下划线和连字符。 变量:可以包含ASCII字母数字字符和下划线,但第一个字符不能是数字。

我觉得我已根据规则对其进行了定义。那为什么这个警告?此外,虽然它只是一个警告我的代码不起作用所以不能忽略这个!

1 个答案:

答案 0 :(得分:1)

时:

word

变量或主机名?你怎么知道的?它肯定符合这两种模式。

事实上,与您的variable模式匹配的任何字符串也会匹配您的hostname模式。

由于hostname在您的弹性定义中排在第一位,因此它具有优先级,这意味着与hostnamevariable匹配的任何字符串都将报告为hostname。因此,任何字符串都不可能被报告为variable,这就是flex警告你的内容。

当两者匹配时,您需要描述在variablehostname之间做出决定的标准。否则,您无法解决此问题。