gpt4 book ai didi

c - lex yacc yytext 标记大小

转载 作者:太空宇宙 更新时间:2023-11-04 02:49:43 26 4
gpt4 key购买 nike

我有一个程序正在使用 LEX 和 YACC 处理一些句子。我最初是在带有 lex 2.5.35 和 bison (GNU bison) 2.5 的 Debian 机器上开发的。我已将代码迁移到 CentOS 服务器,我在其中安装了 lex 2.5.35 和 bison (GNU Bison) 2.4.1。在开发服务器中,一切都运行良好

当我收到长 token (超过 1000 个字符)时,我看到了一些奇怪的行为。每个 char 数组都定义了足够长的时间来支持这一点,但我看到当 yytext 得到这个长字符串时,其他数组被更改(我认为缓冲区溢出)。

这是有道理的还是我误解了什么?

yytext 的长度是多少?能否重新定义?

最佳答案

除非您在 flex 输入文件中明确设置 %array 选项(这不是一个好主意[1]),否则 yytext 没有固定大小。通常,它只是包含 token 的输入缓冲区的一部分,这就是为什么如果您需要保留 token 的,您必须在再次调用词法分析器之前复制 yytext字符串表示。 (我怀疑你的问题是没有这样做的结果。)

由于 flex 通常以固定长度的片段读取输入,因此一个标记有可能跨越两个或多个缓冲区。在那种情况下,flex 需要将 token 的第一部分复制到缓冲区 [2] 的开头,可能使用 realloc 使缓冲区更大,然后从输入中读取以填充其余部分缓冲区。这部分 flex 逻辑没有优化,因为它相对不常见;特别是,在继续下一个输入字符之前会重新扫描整个当前标记,如果您有大标记和小输入缓冲区,这可能会大大降低速度。

正如我所说,明显的缓冲区损坏的最常见原因始终是无法复制 yytext。如果您需要保留 yytext 的值,则必须这样做:

  1. 在从 yylex 返回之前,以及

  2. 在调用 unput 之前(如果您使用此功能)。


注意事项

[1] 如果您确实指定了 %array,则 flex 无法扩展缓冲区,并且最大标记大小略小于 YYLMAX。默认情况下,YYLMAX 约为 8k,但它是一个宏,您可以在 flex 序言中重新定义它。但是,没有充分的理由指定此选项;它所做的只是减慢您的扫描仪速度并限制 token 的大小。该选项的存在是为了与旧版本的 lex 兼容;一些旧软件对 yytext 进行了一些改动,而这对 flex 是不可能的。

[2] 实际上,到 缓冲区的开头,因为只有一个缓冲区。缓冲区中存在的任何旧标记都将被覆盖,这是需要复制 yytext 的另一个原因。

关于c - lex yacc yytext 标记大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23392461/

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