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

时间:2019-04-29 00:00:23

标签: c yacc lex

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

我只有一个缓冲区。

char *buffer;

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

我只是希望从“ C”文件为lex提供一个缓冲区。 我想要一个示例,说明如何执行此操作。 谢谢。

1 个答案:

答案 0 :(得分:1)

从缓冲区进行扫描非常容易,但是几乎可以肯定不是您要执行的操作。

如果要从文件扫描,只需打开文件进行读取,将fopen调用中的值保存到yyin中。确保检查fopen是否成功,因为如果yyin最终为NULL(如果fopen失败,将会发生这种情况),则扫描程序将从{{1} }。

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

yyin

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

extern FILE* yyin;

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

yy_scan_string(buffer);

但是您提供的缓冲区必须是整个输入;您不会使用该界面一次读取一行文件。 (有很多方法可以做到这一点,但我真的不认为这就是您想要的。如果您感到好奇,请在Multiple Input Buffers section of the Flex manual中进行描述。)