lex / flex是否可以在使用yy_create_buffer(yyin,YY_BUF_SIZE)创建缓冲区后正确解析`FILE yyin`中的所有标记?

问题描述 投票:1回答:1

在lex / flex中,有一个函数yy_create_buffer,例如:

bp = yy_create_buffer(yyin,YY_BUF_SIZE );

bp创建缓冲区FILE yyin,大小为YY_BUF_SIZE

我想知道FILE yyin是否太大,以致YY_BUF_SIZE无法包含所有文本,lex / flex是否可以正确解析所有标记?

file buffer flex-lexer lex
1个回答
1
投票

伸缩缓冲区存储一部分输入以及足够的信息以继续处理输入。您不必担心有多少输入。

原始lex扫描器未缓冲。它只读取一次输入的一个字符,从而在字符数组yytext中建立当前令牌。当令牌不太大时,这种方法可以很好地工作,但这不是最有效的解决方案。因此,flex尝试通过一次读取数据缓冲区来加快扫描速度。 Flex还避免了仅通过直接使用缓冲区中的数据来复制每个令牌的麻烦;在flex中,yytext是指向缓冲区的指针,而不是一个单独的数组。

除了加快输入处理的速度之外,弹性缓冲区还为您提供了许多额外的功能,包括提供内存中缓冲区的能力以及可用于处理#include指令之类的缓冲区堆栈的功能。

唯一的内存限制是令牌的大小。每个令牌在处理时必须适合内存。当模式扫描到达缓冲区的末尾时,flex将首先将令牌移至缓冲区的开头,然后在必要时尝试调整缓冲区的大小。

您在调用yy_create_buffer时提供的大小是初始缓冲区大小,而不是其限制。面对巨大的令牌,Flex将在必要时继续扩展缓冲区,直到内存分配失败为止。显然,从理论上讲,令牌可能太大而不可能。因此,如果期望输入流包含PB级数据,请不要使用(.|\n)+这样的模式。 :-)

在原始lex yytext中是一个数组,而不是一个指针,无法调整大小,并且编译时数组大小对令牌长度设置了固定的限制。 Flex在这方面是一种改进,但它并未针对大型令牌进行优化,并且当您的应用程序尝试将兆字节的数据作为单个令牌处理时,存在一些性能问题。

© www.soinside.com 2019 - 2024. All rights reserved.