2013-02-24 917 views
4

我正在建立一个词法和语法分析器。当我尝试对我的.l文件使用flex时,出现以下警告。正在获取:warning,rule can not be matched

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

第26条是与{正大企业}开始的一个,我的规则段如下:

[ \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 (\".*\") 

为什么此警告出现,以及如何修改我的文件,使其不会出现?

回答

6

该警告告诉您任何可能与{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]* 
+0

非常感谢您!我刚刚开始学习,现在我没有可以使用|那样。它绝对更清晰。另外,我没有注意到缺少的方括号,我改变了很多东西,但没想到会成为问题。 – gabrielbaca 2013-02-24 23:01:02

相关问题