2014-12-26 57 views
1

我一直在嘗試最近使用Treetop爲我的客戶之一創建CFG DSL語言的簡單解析器。我成功地實現了他所需的所有功能,但與Treetop一起工作竟然是相當痛苦的經歷。提供無用輸出的Treetop解析器錯誤處理機制

問題是我無法從Treetop獲得任何可用的錯誤消息。我得到的唯一輸出是

parser.rb:22:in `parse': Parser error at offset: 0 (Exception) 
Error: 
#<TranLanParser:0x007f960c852f60> 
    from parser.rb:28:in `<class:Parser>' 
    from parser.rb:10:in `<main>' 

它總是指向文件中的第一個字符。在解析語言中發現任何錯誤真的很糟糕。如果我找不到任何問題,我該如何逐步開發解析器?

我試圖改變我的語法來包含遞歸規則,因爲我認爲這將幫助解析器儘快創建AST節點,但它沒有幫助。我的問題是: 我做錯了什麼?有沒有什麼好的例子來說明如何爲Treetop創建PEG語法,它可以在部分派生的樹上提供有意義的錯誤消息?或者它是Treetop庫中的錯誤/錯誤?

感謝您的意見。

回答

2

您是否嘗試過打印parser.failure_reason?這將打印出允許超出解析器達到的最右邊位置(在其回溯之前)的終端列表。

您是否嘗試過使用單個令牌或超簡單語法?

您是否嘗試設置parser.consume_all_input = false,以查看它是否正確解析,但不是輸入的結尾?

還有一些「年輕球員的陷阱」,但你沒有給我們足夠的信息繼續下去。一旦你「明白了」,在Treetop開發是一件輕而易舉的事情,但它可能需要一點時間才能達到這一點。

+0

謝謝,這真的很有幫助。看來,failure_rason提供了一些更好的信息。 –