2013-05-05 41 views
1

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

%{ 
#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 

回答

2

您的程序适用于我。我有点怀疑yywrap失踪,所以你可能会链接-lfl(或类似的东西)选项。该库包含一个yywrap和一个main。即使我无法重现您所看到的内容,但我仍然很谨慎,可能使用libfl中的main。我假设你在输出的输入文件中得到了任何换行符。不同的连接器有不同的方式来解决同一符号的多次出现。

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

+0

你好布赖恩,我在代码中犯了一个错误,主代码必须采用命令行参数,因此它应该被修改为主(int argc,char * argv []),并且在修改后我可以得到o/p。我甚至介绍了检查空格和制表符和o/p是好的。感谢您的帮助。 – 2013-05-08 00:48:26