Flex ne compte pas correctement les lignes sur les commentaires multilignes

J’utilise la regex ci-dessus pour identifier les commentaires multilignes dans Flex:

[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] { /* DO NOTHING */ } 

Mais il me semble que flex / bison ne retourne pas correctement le compteur de lignes. Par exemple:

Consortingbution:

 1 ___bqmu7ftc 2 // _qXnFEgQL9Zsyn8Ohtx7zhToLK68xbu3XRrOvRi 3 /* "{ output 6 = <=W if u7 do nN)T!=$||JN,a9vR)7" 4 -758939 5 -31943.6165480 6 // "RND" 7 '_' 8 */ 9 [br _int] 

Sortie:

 1 TK_IDENT [___bqmu7ftc] 4 [ 4 TK_IDENT [br] 4 TK_IDENT [_int] 4 ] 

La ligne devrait être 9 au lieu de 4.

Des idées?

Je ne sais pas comment vous avez généré le résultat du test dans votre question, mais voici un exemple (presque) minimal d’utilisation de yylineno . Ça fonctionne bien pour moi:

 %{ #define ID 257 %} %option yylineno %option noinput nounput noyywrap %% [[:space:]]+ { /* DO NOTHING */ } "//".* { /* DO NOTHING */ } [/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] { /* DO NOTHING */ } [[:alpha:]_][[:alnum:]_]* { return ID; } . { return *yytext; } %% int main(int argc, char** argv) { for (;;) { int token = yylex(); switch (token) { case 0: printf("%4d: %s\n", yylineno, "EOF"); return 0; case ID: printf("%4d: %-4s[%s]\n", yylineno, "ID", yytext); break; default: printf("%4d: %c\n", yylineno, token); break; } } } 

C’est la solution que j’ai trouvée dans le manuel Flex

N’oubliez pas de déclarer int comment_caller; sur votre champ de définition.

 %x comment %x foo %% "/*" {comment_caller = INITIAL; BEGIN(comment); } "/*" { comment_caller = foo; BEGIN(comment); } [^*\n]* {} "*"+[^*/\n]* {} \n {++line_num;} "*"+"/" BEGIN(comment_caller);