【问题标题】:how to execute code after yylex(); command如何在 yylex() 之后执行代码;命令
【发布时间】:2014-01-20 11:37:41
【问题描述】:

我有一个简单的 flex 源代码,它跳过了 /* */ 中的 cmets,应该得到找到的 cmets 的数量:

%{
  int in_comment = 0;
  int count = 0;
%}

%%
\/\* { in_comment = 1; count++; }
\*\/ { in_comment = 0; }
.    { if (!in_comment) ECHO; }
%%

int main(void)
{
  yylex();
  printf("Comments found %d\n", count); // never executed
  return 0;
}

前半部分工作正常 - 它确实跳过了 cmets,但它们没有被计算在内......我该怎么做才能执行 printf 行?

【问题讨论】:

    标签: c++ flex-lexer


    【解决方案1】:

    我自己也试过了。所以我将你的源代码复制到“x.l”并做了一个make x ld 然后抱怨缺少 yywrap() 函数。添加后

    %option noyywrap
    

    编译成功,测试显示:

    ronald@cheetah:~/tmp$ ./x < cribbage.c
    ... lots of output ...
    Comments found 15
    

    更新:

    如果文本不是从文件加载的(只是./x),您必须通过CTRL + D结束手动输入

    【讨论】:

    • 谢谢...在我的情况下,所有内容都在没有警告或错误的情况下编译,但发现的评论丢失:(
    • 您的程序是否首先返回?还是挂了?在后者的情况下,词法分析器需要更多输入(由 yywrap() 函数控制)。所以请试试我的建议
    • 我试过了,但没有成功。它正在打印我想要的没有 cmets 的句子,没有挂起,一切似乎都很好,但 count 没有打印
    • 奇怪...你如何编译和链接?操作系统?弹性版? (很抱歉有这么多问题,但现在我们必须深入挖掘)
    • hm,您的输入是否以“ctrl-D”结束?
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 2012-03-20
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    相关资源
    最近更新 更多