如何让 lex/yacc 匹配长度超过 9000 的字符串?

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

'[^']*\'
我使用这个规则来使 lex 匹配字符串,当字符串长度小于 9000 时它可以正常工作,那么如何让 lex 匹配长度超过 9,000 的字符串

我是否应该更改规则?或者我必须设置一些东西吗?我希望有人能帮助我

yacc lex
1个回答
0
投票

当遇到

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.