2013-07-12 43 views
0

我使用flex &野牛解析自定義語言,我在這裏描述的情況:http://www.gnu.org/software/bison/manual/html_node/How-Can-I-Reset-the-Parser.html。 爲了更準確錯誤輸入緩衝區重置後錯誤

我調用yyparse幾次,並在正確的輸入它的工作原理 正常;但是當發現解析錯誤時,所有其他調用也會失敗 。我怎樣才能重置yyparse的錯誤標誌?

我的解析器和掃描程序在一個單獨的線程中運行,但只有一個線程處理輸入文件。在我的理解中,我不需要編寫一個可重入的掃描器,因爲只有一個線程處理輸入文件。在該頁面中,問題已清楚解釋,但解決方案對我而言並不明確。 它說:

因此,當你改變yyin中,你必須告訴萊克斯產生 掃描器放棄其當前的緩衝區,並切換到新的一個。這 取決於您的Lex的實施;請參閱其文檔 瞭解更多。對於Flex,在每個 更改爲yyin後調用「YY_FLUSH_BUFFER」就足夠了。如果您的Flex生成的掃描儀需要讀取 幾個輸入流來處理像包括文件的功能,你可能會 考慮使用像「yy_switch_to_buffer」那 操作多個輸入的Flex功能緩衝

我的解析器線程調用yyparse在爲了建立我的AST。我不清楚什麼時候和哪裏需要調用yy_flush_buffer來解決問題。在我的理解中,掃描器代碼(由Flex生成)由解析器代碼調用(由Bison生成)。 Bison生成的代碼由語法生成。因此解析器代碼不在我的直接控制之下。這意味着我不能將對yy_flush_buffer的調用包含到解析器代碼中,因爲每次我通過語法生成解析器代碼時都會覆蓋它。這意味着我應該把yy_flush_buffer放在grammr文件的某個地方。但是哪裏?

回答

0

我這樣做解決了這一問題:

... 
FILE *f = fopen(_filename, "r"); 
yyrestart(f); 
yyparse(); 
... 

我離開這個問題,因爲它可能是爲其他人有用。