声明与GCC和Flex/Bison无效警告

Kyl*_*ndt 2 c yacc lex bison flex-lexer

使用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
Run Code Online (Sandbox Code Playgroud)

Shell命令:

$ wc -l tokenizer.l
178 tokenizer.l
Run Code Online (Sandbox Code Playgroud)

lex文件的最后一部分:

; {
    return SEMI;
}
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么我会收到这个警告?

如果我压制所有#line指令,则错误为:

lex.yy.c: In function ‘yylex’:
lex.yy.c:1021: warning: statement with no effect
Run Code Online (Sandbox Code Playgroud)

其中指的是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();
Run Code Online (Sandbox Code Playgroud)

Chr*_*odd 5

通常,您将从任何具有无条件"返回"的lex规则中获得该错误,因为flex最终生成的代码看起来像(在宏扩展之后):

case xxx:
    return SEMI;
    break;
Run Code Online (Sandbox Code Playgroud)

问题在于"休息"无法到达.它需要存在,以防你的规则没有返回(因此代码不会落入下一个令牌的代码,而是继续识别下一个令牌.)Flex不够智能,无法实际解析您的规则代码并进行流分析以确定何时不需要中断,因此它始终将其放在那里.一般来说,在flex(或bison)的输出上使用-Wall会给你很多警告......