【问题标题】:Flex yylineno set to 1Flex yylineno 设置为 1
【发布时间】:2012-10-30 08:05:41
【问题描述】:

我正在为 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);
...

【问题讨论】:

    标签: flex-lexer


    【解决方案1】:

    当我尝试这个时,结果证明我必须有一个实际匹配换行符的规则才能更新 yylineno。使用以下规则它可以工作,没有它 yylineno 永远不会改变:

    \n { }
    

    【讨论】:

    • 感谢您节省了大量时间。很难找到使用 flex 的有用提示。
    • 请注意,如果您没有使用flex(而是使用lex 或它的其他变体),这可能还不够。有关某些信息,请参阅Lex: yylineno returning 1(或者,简短形式,将\n { } 替换为\n { yylineno++; })。如果你使用flex,这可能不是一个好主意——它可能会使行号加倍,这可能会适得其反。
    • 如果我们无论如何都要添加规则来增加行号,为什么不创建我们自己的 lineno 变量独立于 flex 的内部?将int my_yylineno=1 放在声明区域,将\n {my_yylineno++;} 放在规则中
    • 太棒了!它的工作原理
    猜你喜欢
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 2014-07-24
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2021-06-10
    相关资源
    最近更新 更多