2009-10-30 95 views
2

使用gcc和-Wall選項編譯我的項目時,我收到一條警告,說明在flex文件的不存在的最後一行中沒有任何效果:GCC和Flex/Bison沒有任何效果警告的聲明

警告:

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

Shell命令:

$ 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(); 
+0

引用第一個分號並沒有什麼區別。 – 2009-10-30 15:21:44

+1

它的_only_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _它更容易(也更令人欣慰)簡單地將gcc告訴STFU。 – 2009-10-31 13:52:21

回答

5

一般情況下,你會得到來自中有一個無條件的「迴歸」任何規則法的錯誤,因爲柔性最終生成的代碼看起來像(宏展開後):

case xxx: 
    return SEMI; 
    break; 

問題在於'break'無法到達。如果你的規則沒有返回,它就需要在那裏(所以代碼不會落入下一個標記的代碼中,而是繼續去識別下一個標記。)Flex不夠聰明以至於無法解析你的規則代碼,並做流程分析,以確定何時休息是不需要的,所以它總是把它放在那裏。一般來說,在flex(或bison)的輸出上使用-Wall會給你很多這樣的警告......

+0

什麼是無條件退貨?在這種情況下,ECHO宏似乎是do {if(fwrite(yytext,yyleng,1,yyout)){}} while(0)//所以這適用?那麼在將flex或Bison的輸出文件編譯爲對象時,是否真的沒有必要? – 2009-10-30 19:54:57

+0

'無條件退貨'是一種'退貨',它不屬於'if',所以如果'case'匹配,它總是會被執行。 – 2009-11-03 02:46:09

2

我想它認爲;是沒有影響的說明。嘗試引用它:

";" { 
    return SEMI; 
} 
+0

已經嘗試過..但是,謝謝:-) – 2009-10-30 13:02:08

+0

我也應該補充我沒有看到任何錯誤的跡象,因爲這個警告。 – 2009-10-30 13:03:16

0

正如對方回答說的那樣,問題在於'返回'後的'break'可以不能達成。

它曾經是能夠滿足編譯器,有一種方法通過僞造一個條件返回去的「休息」:

if (1) return SEMI; 

我有一個懷疑,一些現代的編譯器是足夠聰明到看透這一點 - 這實際上是適得其反的。 「是的,你是對的,Compiler先生,但我無法避免它,所以STFU」。

1

我遇到了同樣的問題,看了一下。事實證明,flex源文件(.l文件)中的一個「#includes」以某種方式間接包含了標準庫termios.h文件,該文件定義了名爲「ECHO」的宏(如「0000010」)。 另一方面flex生成的源文件也希望創建一個名爲「ECHO」的宏,在那之前有一個「#ifndef ECHO」。但是,當然,如果包含termios.h,那麼「ifndef」評估爲false並且ECHO未按預期定義。這導致了錯誤。

龍解釋,簡短的解決方案:我把

#ifdef ECHO 
#undef ECHO 
#endif 

下面我所有的包括我.L文件,該訣竅。

我知道這個討論線程已經有點老了,但是當我用google搜索這個警告時,它首先出現,所以我的貢獻對於人們來說可能仍然有用。