2012-11-09 5 views
7

Ich schreibe einen einfachen Parser für tcpdump Logs, könnten Sie mir bitte sagen, warum ich keine richtige Zeilennummer bekommen kann?Flexyyyleno auf 1 eingestellt

%{ 
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); 
... 

Antwort

11

Als ich das versucht, es stellte sich heraus, dass ich eine Regel haben, hatte die Newline tatsächlich passt für yylineno aktualisiert werden. Mit der folgenden Regel hat es funktioniert, und ohne es yyyleno hat sich nie geändert:

\n { } 
+1

Vielen Dank für das Speichern einer Menge Zeit. Es ist sehr schwierig, nützliche Tipps für die Verwendung von Flex zu finden. – Lukas

+1

Beachten Sie, dass dies möglicherweise nicht ausreicht, wenn Sie nicht "flex" verwenden (aber "lex" oder eine andere Variante davon verwenden). Siehe [Lex: 'yyyleno', das 1 zurückgibt] (http://stackoverflow.com/questions/31524630/lex-yyleno-returning-1) für einige Informationen (oder kurz, ersetzen Sie' \ n {} 'durch' \ n {yyyleno ++;} '). Wenn Sie 'flex' verwenden, ist das wahrscheinlich keine gute Idee - es erhöht wahrscheinlich die Zeilennummer, was wahrscheinlich kontraproduktiv ist. –

+0

Wenn wir sowieso die Regel hinzufügen, um die Zeilennummer zu erhöhen, warum erstellen Sie nicht unsere eigene Variable llinen unabhängig von den Interna von flex? Setze 'int my_yylineno = 1' in den Deklarationsbereich und' \ n {my_yyleno ++;} 'in die Regeln –

Verwandte Themen