2013-05-17 60 views
0

我已經設置了一個可以通過yyparse運行和解析並且可以在repl類型系統內使用的flex/bison系統。當用戶進入某種狀態(說:定義一個方法),並且發生了一個systax錯誤時,我正在尋找一種方式來處理這種情況,野牛可以像用戶從未進入線路。手動保存並恢復解析器狀態

例如:

1> class foo { <enter> 
2> a = 1; <enter> 
3> asfasdfa <enter> 

在這種情況下,解析器應該返回到之前閱讀的最後一行是狀態。現在,它會觸發一個語法錯誤並倒回整個堆棧。我知道bisons yyparse()函數有一些本地堆棧狀態值(yyvsp,yyssp和yylsp),用於狀態跟蹤,但似乎沒有辦法修改這些標準功能以外的內容,如YYERROR等。

我的問題是:是否可以在野牛中完成這些保存/恢復狀態,如果不能,處理這些錯誤的最佳方法是什麼?

回答

1

野牛沒有保存和恢復解析器狀態的功能。你可以通過逆向工程來創建一個野牛骨架,但這將是很多工作,並且它也會非常脆弱,因爲野牛的運行時可能會在沒有通知的情況下發生變化。 (公平起見,你不必強迫更新野牛,但你可能希望靈活性能夠這樣做。)

但是,解析速度非常快。在REPL環境中,您不會注意到解析時間。所以沒有什麼能夠阻止你簡單地從一開始就重新輸入輸入,直到錯誤之前的行。

但是,有一個問題:野牛解析器不一定會檢測到語法錯誤,直到讀取到標記爲止(儘管有時候取決於錯誤的確切性質)。所以你不能確定最後一行是否是實際包含語法錯誤的行。

+0

我不是100%確定,如果正確的方式來實現repl是我建議的方式。例如,我只能檢測從用戶行開始直到錯誤的狀態。但是如果有一個yystate_copy()接口,那麼線上的其他規則實際上可能成功(例如:「i = 1; b =;」) – JayTaph

0

你應該看看Bison推送解析器,他們可能會爲你提供你正在尋找的控件。

http://www.gnu.org/software/bison/manual/html_node/Push-Decl.html

+0

,那麼它將提供OP正在尋找的內容。但似乎並沒有這樣的事情。當然,複製堆棧很棘手,因爲它可以包含任意的用戶對象,所以我可以理解爲什麼這樣的接口不存在。在REPL的情況下,解析點檢查是過度工程,但如果您正在尋找功能請求,可能會有一些用處。 – rici