2012-11-09 15 views
7

Sto scrivendo un parser semplice per i registri di tcpdump, potresti dirmi perché non riesco a ottenere il numero di linea corretto?Flex yylineno impostato su 1

%{ 
char str[80]; 
%} 
%option yylineno 

... 
%% 

^{HOURS}:{MINUTES}:{MINUTES} if(input()=='.') { strcpy(str, yytext); BEGIN(A); } else {printf("Wrong hour %d", yylineno); } 
<A>({NDPS}|{DPS})\.({NDPS}|{DPS})\.({NDPS}|{DPS})|\.{NDPS} printf("Wrong IP!, %d", yylineno); 
<A>[ ]{DPS}\.{DPS}\.{DPS}\.{DPS} strcat(str, " from "); strcat(str, yytext+1); BEGIN(B); 
... 

risposta

11

Quando ho provato questo, si è scoperto che dovevo avere una regola che corrisponde in realtà a capo per yylineno da aggiornare. Con la seguente regola ha funzionato, e senza di essa yylineno non è mai cambiato:

\n { } 
+1

Grazie per aver risparmiato un sacco di tempo. È molto difficile trovare suggerimenti utili per l'utilizzo del flex. – Lukas

+1

Nota che se non stai usando 'flex' (ma stai usando' lex' o qualche altra variante di esso), questo potrebbe non essere sufficiente. Vedi [Lex: 'yylineno' restituendo 1] (http://stackoverflow.com/questions/31524630/lex-yylineno-returning-1) per alcune informazioni (o, in forma breve, sostituisci' \ n {} 'con' \ n {yylineno ++;} '). Se stai usando 'flex', probabilmente non è una buona idea - probabilmente incrementa il numero della linea, che è probabilmente controproducente. –

+0

Se stiamo aggiungendo la regola per incrementare il numero di riga, perché non creare la nostra variabile lineno indipendente dagli interni di Flex? metti 'int my_yylineno = 1' nella regione di dichiarazione e' \ n {my_yylineno ++;} 'nelle regole –

Problemi correlati