flex 无法识别字符范围
flex cannot recognize character ranges
这是输入文件:
/* 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
因为您在模式周围加上了引号。在 (f)lex 中,双引号内的字符没有特殊意义;他们代表他们自己(\
除外)。
有关模式语法的详细信息,请参阅 flex manual。
查看我多年前编写的 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] #
这是输入文件:
/* 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
因为您在模式周围加上了引号。在 (f)lex 中,双引号内的字符没有特殊意义;他们代表他们自己(\
除外)。
有关模式语法的详细信息,请参阅 flex manual。
查看我多年前编写的 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] #