1

我编写了一个简单的 lex 程序来执行正数的平均值,程序编译正常,但我无法获得预期的输出。我通过将文件名作为命令行参数将输入从文件传递给程序. lex 程序的输出是空白的,没有显示任何结果,我是 lex 的初学者,我们将不胜感激。我附上了下面的代码。代码是用redhat linux kernel version 2.4编写的。

 %{
 #include <stdio.h>
 #include <stdlib.h>
 %}

%%
[0-9]+ return atoi(yytext);
%%

void main()
{
  int val, total = 0, n = 0;
  while ( (val = yylex()) > 0 ) {
  total += val;
  n++;
}
if (n > 0) printf(“ave = %d\n”, total/n);
} 

输入文件包含数字 3,6 和 4,文件名作为命令行参数传递。

./a.out < input
4

1 回答 1

2

你的程序对我有用。我有点怀疑yywrap错过了,所以你可能会链接到-lfl(或类似的)选项。这个库包含一个yywrap和一个main。即使我无法重现您看到的内容,但我很担心可能使用了mainfrom libfl。我假设您确实在输出的输入文件中获得了任何换行符。不同的链接器有不同的方法来解决相同符号的多次出现。

总而言之,我认为您必须从构建程序的方式中寻找问题,因为规范似乎还可以。如果你int yywrap(void) { return 1; }在你的之后添加main,那么你可以没有libfl,这是我建议任何用户的lexand gnu-flex

于 2013-05-05T12:59:09.917 回答