2013-02-02 17 views
1

所以我用flex從我的lex代碼生成一個c文件,然後使用gcc創建相應的實際解析器.exe。但是,我無法弄清楚如何讓它從我自己輸入的內容中讀取。我試圖讓它解析一個巨大的字典文件。誰能幫忙?Flex:使用文本文件作爲輸入流

+0

'程序<龐大的詞典,file'會做短期的伎倆;這是輸入重定向。您必須設置輸入函數,使其從您選擇的文件中讀取而不是標準輸入(這是默認源的合理選擇)。我將需要檢查機制...... Flex和Lex中的機制是不同的。 –

回答

4

你有兩種解決方法。首先是重新從標準輸入輸入與命令提示符<操作:

> parser.exe < some_file.txt 

另一個解決辦法是讓該程序打開該文件,並告訴詞法分析器是什麼文件。欲瞭解更多信息,請參閱the Flex manual。重要功能是yy_create_bufferyy_switch_to_buffer

+0

還有一些其他相關部分,例如關於EOF處理和yywrap的部分。 YY_INPUT宏是答案的一部分。儘管如此,該手冊指出,作爲一個整體來處理問題。 –

7

嘗試將以下代碼添加到* .l文件中。

int main(int argc, char *argv[]) 
{ 
    yyin = fopen(argv[1], "r"); 
    yylex(); 
    fclose(yyin); 
} 
2

添加到由@Eliko上面的回答,而使用Flex與YACC /野牛,你可以在你grammar.y文件的全局部分定義FILE *yyin;。生成的lex.yy.c中的定義默認爲extern FILE *yyin。因此,在你的grammar.y,做這樣的事情:

/* Some other global definitions */ 
FILE *yyin; 
%% 
/* Grammar rules*/ 
/* Grammar rules*/ 
%% 
void main(int argc, char **argv) { 
    /* Process command line args*/ 
    yyin = fopen("input.c", "r"); 
    yyparse(); 
    fclose(yyin); 
    return 0; 
}