将yyin设置为“模拟”文件*?

时间:2013-06-10 04:04:00

标签: c++ c yacc stdio

我有一个C库,我想从C ++代码接口而不修改库。它有一个yacc生成的前端,从yyin读取,这是一个FILE *。我想将yyin设置为从内存中读取的FILE *的某种仿真。是否有希望以便携式(Linux,Mac,Windows)方式执行此操作 - 或者是否有另一种方法可以从内存而不是FILE *读取此类解析器?

2 个答案:

答案 0 :(得分:4)

您可以在Linux上使用fmemopen()。不幸的是,不仅没有可移植的方法来做到这一点,但是再次,fopen()甚至不是真正可移植的(它在Windows上已经被打破了很久)。

但是,如果您的标记生成器是Flex,则可以使用yy_scan_buffer()。请参阅String input to flex lexer

答案 1 :(得分:2)

yacc扫描程序通常会通过词法分析器获取令牌,并调用名为yylex的函数。

词法分析器通常从输入文件(或缓冲区,在您的情况下)中读取字符。假设您使用Flex生成词法分析器,通常用于修改输入读取方式的“钩子”是重新定义YY_INPUT宏。

正如@dietrich Epp所提到的,还有yy_scan_string,yy_scan_buffer和yy_scan_bytes。这些是否比定义您自己的YY_INPUT更适合您的目的可能会有一些问题。虽然我不记得任何细节,但我的回忆是因为(至少被认为)缺乏效率而有时避免它们(或者可能只是因为在我看来YY_INPUT定义更容易 - 可以'记得肯定)。