我在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)!)以减少内存使用量。

09-30 14:49
查看更多