Flex 表达式警告,无法匹配规则

Flex Expression warning, rule cannot be matched

我正在尝试完成有关制作词法分析器的作业,但每次尝试使用 flex:

制作 lex.cc.y 文件时,我总是收到此错误

"fofo.l", line:13 warning rule cannot be matched.
"fofo.l", line:14 warning rule cannot be matched.

%{
#include <stdio.h>
#define Relop    1
#define Addop    2
#define Mulop    3
#define Assignop 4
#define Not      5
%}
%%
["<"|">"|"<="|">="|"=="|"!="]* { return Relop; }
["+"|"-"|"||"]*                { return Addop; }
["*"|"/"|"%"|"&&"]*            { return Mulop; }
["="]*                         { return Assignop; }
["!"]*                         { return Not; }
.                              { return -1; }
%%
int main () {
    int token;
    while ((token = yylex())) {
        switch (token) {
            case Relop:    printf("Relop: %s\n", yytext);    break;
            case Addop:    printf("Addop: %s\n", yytext);    break;
            case Mulop:    printf("Mulop: %s\n", yytext);    break;
            case Assignop: printf("Assignop: %s\n", yytext); break;
            case Not:      printf("Not: %s\n", yytext);      break;
            default:       printf("Error: %s not recognized\n", yytext);
        }
    }
}

如评论中所述,问题出在[]的字符集模式使用不当。这表示一组 单个 字符。图案解读:

["="]*

将匹配字符:"= 或 ε。即不只是等号。它还会匹配 """"""""""==========

模式:

["*"|"/"|"%"|"&&"]* 

将匹配字符:"*|%& 或 ε 而不仅仅是乘法运算符。它还会匹配 """"|||||||||| 等。棒状符号 | 不会代表 .

正确的模式是删除括号,留下模式选择。生成的 flex 程序如下所示:

%{
#include <stdio.h>
#define Relop    1
#define Addop    2
#define Mulop    3
#define Assignop 4
#define Not      5
%}
%%
"<"|">"|"<="|">="|"=="|"!=" { return Relop; }
"+"|"-"|"||"                { return Addop; }
"*"|"/"|"%"|"&&"            { return Mulop; }
"="                         { return Assignop; }
"!"                         { return Not; }
.                           { return -1; }
%%
int main () {
    int token;
    while ((token = yylex())) {
        switch (token) {
            case Relop:    printf("Relop: %s\n", yytext);    break;
            case Addop:    printf("Addop: %s\n", yytext);    break;
            case Mulop:    printf("Mulop: %s\n", yytext);    break;
            case Assignop: printf("Assignop: %s\n", yytext); break;
            case Not:      printf("Not: %s\n", yytext);      break;
            default:       printf("Error: %s not recognized\n", yytext);
        }
    }
}

我写了完整的答案是为了帮助那些可能在 ![ 之后才犯了这个初学者常见错误的人=27=]