我在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时,运行时间受到了不利影响。您能否说明可能发生的事情?
谢谢
最佳答案
描述%token
(怪物%union
)的并集必须初始化,并且可以由解析器复制。它甚至应该显示为解析器堆栈的一部分。每次解析器执行某项操作时,只要在这种巨大的字符串周围改组,就会在整个地板上降低性能。
lex / flex / yacc / byacc / bison / ...设计用于处理典型的编程语言,其中标识符长几个字符。如果您确实需要这样的限制,那么可能是罕见的字符串变得那么大。使用动态分配(strdup(3)
和朋友,使用字符串完成后,请确保free(3)
!)以减少内存使用量。