我在yacc文件中定义了一个联合作为
%union
{
char str[MAXSTRLEN];
}
%token <str> IDENTIFIER
在lex文件中有以下代码片段 -
<INITIAL>{identifier} {
if(strlen(yytext) > MAXSTRLEN)
{
assert(0 && "Error");
}
strncpy(yylval.str, yytext, strlen(yytext));
yylvalStr[strlen(yytext)] = '\0';
return IDENTIFIER;
}
我看到,当我将MAXSTRLEN从10K更改为100K时,运行时间会受到不利影响。你能否指出可能发生的事情?
由于
答案 0 :(得分:1)
描述%token
(你的怪物%union
)的联合必须被初始化,并且可以被解析器复制。它甚至应该显示为解析器堆栈的一部分。每次解析器执行某些操作时,只需在这些巨大的字符串周围移动即可在场内拍摄性能。
lex / flex / yacc / byacc / bison / ...旨在处理典型的编程语言,其中标识符长度为几个字符。如果你真的需要这样的限制,它可能是罕见的字符串,变得那么大。使用动态分配(strdup(3)
和朋友,确保在完成字符串后free(3)
!)以减少内存使用。