如何在(.y)文件(lex和yacc)中使用yy_scan_buffer。 yy_scan_buffer的返回类型是YY_BUFFER_STATE,它位于lex.yy.c中。
答案 0 :(得分:0)
对于背景:它是一个来自yy_scan_bytes
的特殊函数,它从yy_scan_string
调用(同样可以被覆盖)。
根据 String input to flex lexer ,返回类型对应于应使用yy_delete_buffer
删除的句柄,但yy_scan_buffer
执行删除操作。但是(查看生成的代码),这似乎不正确 - 也许这取决于所使用的flex版本。
根据这些问题,您可能希望在编写可重入代码时使用yy_scan_string
等(尽管这些函数优先于flex
上的任何工作以提供重入):
yy_scan_string(const char *str)
(generated by lex yacc) in a separated file Flex目前的文档提到它用于multiple input buffers:
某些扫描程序(例如支持“包含”文件的扫描程序)需要从多个输入流中读取。由于柔性扫描仪执行大量缓冲,因此只需编写对扫描上下文敏感的
YY_INPUT()
,就无法控制下一个输入的读取位置。YY_INPUT()
仅在扫描程序到达其缓冲区末尾时调用,这可能需要很长时间才能扫描诸如需要切换输入源的include语句之类的语句。
文档继续提供使用示例。根据您的想法,这些可能会有用。