【问题标题】:Unexpected output from lex program来自 lex 程序的意外输出
【发布时间】:2013-05-05 20:59:09
【问题描述】:

我编写了一个简单的 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

【问题讨论】:

    标签: lex


    【解决方案1】:

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

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

    【讨论】:

    • 你好 Bryan,我在代码中犯了一个错误,主代码必须采用命令行参数,因此它应该修改为 main(int argc,char *argv[]) 并在修改后同样,我可以得到 o/p。我什至介绍了对空格和制表符的检查,并且 o/p 很好。谢谢你的帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    相关资源
    最近更新 更多