"warning, rule cannot be matched" 在 lex 中定义字符串

"warning, rule cannot be matched" Defining String in lex

我试图创建一个规则来创建一个字符串并打印它。 所以这是代码:

 %{
char buff[200];
char *s;
}%
%X STRLIT
%%
\"                  {BEGIN STRLIT; s = buf;}
<STRLIT><<EOF>>     {printf("unterminated string literal\n");
                     BEGIN 0;}
<STRLIT>\          {*s++ = '\';}
<STRLIT>\f          {*s++ = '\f';}
<STRLIT>\n          ;
<STRLIT>\r          ;
<STRLIT>\t          {*s++ = '\t';}
<STRLIT>.           {*s++ = *yytext;}
<STRLIT>\"          {*s = 0;printf("STRING(%s)\n",buf);BEGIN 0;}

错误在最后一行,但我不知道为什么。

当有多个规则可以匹配当前输入并产生相同大小的匹配时,flex 将采用第一个定义的规则。

所以,例如,如果有 \t,规则 \t. 都可以匹配,但是 \t 排在第一位,所以它是用过的。但是,如果 " 出现,则使用 .,因为 \" 在您的 flex 文件中紧随其后。所以 STRLIT 中的 \" 规则永远不会被使用,这就是错误所在。

要解决此问题,只需将 . 移至最后一条规则即可。这样它只会匹配其他规则中的 none。