【问题标题】:Flex Expression warning, rule cannot be matchedFlex Expression 警告,规则无法匹配
【发布时间】:2015-10-22 17:39:01
【问题描述】:

我正在尝试完成有关制作词法分析器的作业,但每次尝试使用 flex 制作 lex.cc.y 文件时都会收到此错误:

"fofo.l", line: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);
        }
    }
}

【问题讨论】:

  • []的含义需要重新阅读手册
  • 好吧,我能够在一段时间后解决问题,但由于某种原因,我得到“Realop”作为这两个“!”的输出和“=”字符,而我应该分别得到“Not”和“Assignop”。我也碰巧将减号“-”视为无法识别。
  • 您是否弄清楚 [] 的含义以及为什么不应该像现在这样使用它们?
  • 我们使用 [] 运算符定义了一类字符。它说有例外,例如“\^-”字符,其中“-”定义了一个范围。因此,为了使用“-”作为字符,我们需要在开头或结尾键入它。但是它仍然对我不起作用。
  • "!=" 是四个字符,其中一个是重复的。我不认为那是你想要的。

标签: flex-lexer


【解决方案1】:

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

["="]*

将匹配以下字符:"= 或 ε。即不仅仅是等号。它也将匹配 """"""""""==========

图案:

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

将匹配以下字符:",*,|,%,&amp; 或 ε 而不仅仅是乘法运算符。它也将匹配""""|||||||||| 等。棍子符号| 不代表

正确的模式是删除括号,留下可供选择的模式。生成的 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之后犯过这个常见初学者错误的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多