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)
通常,您将从任何具有无条件"返回"的lex规则中获得该错误,因为flex最终生成的代码看起来像(在宏扩展之后):
case xxx:
return SEMI;
break;
Run Code Online (Sandbox Code Playgroud)
问题在于"休息"无法到达.它需要存在,以防你的规则没有返回(因此代码不会落入下一个令牌的代码,而是继续识别下一个令牌.)Flex不够智能,无法实际解析您的规则代码并进行流分析以确定何时不需要中断,因此它始终将其放在那里.一般来说,在flex(或bison)的输出上使用-Wall会给你很多警告......
| 归档时间: |
|
| 查看次数: |
3115 次 |
| 最近记录: |