0

我正在使用 lex 和 yacc 创建一个程序来解析文本,但我需要创建一个各种内容的解析器。我不希望使用标准输入,如果我使用 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); 
}
4

3 回答 3

2

在符合 POSIX-2008 的系统(和 Linux)上,您可以使用它fmemopen来获取FILE*内存缓冲区的句柄。

于 2013-03-13T16:53:19.577 回答
1

您可以使用三个参数定义YY_INPUT宏:buffer、result、max_size,其中:

  • 缓冲区 - 带有缓冲区的输入,用于读取数据,
  • 结果 - 输出以存储读取的字节数
  • max_size - 缓冲区大小的输入

只需使用 header 或 inline 在 Lex 文件中包含宏定义,它将被使用而不是 fread(...)

于 2013-03-13T16:58:48.597 回答
0

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

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

于 2013-03-13T17:00:01.293 回答