运行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 偶尔会报告带有稍微不正确的行号的错误。
我正在尝试为 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 偶尔会报告带有稍微不正确的行号的错误。