在flex文件中使用int main()



考虑一个flex文件file1.l

%{
int count = 0;
%}
%%
[A-Z]* { printf("%s is a capital letter string n", yytext);
count++; }
.     { printf("%s not a capital lettern", yytext); }
n    { return 0; }
%%
int main(){
yylex();
return 0;
}

考虑另一个flex文件file2.l

%{
int count = 0;
%}
%%
[A-Z]* { printf("%s is a capital letter string n", yytext);
count++; }
.     { printf("%s not a capital lettern", yytext); }
n    { return 0; }
%%

请注意,file1.lfile2.l的区别仅在于int main((部分。我们对这两个文件都使用以下命令。

flex filename.l
gcc -o filename.exe lex.yy.c -lfl
./filename.exe

我观察到两个文件的执行方式相同。为什么?这是否意味着int main((没有任何角色

flex没有什么特别之处。这只是与-lfl链接的结果。

CCD_ 2包含CCD_ 3的默认实现。与库档案的任何成员一样,如果需要,将使用链接库中main()的定义。如果在对象文件中提供定义,则不会使用存档成员。

所以你对main()的定义就是file1的定义。它与libfl上的定义不同,因为您的定义只调用yylex()一次,而libfl定义在循环中调用yylex(),直到返回0。

CCD_ 11还包含CCD_ 12的默认实现;同样,只有在需要时才会使用它。(在您的示例中,yywrap()是必需的,因为您没有定义它。使用%option noyywrap可以删除依赖项。(

如果不需要这些默认定义,则不需要使用-lfl进行链接。

如果这些库成员是由用于lex的Posix标准指定的(尽管在Posix中库与-ll链接(,则两者都是。

最新更新