2009-10-30 91 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搜索这个警告时,它首先出现,所以我的贡献对于人们来说可能仍然有用。