我收到了警告
warning, -s option given but default rule can be matched
如果您提供“选项但仍可以匹配默认规则”,则会在“诊断”部分的the Flex manual's chapter on Diagnostics中找到old Flex manpage和此条目:
警告,' - s选项但是默认 规则可以匹配'意味着它 可能的(也许只有特定的 启动条件)默认规则 (匹配任何单个字符)是 只有一个会匹配一个特定的 输入。自
-s
以来, 大概这不是故意的。
我的构建文件没有-s
选项。我写了
bison -y -d calc1.y
flex calc1.l
gcc code...
如何修复此警告?
这是我的lex文件的一个小版本。该文件还会触发警告
%{
#include "y.tab.h"
%}
%option noyywrap nodefault yylineno
%%
[0-9]+ {
return INTEGER;
}
[-+()=/*{},;\n] { return *yytext; }
[ \t] /* skip whitespace */
[a-zA-Z0-9_]* { printf("lex Unknown character = '%s'", yytext); yyerror("lex Unknown character"); }
%%
答案 0 :(得分:4)
%选项nodefault 相当于-s
答案 1 :(得分:2)
系统上的“flex”命令可能已被别名为带有-s选项的flex命令。这可能发生在几个启动脚本中。
警告告诉您某些输入与输入文件中的任何规则都不匹配。警告是为了让您确保已经考虑了正则表达式中的所有案例。
如果您确实想要使用默认规则,请将其添加到输入文件中规则的末尾。尝试添加规则
. ECHO;
\n ECHO;
更新: 您提供的输入文件包含%option nodefault,这与在命令行中指定“-s”相同,因此解决了这个问题。此外,该文件没有“。”规则。有些字符没有被覆盖,例如'@'。
我也怀疑字符类中的“ - ”符号。它应该是一个范围操作符,但它可以像你拥有它一样在第一个位置作为一个字符。我不知道。使用“\ - ”代替它可能是一个好主意。
您可以将最后一条规则更改为
. { printf("lex Unknown character = '%s'", yytext); yyerror("lex Unknown character"); }
删除警告(并防止生成的扫描程序崩溃)。
另外,您是否可以将问题的标题更改为flex而不是bison?