在我最開始使用Bison-flex時,出於某些原因,涉及到題目這個問題。在此來說明一下該如何操作。
如有錯漏,還望指摘。
首先,《Flex與Bison中文版》中說明了,Bison-Flex一般以FILE*
變量yyin
作爲指定輸入,如果沒有特別指定,yyin
默認爲標準輸入。所以當我們想分析文件中的內容的時候,就不得不涉及,如何來更改輸入源呢,改成某個文件,或者指定的字符串變量?
-
改成指定文件:
這裏用到了yyrestart
函數。這個函數的作用就是將輸入源改爲指定文件。具體用法如下:FILE* f; f = fopen("dir", "r); //打開文件 yyrestart(f); yylex();
-
將輸入源改成指定字符串:
這裏需要用到yy_switch_to_buffer
函數。這個函數的作用是將輸入源改爲指定的緩存。首先需要創建緩存,類型爲
YY_BUFFER_STATE
(其在Flex生成的文件中定義,是struct
yy_buffer_state*
型變量),再用yy_scan_string
函數將字符串掃描進緩存中。最後用yy_switch_to_buffer
來更換到新的緩存。在詞法分析後,還需要使用
yy_delete_buffer
函數和yylex_destroy
函數來析構內存。具體方法如下:
int parser(char* input) { //創建緩存,並將字符串掃描進緩存中 YY_BUFFER_STATE bp = yy_scan_string(input); //分配失敗 if (bp == nullptr) { cout << "error on creating YY_BUFFER_STATE" << endl; return -1; } //將輸入源轉爲指定內存 yy_switch_to_buffer(bp); //詞法語法分析 yyparse(); //清理內存 yy_delete_buffer(bp); yylex_destroy(); return 0;