首页 > 解决方案 > 运行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:警告,规则无法匹配”,第 89 行是{letter}({character}*({letter}|{number})+)?\_.

有人可以帮我吗?

标签: flex-lexerlexical-analysis

解决方案


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

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


推荐阅读