11

語彙および構文アナライザーの構築に取り組んでいます。.l ファイルで flex を使用しようとすると、次の警告が表示されます。

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

この警告が表示される理由と、表示されないようにファイルを変更するにはどうすればよいですか?

4

2 に答える 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]*
于 2013-02-24T22:50:14.753 に答える
2

たとえば、ルールの順序が重要であるため、ルールの順序を確認してください。

  1 [.] 
  2 "foo"

ここでは、2 番目のルールが一致することはありません。

于 2019-01-01T22:02:00.750 に答える