Bison构建警告:“ -s选项给出但默认规则可以匹配”
题
我收到了警告
warning, -s option given but default rule can be matched
如果您提供google“选项但默认规则可以匹配”,则会找到 Flex手册的诊断章节以及旧的Flex手册页诊断部分中的a>:
警告,' - 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"); }
%%
解决方案
%选项nodefault 相当于-s
其他提示
“弯曲”您的系统上的命令可能已被别名为带有-s选项的flex命令。这可能发生在几个启动脚本中。
警告告诉您某些输入与输入文件中的任何规则都不匹配。警告是为了让您确保已经考虑了正则表达式中的所有案例。
如果您确实想要使用默认规则,请将其添加到输入文件中规则的末尾。尝试添加规则
. ECHO;
\n ECHO;
更新: 您提供的输入文件包含%option nodefault,它与指定“-s”相同。在命令行上,这样神秘就解决了。此外,该文件没有“。”规则。有些字符没有被覆盖,例如'@'。
我也怀疑“ - ”字符类中的符号。它应该是一个范围操作符,但它可以像你拥有它一样在第一个位置作为一个字符。我不知道。使用“\ - ”可能是个好主意。代替。
您可以将最后一条规则更改为
. { printf("lex Unknown character = '%s'", yytext); yyerror("lex Unknown character"); }
删除警告(并防止生成的扫描程序崩溃)。
另外,您是否可以将问题的标题更改为flex而不是bison?
不隶属于 StackOverflow