我试图创建一个规则来创建一个字符串并打印它。所以继承代码:
%{
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
规则永远不会被使用,这就是错误的含义。
要解决这个问题,只需将.
移动到最后一条规则即可。这样,只有在其他规则都不匹配时才会匹配。