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);
...
感謝您節省了大量的時間。很難找到使用flex的有用技巧。 – Lukas
請注意,如果您不使用'flex'(但正在使用'lex'或其他一些變體),這可能是不夠的。參見[Lex:'yylineno' returns 1](http://stackoverflow.com/questions/31524630/lex-yylineno-returning-1)以獲取一些信息(或簡寫形式,用\ \替換'\ n {}' n {yylineno ++;}')。如果您正在使用'flex',這可能不是一個好主意 - 它可能會使行號增加兩倍,這可能會適得其反。 –
如果我們無論如何都增加規則來增加行號,爲什麼不獨立於flex的內部創建自己的lineno變量?在聲明區域放置'int my_yylineno = 1',並在規則中放置'\ n {my_yylineno ++;}' –