2013-02-24 122 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

相關問題