考虑一个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.l和file2.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
链接(,则两者都是。