“警告,规则无法匹配”在lex中定义字符串

问题描述 投票:0回答:1

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

 %{
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;}

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

lex
1个回答
1
投票

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

所以,例如,如果有一个\t,规则\t.都可以匹配,但\t是第一个,所以它是使用的那个。但是如果出现",则会使用.,因为\"会在你的flex文件中出现。因此,\"中的STRLIT规则永远不会被使用,这就是错误的含义。

要解决这个问题,只需将.移动到最后一条规则即可。这样,只有在其他规则都不匹配时才会匹配。

© www.soinside.com 2019 - 2024. All rights reserved.