2013-03-13 107 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磁盤上使用路徑。

相關問題