收到警告:规则无法匹配。

11

我正在构建一个词法和语法分析器。当我尝试使用flex处理我的.l文件时,出现了以下警告。

littleDuck.l:26: warning, rule cannot be matched

第26条规则以{cteI}开头,我的规则部分如下:

[ \t\n]     ;
{RW}        {return RESERVED;}
{id}        {return ID;}
{ops}       {return OPERATOR;}
{seps}      {return SEPARATOR;}
{cteI}      {yylval.ival = atoi(yytext); return INT;}
{cteF}      {yylval.fval = atof(yytext); return FLOAT;}
{ctestring} {yylval.sval = strdup(yytext); return STRING;}
.       ;

此外,我的定义部分是这样的:
RW      program|var|int|float|print|else|if
id      ([a-z]|[A-Z)([a-z]|[A-Z]|[0-9])*
ops     "="|"<"|">"|"<>"|"+"|"-"|"/"|"*"
seps    ":"|","|";"|"{"|"}"|"("|")"
cteI    [0-9]+
cteF    {cteI}(\.{cteI}((e|E)("+"|"-")?{cteI})?)?
ctestring   (\".*\")

为什么会出现这个警告?我该如何修改我的文件以避免出现这个警告?
2个回答

16
警告提示您,任何可能与{cteI}匹配的内容都将始终被一些早期规则匹配。在您的情况下,这表明某个规则未按您预期的方式进行匹配,可能是由于拼写错误。在您的情况下,是{id}规则,您定义为:
([a-z]|[A-Z)([a-z]|[A-Z]|[0-9])*

注意括号和方括号的嵌套。为了更清晰,加入空格即:

( [a-z] | [A-Z)([a-z] | [A-Z] | [0-9] )*

这将匹配任何字母、数字或字符( )[的序列。您可能是想要:
([a-z]|[A-Z])([a-z]|[A-Z]|[0-9])*

可以更清晰地写成

[a-zA-Z][a-zA-Z0-9]*

非常感谢!我刚开始学习,之前不知道可以这样使用 | 。这样做肯定更清晰明了。另外,我没有注意到缺少的方括号,虽然改了很多东西,但没想到那是问题所在。 - gabrielbaca

3

请检查您的规则顺序,因为这很重要!

  1 [.] 
  2 "foo"

这里的第二条规则永远不会被匹配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接