"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。
我试图创建一个规则来创建一个字符串并打印它。 所以这是代码:
%{
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。