2012-11-09 6 views
7

tcpdump 로그에 대한 간단한 파서를 쓰고 있습니다. 적절한 라인 번호를 얻을 수없는 이유를 말씀해 주시겠습니까?플렉스 yylineno가 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); 
... 

답변

11

내가 이것을 시도했을 때 실제로 업데이트 될 yylineno에 대한 줄 바꿈과 일치하는 규칙이 있어야한다는 것이 밝혀졌습니다. 다음 규칙에 따라 효과가 있었고 변경하지 않은 상태에서 Yylineno는 변경되지 않았습니다.

\n { } 
+1

많은 시간을 절약 해 주셔서 감사합니다. 플렉스 사용에 대한 유용한 팁을 찾는 것은 매우 어렵습니다. – Lukas

+1

'flex'를 사용하지 않는다면 (그러나'lex' 또는 그 다른 변종을 사용하고있을 때), 이것은 충분하지 않을 수 있습니다. 몇 가지 정보를 얻으려면 [Lex :'yylineno' returns 1] (http://stackoverflow.com/questions/31524630/lex-yylineno-returning-1)을 보거나 짧은 형식으로'\ n {}'을'\ n { n {yylineno ++;}'). 'flex'를 사용하고 있다면 아마 좋은 생각이 아닐 것입니다 - 라인 번호를 두배 증가시킬 것입니다. 이것은 아마 역효과 일 것입니다. –

+0

어쨌든 라인 넘버를 증가시키는 규칙을 추가한다면, flex의 내부와 독립적으로 우리 고유의 lineno 변수를 만들지 않겠습니까? 선언 영역에'int my_yylineno = 1'을 넣고 규칙에'\ n {my_yylineno ++;}'를 넣는다. –

관련 문제