gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:01:03 34 4
gpt4 key购买 nike

我在 yacc 文件中定义了一个 union

%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 (你的怪物 %union)必须被初始化,并且可以被解析器复制。它甚至应该作为解析器堆栈的一部分出现。每次解析器做某事时,只是围绕着如此巨大的字符串乱序移动,就会让性能大打折扣。

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

关于c++ - 字符串大小如何影响 lex 和 yacc 中的运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22466335/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com