3

当我在 flex 中运行以下代码时,我在最后一行得到过早的 EOF 作为错误。如果定义部分被删除,则不会产生错误。为什么会这样?

%{
     #include <stdio.h>
       int x = 0;
}%

%%
"a"  {x=x+1; printf("id %d",x); }
%%

int yywrap(void)
{
    return 0;
}

int main(void)
{
int x = 0;
    yylex();
    return 0;
}
4

2 回答 2

10

您的代码的第三行有问题。它应该是 %} 而不是 }%

尝试这个 :

%{
x = 0;
%}

%%
[a]  {x++; printf("id %d",x); }
%%

int main(void)
{
    yylex();
    return 0;
}

我不知道您打算做什么,但是一个工作示例将为输入文件中遇到的每个a打印一个id看起来像这样:

%{
x = 0;
%}

%%
[a]  {x++; printf("id %d ",x); }
%%

int main(int argc,char * argv[])
{
  yyin = fopen(argv[1],"r");
  yylex();
  fclose(yyin);
  return 0;
}
于 2013-03-08T19:29:24.497 回答
0

您想从 yywrap 返回 true (1),而不是 0。

弹性手册

当扫描仪收到来自 的文件结束指示时YY_INPUT,它会检查该yywrap()功能。如果yywrap()返回 false(零),则假定该函数已继续执行并设置yyin为指向另一个输入文件,并继续扫描。如果它返回真(非零),则扫描器终止,向其调用者返回 0。

于 2012-09-22T15:04:32.563 回答