如果我删除第41行,那不是警告
“ lex.l”,第41行:警告,规则无法匹配
第41行:“ ||” {printf(“ 26,\”%s \“ \ n”,yytext);}
digit [0-9]
letter [A-Za-z]
id ({letter}|[_])({letter}|{digit}|[_])*
%%
[ |\t|\n]+
"var" {printf("28,\"%s\"\n",yytext);}
"if" {printf("29,\"%s\"\n",yytext);}
"then" {printf("30,\"%s\"\n",yytext);}
"else" {printf("31,\"%s\"\n",yytext);}
"while" {printf("32,\"%s\"\n",yytext);}
"for" {printf("33,\"%s\"\n",yytext);}
"begin" {printf("34,\"%s\"\n",yytext);}
"writeln" {printf("35,\"%s\"\n",yytext);}
"procedure" {printf("36,\"%s\"\n",yytext);}
"end" {printf("37,\"%s\"\n",yytext);}
{id} {printf("1,\"%s\"\n",yytext);}
{digit}+ {printf("2,\"%s\"\n",yytext);}
...
"+=" {printf("23,\"%s\"\n",yytext);}
"-=" {printf("24,\"%s\"\n",yytext);}
"==" {printf("25,\"%s\"\n",yytext);}
"||" {printf("26,\"%s\"\n",yytext);}
"&&" {printf("27,\"%s\"\n",yytext);}
%%
#include <ctype.h>
int main(){
yylex ( );
return 0 ;
}
yywrap(){
return 1;
}
答案 0 :(得分:1)
此:
[ |\t|\n]
是一个字符类,它与以下四个字符之一匹配:
竖线在类中出现两次,但是由于字符类是一个集合,因此重复被忽略。
所以
[ |\t|\n]+
与仅由上述字符组成的任何非空序列匹配。 ||
是这样的序列之一。由于该规则位于"||"
规则之前,因此它将用于匹配||
,因此,正如警告所言,规则"||"
永远无法匹配。
您应该认真考虑使用[[:space:]]
来匹配任何空白字符,[[:alpha:]]
来匹配字母,而[[:digit:]]
来匹配数字。与尝试写出集相比,这些集更具有自我证明作用。但是,如果您要写出该集合,请不要包括竖线,除非您打算包括它。
Flex模式记录在flex manual中。值得一读。