字符串大小如何影响lex和yacc中的运行时

时间:2014-03-17 21:56:51

标签: c++ yacc lex

我在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时,运行时间会受到不利影响。你能否指出可能发生的事情?

由于

1 个答案:

答案 0 :(得分:1)

描述%token(你的怪物%union)的联合必须被初始化,并且可以被解析器复制。它甚至应该显示为解析器堆栈的一部分。每次解析器执行某些操作时,只需在这些巨大的字符串周围移动即可在场内拍摄性能。

lex / flex / yacc / byacc / bison / ...旨在处理典型的编程语言,其中标识符长度为几个字符。如果你真的需要这样的限制,它可能是罕见的字符串,变得那么大。使用动态分配(strdup(3)和朋友,确保在完成字符串后free(3)!)以减少内存使用。