«предупреждение, правило не может быть найдено» Определение строки в lex - PullRequest
0 голосов
/ 04 марта 2019

Я пытался создать правило, чтобы создать строку и распечатать ее.Вот код:

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

Ошибка в последней строке, но я не могу понять, почему.

1 Ответ

0 голосов
/ 04 марта 2019

Когда есть несколько правил, которые могут совпадать на текущем входе и давать совпадения одинакового размера, flex примет правило, определенное первым.

Так, например, если есть \t, оба правила \t и . могут совпадать, но на первом месте стоит \t, так что именно оно используется.Но если появляется ", используется ., потому что \" идет после него в вашем гибком файле.Таким образом, невозможно использовать правило \" в STRLIT, и именно в этом и заключается ошибка.

Чтобы исправить это, просто переместите ., чтобы оно стало последним правилом.Таким образом, он будет совпадать, только если ни одно из других правил не совпадает.

...