2013-03-13 74 views
0

我使用lex和yacc来创建程序来解析文本,但是我需要创建各种内容的解析器。我不希望使用stdin,如果我使用FILE * yyin指定输入,我可以更改源。我需要从库解析(使用lex文件和yacc文件创建)来调用该函数来解析此内容并接收结果。如何在不创建临时文件的情况下从char *创建FILE *

/** 
* 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); 
} 
+1

'char *'是文件名还是您想要解析的实际文本? – 2013-03-13 16:55:20

+0

可能的重复[字符串输入到flex词法分析器](http://stackoverflow.com/questions/780676/string-input-to-flex-lexer) – 2013-03-13 16:56:29

回答

2

在符合POSIX标准的2008系统(在Linux),你可以使用fmemopen获得上内存缓冲区FILE*手柄。

+0

简单和客观,正是我需要的。 – 2013-03-13 17:11:58

1

可以定义三个参数YY_INPUT宏:缓冲液,结果,MAX_SIZE,其中:

  • 缓冲器 - 输入用缓冲液,其中读取数据,
  • 结果 - 输出到字节的存储数读
  • MAX_SIZE - 输入与缓冲区的大小

只需在您的莱克斯文件中的宏定义使用页眉或内联,它会被用来代替FREAD(...)

+0

我不知道这个选项,谢谢,那不是我当时需要的,但我认为它将在未来帮助我很多。 – 2013-03-13 17:14:11

0

你真的没有清楚地说明你的问题,但我打算假设你想创建一个FILE *,当从中读取数据时,它将返回char *所指向的字符串的内容。您可以简单地创建一个管道,然后在读取端调用fdopen。将数据写入写入端是有点危险的,因为写入可能会阻塞并导致死锁,但是您当然可以派生一个孩子并让孩子将数据写入管道。

另一方面,没有真正的理由不创建临时文件。假设在读取文件后你要取消链接,那么数据很少有机会进入磁盘(操作系统会将它保存在内存中)。如果你真的担心可以在RAM磁盘上使用路径。

相关问题