运行flex生成词法分析器时无法匹配规则

Rule cannot be matched when running flex to generate a lexical analyzer

我正在尝试为 flex 词法分析器编写规范。规则之一是标识符(如"foo"、"Foo_Bar"、"year_2020"、"Jan30")不能以“_”结尾,如"foo_"。 到目前为止,我有以下内容来捕获该错误:

letter [A-Za-z]
digit [0-9]
identifier {letter}({letter}|{digit}|\_)*({letter}|{digit})*
number {digit}+
character [0-9a-zA-Z_]

...

    /*Ends with underscore*/
{letter}({character}*({letter}|{number})+)?\_
{
    printf("Error at line %d, column %d: identifier \"%s\" cannot end with an underscore.\n", num_lines, num_cols, yytext);
    exit(1);
}

但是我收到错误 "mini_l.lex:89: warning, rule cannot be matched",第 89 行是 {letter}({character}*({letter}|{number})+)?\_

有人可以帮我吗?

该错误消息意味着您的 flex 定义中的前面规则已经涵盖了可能与该规则匹配的所有情况。由于您未提供有关先前规则的任何信息,因此无法建议哪条或哪条规则可能使该规则变得多余,但这正是您应该寻找的。

此外,请记住在 flex 定义中,动作 必须 与模式在同一行开始。不可能像您所做的那样将操作放在下一行;这将导致动作被误解为一种模式。因此,问题实际上可能出在模式 { 上,因为 flex 偶尔会报告带有稍微不正确的行号的错误。