如何为 lex 和 yacc 指定输入缓冲区?

How do I specify an input buffer to lex and yacc?

我必须使用 lex 和 yacc 创建一个汇编程序,但我必须从一个 c 文件向 lex 提供输入,我在其中有我的主要功能。但是我该怎么做呢?

我只有一个缓冲区。

char *buffer;

但我想知道如何将该缓冲区传递给 lex。

我只是希望从 "C" 文件中为 lex 提供一个缓冲区。 我想要一个例子来说明如何这样做。 谢谢

从缓冲区扫描非常简单,但几乎可以肯定不是您想做的。

如果您想从文件中扫描,只需打开文件进行读取,将 fopen 调用的值保存到 yyin 中。确保检查 fopen 是否成功,因为如果 yyin 最终为 NULL(这是 fopen 失败时会发生的情况),那么扫描器将从 stdin.

您需要声明 yyin,除非在输入文件中设置的程序部分包含在与扫描仪定义相同的翻译单元中。声明为:

extern FILE* yyin;

如果你真的想从内存中读取单个字符串,你只需调用

yy_scan_string(buffer);

开始扫描之前。 (还有一个函数同时接受缓冲区地址和长度,您可以将其用于非 NUL 终止且可能包含 NUL 字节的输入:

yy_scan_bytes(buffer, buflen);

但是你提供的buffer必须是整个输入;您不会使用此接口一次读取一行文件。 (有很多方法可以做到这一点,但我真的不认为那是你要找的东西。如果你好奇的话,Multiple Input Buffers section of the Flex manual 中有描述。)