Bison构建警告:“-s选项已给出,但默认规则可以匹配”

时间:2009-10-25 23:36:54

标签: warnings yacc bison lex

我收到了警告

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"); }

%%

2 个答案:

答案 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?