2012-12-09 70 views
2

通過從文件讀取輸入我的野牛/柔性解析器開始:如何解析從字符串解析文件後?

FILE *myfile = fopen(file.c_str(), "r"); 
yyin = myfile; 
yyparse(); 

在之後的某個時候,它會讀取和存儲從一個字符串解析輸入:

yy_scan_string(str.c_str()); 
yyparse(); 
yy_delete_buffer(YY_CURRENT_BUFFER); 

看來工作到目前爲止。但是,當程序需要使用第一個代碼再次讀取和解析文件輸入時,它不起作用(終止於分段錯誤)。有沒有解決這個問題?

回答

3

的問題是,在緩衝你的上面的代碼,Flex的輸入緩衝區(YY_CURRENT_BUFFER)點,第二塊之後,你在yy_scan_string創建用yy_delete_buffer刪除。因此,下一次撥打yylex(從yyparse)可能會因拖動指針而發生崩潰。所以你需要做的就是在調用yy_delete_buffer並且再次調用yyparse之前將緩衝區狀態設置爲yy_switch_to_buffer的有效緩衝區。你可以使用push/pop來做到這一點(儘管代碼確實會泄漏兩個創建的緩衝區,並且永遠不會釋放它們)。或者你可以更直接地保存和恢復從字符串解析的舊緩衝區:

YY_BUFFER_STATE temp = YY_CURRENT_BUFFER; 
yy_scan_string(str.c_str()); 
yyparse(); 
yy_delete_buffer(YY_CURRENT_BUFFER); 
yy_switch_to_buffer(temp);