我正在使用lex和yacc创建一个程序来解析文本,但我需要创建一个包含各种内容的解析器。我不希望使用stdin,如果我使用FILE * yyin指定输入,我可以更改源。我需要可以从库解析(使用lex文件和yacc文件创建)调用该函数来解析此内容并接收结果。
/**
* This i don't know is possible, receive a char * and return a FILE*
*/
FILE *function_parse_to_file(char* text){
FILE *fp = NULL;
/**
* is really necessary create a temporary file with content text?
*/
return fp
}
/**
* I need call from other library or application
*/
char *function_parse_from_lex(char* text){
yyin = function_parse_to_file(text);
init();
yyparse();
fclose(yyin);
}
答案 0 :(得分:2)
在符合POSIX-2008标准的系统(以及Linux)上,您可以使用fmemopen
在内存缓冲区中获取FILE*
句柄。
答案 1 :(得分:1)
您可以使用三个参数定义YY_INPUT
宏:buffer,result,max_size,其中:
只需使用标题或内联在您的Lex文件中包含宏定义,它将被用来代替fread(...)
答案 2 :(得分:0)
你真的没有明确说明你的问题,但我假设你想要创建一个FILE *,当从中读取数据时,它将返回char *指向的字符串的内容。您可以简单地创建一个管道,然后在读取端调用fdopen
。将数据写入写入端有点危险,因为写入可能会阻塞并导致死锁,但您可以分叉子进程并让子进程将数据写入管道。
另一方面,没有真正的理由不创建临时文件。假设您在读取文件后要取消链接,那么数据进入磁盘的可能性很小(操作系统会将其保留在内存中)如果您真的担心可以使用ram磁盘上的路径。 / p>