使用flex“ ||”时不能匹配规则

时间:2018-10-31 01:56:29

标签: flex-lexer

如果我删除第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;
}

1 个答案:

答案 0 :(得分:1)

此:

[ |\t|\n]

是一个字符类,它与以下四个字符之一匹配:

  • 空间
  • 竖线( |
  • 标签
  • 换行符

竖线在类中出现两次,但是由于字符类是一个集合,因此重复被忽略。

所以

[ |\t|\n]+

与仅由上述字符组成的任何非空序列匹配。 ||是这样的序列之一。由于该规则位于"||"规则之前,因此它将用于匹配||,因此,正如警告所言,规则"||"永远无法匹配。

您应该认真考虑使用[[:space:]]来匹配任何空白字符,[[:alpha:]]来匹配字母,而[[:digit:]]来匹配数字。与尝试写出集相比,这些集更具有自我证明作用。但是,如果您要写出该集合,请不要包括竖线,除非您打算包括它。

Flex模式记录在flex manual中。值得一读。