更改Bison-Flex的輸入源

在我最開始使用Bison-flex時,出於某些原因,涉及到題目這個問題。在此來說明一下該如何操作。
如有錯漏,還望指摘。

首先,《Flex與Bison中文版》中說明了,Bison-Flex一般以FILE*變量yyin作爲指定輸入,如果沒有特別指定,yyin默認爲標準輸入。所以當我們想分析文件中的內容的時候,就不得不涉及,如何來更改輸入源呢,改成某個文件,或者指定的字符串變量?

  1. 改成指定文件
    這裏用到了yyrestart函數。這個函數的作用就是將輸入源改爲指定文件。具體用法如下:

    FILE* f;
    f = fopen("dir", "r); //打開文件
    yyrestart(f);
    yylex();
    
  2. 將輸入源改成指定字符串
    這裏需要用到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;
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章