0

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); 
}
4

3 に答える 3

2

POSIX-2008 準拠のシステム (および Linux) では、 を使用してメモリ内バッファーfmemopenのハンドルを取得できます。FILE*

于 2013-03-13T16:53:19.577 に答える
1

YY_INPUTマクロは、buffer、result、max_sizeの3つの引数で定義できます。ここで、

  • buffer-データを読み取る場所をバッファ付きで入力します。
  • 結果-読み取られたバイト数を格納するための出力
  • max_size-バッファサイズの入力

ヘッダーまたはインラインを使用してLexファイルにマクロ定義を含めるだけで、fread(...)の代わりに使用されます。

于 2013-03-13T16:58:48.597 に答える
0

あなたは本当に質問を明確に述べていませんが、データが読み取られるときに char * が指す文字列の内容を返す FILE * を作成したいと仮定します。fdopen単純にパイプを作成してから、読み取り側で呼び出すことができます。書き込みがブロックされてデッドロックが発生する可能性があるため、書き込み側にデータを書き込むだけでは少し危険ですが、子を fork して、子にデータをパイプに書き込むことはできます。

一方、一時ファイルを作成しない本当の理由はありません。ファイルを読み取った後にファイルのリンクを解除すると仮定すると、データがディスクに移動する可能性はほとんどありません (OS はそれをメモリに保持します)。 本当に心配なら、RAM ディスク上のパスを使用できます。

于 2013-03-13T17:00:01.293 に答える