flex无法识别字符范围

时间:2018-11-19 13:41:53

标签: c regex flex-lexer

这是输入文件:

/* 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

2 个答案:

答案 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] #