Question

Lors de la compilation de mon projet avec gcc et l'option -Wall, un avertissement concernant une instruction sans effet apparaît dans la dernière ligne inexistante de mon fichier flex:

Avertissement:

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

Commande de shell:

$ wc -l tokenizer.l
178 tokenizer.l

Dernière partie du fichier lex:

; {
    return SEMI;
}

Quelqu'un sait pourquoi je risque de recevoir cet avertissement?

Si je supprime toutes les directives #line, l'erreur est la suivante:

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

Qui fait référence à la ligne ECHO dans:

case 30:
YY_RULE_SETUP
ECHO;
    YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(inQuote):
case YY_STATE_EOF(inWord):
    yyterminate();
Était-ce utile?

La solution

En général, vous obtenez cette erreur de toute règle lex contenant un "retour" inconditionnel, car flex finit par générer un code ressemblant à (après le développement de la macro):

case xxx:
    return SEMI;
    break;

Le problème est que la "pause" est inaccessible. Il doit être présent au cas où votre règle ne reviendrait pas (pour que le code ne tombe pas dans le code du prochain jeton, mais continue à reconnaître le prochain jeton.) Flex n'est pas assez intelligent pour réellement analyser votre code de règle et votre analyse de flux pour déterminer quand la pause n'est pas nécessaire, ainsi, il la met toujours là. En général, utiliser -Wall à la sortie de flex (ou bison) vous donnera de nombreux avertissements comme celui-ci ...

Autres conseils

J'imagine que ; est une instruction sans effet. Essayez de le citer:

";" {
    return SEMI;
}

J'ai rencontré le même problème et je l'ai examiné un peu. Il s'est avéré que l'un de mes "# inclut" " le fichier source flex (le fichier .l) incluait indirectement le fichier de bibliothèque standard termios.h, qui définit une macro nommée "ECHO". (comme "0000010"). D'autre part, le fichier source généré par flex veut également créer une macro nommée "ECHO", il existe un "#ifndef ECHO". avant ça. Mais bien sûr, avec termios.h inclus, cela "ifndef" est évalué à faux et ECHO n'a pas été défini comme prévu. Cela a conduit à l'erreur.

Explication longue, solution courte: je mets

#ifdef ECHO
#undef ECHO
#endif

au-dessous de tous mes inclus dans mon fichier .l, et cela a fonctionné.

Je sais que ce fil de discussion est déjà un peu vieux, mais il est apparu en premier lorsque j'ai googlé l'avertissement. Par conséquent, ma contribution pourrait toujours être utile aux gens.

Comme l’ont dit les autres réponses, le problème est qu’il est impossible d’atteindre une "pause" après un "retour".

Auparavant, il était possible de convaincre un compilateur qu'il existait un moyen de passer à la 'rupture' en simulant un retour conditionnel:

if (1) return SEMI;

Je pense que certains compilateurs modernes sont assez intelligents pour y parvenir - ce qui est en fait contre-productif. "Oui, vous avez raison, monsieur le compilateur, mais je ne peux pas l'éviter de manière contraire, STFU".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top