获取:警告,规则无法匹配

时间:2013-02-24 22:25:08

标签: bison yacc lex flex-lexer

我正致力于构建词法和语法分析器。当我尝试将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 个答案:

答案 0 :(得分:10)

警告告诉您{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]*

答案 1 :(得分:2)

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

  1 [.] 
  2 "foo"

第二条规则将永远不会被匹配。