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);
...
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
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. –
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 –