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);
...
Grazie per aver risparmiato un sacco di tempo. È molto difficile trovare suggerimenti utili per l'utilizzo del flex. – Lukas
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. –
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 –