2012-11-09 28 views
7

我正在爲tcpdump日誌寫一個簡單的解析器,請問爲什麼我無法獲取正確的行號?Flex 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

感謝您節省了大量的時間。很難找到使用flex的有用技巧。 – Lukas

+1

請注意,如果您不使用'flex'(但正在使用'lex'或其他一些變體),這可能是不夠的。參見[Lex:'yylineno' returns 1](http://stackoverflow.com/questions/31524630/lex-yylineno-returning-1)以獲取一些信息(或簡寫形式,用\ \替換'\ n {}' n {yylineno ++;}')。如果您正在使用'flex',這可能不是一個好主意 - 它可能會使行號增加兩倍,這可能會適得其反。 –

+0

如果我們無論如何都增加規則來增加行號,爲什麼不獨立於flex的內部創建自己的lineno變量?在聲明區域放置'int my_yylineno = 1',並在規則中放置'\ n {my_yylineno ++;}' –