这是输入文件:
/* input.l */
%%
"[0-9]+" {printf("NUMBER: %s\n", yytext);}
"+" {printf("PLUS\n");}
"-" {printf("MINUS \n");}
"*" {printf("TIMES \n");}
"/" {printf("DIVIDE\n");}
"|" {printf("abs\n");}
"\n" {printf("NEWLINE\n");}
"[ \t]" {printf("WHITESPACE\n");}
. {printf("UNKNOWN: %s\n", yytext);}
%%
编译并运行:
flex -X input.l && cc lex.yy.c -lfl && ./a.out
a
UNKNOWN: a
NEWLINE
1
UNKNOWN: 1
NEWLINE
1 + 3
UNKNOWN: 1
UNKNOWN:
PLUS
UNKNOWN:
UNKNOWN: 3
NEWLINE
请注意,flex错过了[0-9]
和[ \t]
。
为什么会这样?
OS:Ubuntu 18.10 弹性版本:2.6.4
答案 0 :(得分:2)
因为您在模式周围加上了引号。在(f)lex中,双引号内的字符没有特殊意义;它们代表自己(\
除外)。
有关模式语法的详细信息,请参见flex manual。
答案 1 :(得分:1)
看看我几年前编写的flex代码,我设法使以下代码正常工作(在Debian 9.5
上进行了测试)。仅供参考。
(我忘记了为什么需要yywrap()
了。:))
[STEP 101] # cat foo.l
%%
[0-9]+ { printf("NUMBER: %s\n", yytext); }
"+" { printf("PLUS\n"); }
"-" { printf("MINUS \n"); }
"*" { printf("TIMES \n"); }
"/" { printf("DIVIDE\n"); }
"|" { printf("abs\n"); }
"\n" { printf("NEWLINE\n"); }
[ \t]+ { printf("WHITESPACE\n"); }
. { printf("UNKNOWN: %s\n", yytext); }
%%
int yywrap(void)
{
return 1;
}
int main()
{
yylex();
return 0;
}
[STEP 102] # flex foo.l
[STEP 103] # cc lex.yy.c
[STEP 104] # ./a.out
1 + 3
NUMBER: 1
WHITESPACE
PLUS
WHITESPACE
NUMBER: 3
NEWLINE
a
UNKNOWN: a
NEWLINE
[STEP 105] #