Flex yylineno设置为1

Woj*_*ski 7 flex-lexer

我正在为tcpdump日志编写一个简单的解析器,你能不能告诉我为什么我得不到正确的行号?

%{
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);
...
Run Code Online (Sandbox Code Playgroud)

Tho*_*thy 14

当我尝试这个时,事实证明我必须有一个规则,实际上匹配换行的yylineno换行符.使用以下规则它是有效的,没有它yylineno从未改变:

\n { }
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您没有使用 `flex`(而是使用 `lex` 或它的其他变体),这可能还不够。请参阅 [Lex: `yylineno` 返回 1](http://stackoverflow.com/questions/31524630/lex-yylineno-returning-1) 获取一些信息(或者,简短形式,将 `\n { }` 替换为 `\ n { yylineno++; }`)。如果您正在使用 `flex`,这可能不是一个好主意——它可能会双倍增加行号,这可能会适得其反。 (3认同)
  • 谢谢你节省了很多时间.很难找到有关flex使用的有用提示. (2认同)