2012-11-09 15 views
7

Piszę prosty parser dla logów tcpdump, czy mógłbyś mi powiedzieć, dlaczego nie mogę uzyskać prawidłowego numeru linii?Flex yylineno ustawiony na 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); 
... 

Odpowiedz

11

Kiedy próbowałem tego, okazało się, że muszę mieć regułę, która faktycznie dopasowuje newline do yylineno, aby zostać zaktualizowanym. Z tą zasadą zadziałało, a bez niej yylineno nigdy się nie zmieniło:

\n { } 
+1

Dzięki za zaoszczędzenie czasu. Bardzo trudno jest znaleźć przydatne wskazówki dotyczące korzystania z flex. – Lukas

+1

Należy zauważyć, że jeśli nie używasz 'flex' (ale używasz' lex' lub innego jego wariantu), może to nie być wystarczające. Zobacz [Lex: 'yylineno' wracając 1] (http://stackoverflow.com/questions/31524630/lex-yylineno-returning-1) dla jakiejś informacji (lub krótkiej formy, zamień' \ n {} 'na' \ n {yylineno ++;} '). Jeśli używasz 'flex', to prawdopodobnie nie jest dobry pomysł - prawdopodobnie podwójnie zwiększa numer linii, co jest prawdopodobnie nieproduktywne. –

+0

Jeśli w każdym razie dodamy regułę do zwiększenia numeru wiersza, dlaczego nie stworzysz własnej zmiennej lniane niezależnie od wewnętrznych elementów fleksa? wstaw 'int my_yylineno = 1' w obszarze deklaracji, a' \ n {my_yylineno ++;} 'w regułach –