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);
...
Dzięki za zaoszczędzenie czasu. Bardzo trudno jest znaleźć przydatne wskazówki dotyczące korzystania z flex. – Lukas
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. –
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 –