C flex无法识别字符范围

C flex无法识别字符范围,c,regex,flex-lexer,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\

以下是输入文件:

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

为什么会这样

操作系统:Ubuntu 18.10
flex版本:2.6.4

,因为您在模式周围加了引号。在(f)法中,双引号内的字符没有特殊意义;它们代表自己(除了
\


有关模式语法的详细信息,请参见。

查看了几年前编写的flex代码,我成功地使以下代码正常工作(在
Debian 9.5
上进行了测试)。仅供参考

(我忘了为什么需要
yywrap()
。)

[步骤101]#cat foo.l
%%
[0-9]+{printf(“编号:%s\n”,yytext);}
“+”{printf(“PLUS\n”);}
“-”{printf(“减\n”);}
“*”{printf(“TIMES\n”);}
“/”{printf(“DIVIDE\n”);}
“|”{printf(“abs\n”);}
“\n”{printf(“换行符”\n”);}
[\t]+{printf(“空白\n”);}
.      {printf(“未知:%s\n”,yytext);}
%%
int-yywrap(无效)
{
返回1;
}
int main()
{
yylex();
返回0;
}
[步骤102]#flex foo.l
[步骤103]#抄送lex.yy.c
[步骤104]#/a.退出
1 + 3
编号:1
空白
加上
空白
电话:3
新线
A.
未知:a
新线
[步骤105]#

我不知道flex,但我认为你不应该引用
[0-9]
。我知道一点flex/Lex,我认为你不应该引用字符范围。