阿男的小窝

View the Project on GitHub

MacOS下使用flex

本文介绍如何在MacOS下编译flex的代码。

首先撰写一个fb1-1.l1

/* just like Unix wc */
%{
int chars = 0;
int words = 0;
int lines = 0;
%}

%%

[a-zA-Z]+  { words++; chars += strlen(yytext); }
\n         { chars++; lines++; }
.          { chars++; }

%%

main(int argc, char **argv)
{
  yylex();
  printf("%8d%8d%8d\n", lines, words, chars);
}

这个代码就是统计lineswordschars的数量。flex源代码实际上就是C代码,但是它里面加入了规则匹配的macros,用%%来进行分割。接下来使用flex编译上面的代码。MacOS自带flex

$ which flex
/usr/bin/flex

我们可以直接使用flex命令进行编译:

$ flex fb1-1.l

上面会把fb1-1.l扩展成lex.yy.c,也就是把.l文件里面的macros扩展成真正的C代码。展开后的ley.yy.c里面内容很多,可以自己看一看。

下面是编译lex.yy.c

$ cc lex.yy.c -ll
fb1-1.l:17:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
main(int argc, char **argv)
^
1 warning generated.

上面编译的重点,是要在MacOS下用-ll选项来加载flex的库,而不是linux环境下的-lf

编译成功后,生成的可执行文件是a.out,可以用起来看看效果:

$ echo "Hello, world" | ./a.out
       1       2      13

可以看到我们的程序统计出来的行数,字数,和字符数。

以上是flex在macos环境中的使用方法。