来看看NB闪闪的flex的使用。
接下来简单的一句话的含义为,在遇到字符 username的时自动替换为 用户名的登录名:
1 2
| %% username printf( "%s", getlogin() );
|
默认情况下,任何不匹配的信息都会拷贝输出到终端。
上面的就是一个规则,其中 username' 是模式,
printf’ 为动作。`%%’ 标记规则的开始。
下面说一个简单的例子example1.l
:
1 2 3 4 5 6 7 8 9 10 11 12 13
| int num_lines = 0, num_chars = 0;
%% \n ++num_lines; ++num_chars; . ++num_chars;
%% main() { yylex(); printf( "# of lines = %d, # of chars = %d\n", num_lines, num_chars ); }
|
这个程序将统计字符数和行数。程序将只输出最后的统计信息。
第一行定义了两个全局变量num_lines 和 num_chars,这两个变量可以被后面的yylex() 和 main() 函数来访问。
接下来有2个规则,匹配成 (`\n’) ,将增加 line 和 character 计数;两外一个就是匹配任何字符的将增加字符计数。
再来一个比较复杂的例子example2.l
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
%{
#include <math.h> %}
DIGIT [0-9] ID [a-z][a-z0-9]*
%%
{DIGIT}+ { printf( "An integer: %s (%d)\n", yytext, atoi( yytext ) ); }
{DIGIT}+"."{DIGIT}* { printf( "A float: %s (%g)\n", yytext, atof( yytext ) ); }
if|then|begin|end|procedure|function { printf( "A keyword: %s\n", yytext ); }
{ID} printf( "An identifier: %s\n", yytext );
"+"|"-"|"*"|"/" printf( "An operator: %s\n", yytext );
"{"[\^{}}\n]*"}"
[ \t\n]+
. printf( "Unrecognized character: %s\n", yytext );
%%
int main( int argc, char **argv ) { ++argv, --argc; if ( argc > 0 ) yyin = fopen( argv[0], "r" ); else yyin = stdin;
yylex(); }
|
这个实例是解析类似Pascal语言的开始。程序解析了不同类型的标记并显示出来。
下一节介绍这个例子的含义。