'[^']*\'
我使用这个规则来使 lex 匹配字符串,当字符串长度小于 9000 时它可以正常工作,那么如何让 lex 匹配长度超过 9,000 的字符串
我是否应该更改规则?或者我必须设置一些东西吗?我希望有人能帮助我
当遇到
INITIAL
时,您可以将状态从预定义的 SQSTR
状态更改为其他状态 '
。在 SQSTR
状态下,当遇到未转义的 INITIAL
时,您会切换回 '
。否则,您将停留在 SQSTR
并将字符附加到标记中。如何最佳地管理内存分配的错误和字符串增长是留给读者的练习。多行字符串也很简单。当然,您应该认识到明显的重构机会。
%s SQSTR
%%
%{
char *str;
int len;
%}
<INITIAL>' {
str = malloc(1);
len = 0;
*str = 0;
BEGIN(SQSTR);
}
<SQSTR>\\' {
str = realloc(str, len+1);
str[len] = '\'';
str[len+1] = 0;
len++;
}
<SQSTR>. {
str = realloc(str, len+1);
str[len] = *yytext;
str[len+1] = 0;
len++;
}
<SQSTR>' {
BEGIN(INITIAL);
}