5

我收到警告

warning, -s option given but default rule can be matched

如果你用谷歌搜索“选项给定但默认规则可以匹配”,你会 在诊断部分的旧 Flex 手册页中找到Flex 手册中关于诊断的章节和此条目:

警告,'-s option given but default rule can be match' 意味着默认规则(匹配任何单个字符)有可能(可能仅在特定的开始条件下)是唯一匹配特定输入的规则。既然-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"); }

%%
4

2 回答 2

4

%option nodefault 等价于 -s

于 2009-11-01T10:27:49.023 回答
2

您系统上的“flex”命令可能被别名为带有 -s 选项的 flex 命令。这可能发生在几个启动脚本中的任何一个中。

警告告诉您,有些输入与输入文件中的任何规则都不匹配。警告是为了让您确保您已经考虑了正则表达式中的所有情况。

如果您确实希望使用默认规则,请将其添加到输入文件中规则的末尾。尝试添加规则

. ECHO;
\n ECHO;

更新:您提供的输入文件包括%option nodefault,这与在命令行中指定“-s”相同,这样就解决了这个谜。此外,该文件没有“.”规则。有一些字符没有被覆盖,例如'@'。

我也怀疑字符类中的“-”符号。它应该是一个范围运算符,但它可以作为你拥有的第一个位置的字符。我不知道。改用“\-”可能是个好主意。

您可以将最后一条规则更改为

. { printf("lex Unknown character = '%s'", yytext); yyerror("lex Unknown character"); }

摆脱警告(并防止生成的扫描仪崩溃)。

另外,您能否将问题的标题更改为关于 flex 而不是 bison?

于 2009-10-26T04:37:51.877 回答