我编写了一个简单的lex程序来执行正数的平均值,程序编译正常但是我无法获得预期的输出。我通过给出文件名将输入传递给程序一个命令行参数。句法程序的输出是空白的,显示没有结果,我是lex的初学者,任何帮助将不胜感激。我已附上以下代码。代码是用redhat linux kernel 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
答案 0 :(得分:2)
您的计划适合我。我对yywrap
缺失有点怀疑,所以你可能会链接-lfl
(或类似的东西)选项。此库包含yywrap
和main
。即使我无法重现您所看到的内容,我也很谨慎,可能会使用来自main
的{{1}}。我假设你在输出的输入文件中得到任何换行符。不同的链接器有不同的方法来解决同一符号的多次出现。
总而言之,我认为你必须以编译程序的方式来寻找问题,因为规范似乎没问题。如果您在libfl
之后添加int yywrap(void) { return 1; }
,则可以不使用main
,这是我建议libfl
和lex
的任何用户。