flex-lexer - 运行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 定义中的上述规则已经涵盖了可能与该规则匹配的所有情况。由于您没有提供有关先前规则的任何信息,因此无法建议哪些规则或哪些规则可能使该规则变得多余,但这正是您应该寻找的。
另外,请记住,在 flex 定义中,动作必须与模式在同一行开始。不可能像您所做的那样将操作放在下一行;这将导致该动作被误解为一种模式。因此,问题实际上可能是 pattern {
,因为 flex 偶尔会报告带有稍微不正确的行号的错误。
推荐阅读
- qt - QOpenGLWidget 画线有时不可见或加粗
- sql-server - 通过临时表更新和插入
- javascript - 如何使用 Shadow DOM 中的 div 作为 Leaflet 地图容器?
- android - 28.0.0 和 firebase 16.0.8 的混合版本:错误
- c# - 在 Asp.net 中获取两次之间的小时数
- android - 从 Android Studio 中的 gradle 构建中排除 Kotlin 文件
- c++ - 在这个例子中如何理解 constexpr?
- java - 将文本文件读入数组并在 Java 中执行排序
- jenkins - 如何使用脚本化管道方法在参数化构建中定义标签参数
- sql-server - 如何使用 SSIS 导出平面文件