Flex Expression警告,规则无法匹配

时间:2015-10-22 17:39:01

标签: flex-lexer

我试图完成编写词法分析器的任务,但每次尝试使用flex创建lex.cc.y文件时我都会收到此错误:

  

" fofo.l",第13行:13警告规则无法匹配   " fofo.l",line:14警告规则无法匹配。

%{
#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);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

如评论中所示,问题在于[]的字符集模式使用不当。这表示一组单个字符。对模式的解释:

["="]*

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

模式:

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

会匹配字符:"*|%&或ε,而不仅仅是乘法运算符。它也会匹配""""||||||||||等。标记符号|不代表

正确的图案是移除包围,留下可选择的图案。生成的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);
        }
    }
}

我写了完整的答案,以帮助那些可能只在it was clear the OP had fixed the error之后让这个普通初学者犯错的人!