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