2

プロジェクトを gcc と -Wall オプションを使用してコンパイルすると、flex ファイルの存在しない最後の行に効果のないステートメントに関する警告が表示されます。

警告:

gcc -Wall -O0 -ggdb3 -DNOSUDO -DJOBC -DDEBUG -c lex.yy.c
tokenizer.l: In function ‘yylex’:
tokenizer.l:179: warning: statement with no effect

シェル コマンド:

$ wc -l tokenizer.l
178 tokenizer.l

lex ファイルの最後の部分:

; {
    return SEMI;
}

この警告が表示される理由を知っている人はいますか?

すべての #line ディレクティブを抑制すると、エラーは次のようになります。

lex.yy.c: In function ‘yylex’:
lex.yy.c:1021: warning: statement with no effect

次の ECHO 行を指します。

case 30:
YY_RULE_SETUP
ECHO;
    YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(inQuote):
case YY_STATE_EOF(inWord):
    yyterminate();
4

4 に答える 4

5

一般に、無条件の 'return' を含む lex ルールからこのエラーが発生します。これは、flex が最終的に次のようなコードを生成するためです (マクロ展開後)。

case xxx:
    return SEMI;
    break;

問題は、「休憩」に到達できないことです。ルールが返されない場合に備えて、そこにある必要があります (そのため、コードは次のトークンのコードに失敗せず、代わりに次のトークンを認識し続けます)。Flex は実際に解析できるほどスマートではありません。ルールコードとフロー分析を実行して、ブレークが不要な時期を判断するため、常にそこに配置されます。一般に、flex (または bison) の出力で -Wall を使用すると、次のような多くの警告が表示されます...

于 2009-10-30T19:09:22.037 に答える
2

それは効果のない発言だと感じていると思い;ます。それを引用してみてください:

";" {
    return SEMI;
}
于 2009-10-30T12:59:13.530 に答える
1

私は同じ問題に遭遇し、少し調べました。flex ソース ファイル (.l ファイル) の "#includes" の 1 つが、"ECHO" という名前のマクロ ("0000010" として) を定義する標準ライブラリの termios.h ファイルを間接的にインクルードしていることが判明しました。一方、flex によって生成されたソース ファイルも、"ECHO" という名前のマクロを作成する必要があり、その前に "#ifndef ECHO" があります。しかしもちろん、termios.h が含まれていると、その "ifndef" は false と評価され、ECHO は意図したとおりに定義されませんでした。それがエラーにつながりました。

長い説明、短い解決策:私は入れました

#ifdef ECHO
#undef ECHO
#endif

私の.lファイルのすべてのインクルードの下にあり、それでうまくいきました。

このディスカッション スレッドがすでに少し古いことは知っていますが、警告をグーグルで調べたときに最初に表示されたので、私の貢献はまだ人々に役立つかもしれません.

于 2013-03-05T10:16:36.650 に答える
0

他の答えが言ったように、問題は「リターン」の後の「ブレーク」に到達できないことです。

以前は、条件付きリターンを偽造することで「ブレーク」に到達する方法があることをコンパイラに満足させることができました。

if (1) return SEMI;

最近のコンパイラの中には、これを見抜くのに十分なほど賢いものがあるのではないかと疑っていますが、これは実際には逆効果です。「はい、その通りです、ミスター コンパイラーですが、避けられないので STFU です」。

于 2009-10-31T13:43:48.880 に答える