1

我有一個ANTLR固定節點,而不是錯誤的節點產生,使用C靶Java解析器和它工作得很好。問題是我也希望它解析錯誤的代碼併產生一個有意義的AST。如果我爲它提供一個帶有一個導入的最小Java類,之後缺少一個分號,它會生成兩個「樹錯誤節點」對象,其中導入類的令牌和令牌應該是。AST在ANTLR

但由於它正確地解析下面的代碼,併產生正確的節點爲這個編碼它必須從錯誤通過將分號或通過重新同步恢復。有沒有辦法讓antlr反映它在AST內部產生的固定輸入?或者我可以至少得到產生「樹節點錯誤」的令牌/文本?

在C目標 antlr3commontreeadaptor.c圍繞線200下面的代碼片段顯示,C靶只創建虛擬錯誤節點至今:

static pANTLR3_BASE_TREE 
errorNode        (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_TOKEN_STREAM ctnstream, pANTLR3_COMMON_TOKEN startToken, pANTLR3_COMMON_TOKEN stopToken, pANTLR3_EXCEPTION e) 
{ 
    // Use the supplied common tree node stream to get another tree from the factory 
    // TODO: Look at creating the erronode as in Java, but this is complicated by the 
    // need to track and free the memory allocated to it, so for now, we just 
    // want something in the tree that isn't a NULL pointer. 
    // 
    return adaptor->createTypeText(adaptor, ANTLR3_TOKEN_INVALID, (pANTLR3_UINT8)"Tree Error Node"); 
} 

難道我的運氣在這裏,只有錯誤的節點在Java目標產生將允許我檢索錯誤節點的文本?

+0

我認爲你應該刪除C標籤,因爲這似乎不是使用或理解C的問題。你應該添加解析器或解析標籤。 – nategoose 2010-05-14 17:36:15

回答

0

我通過添加新的規則交替的語法針對所有可能的錯誤語句解決了這個問題。

每個Java import語句被轉換到與人造符號導入爲根例如一個AST樹。爲了確保我可以的AST之間的正確和錯誤的代碼區分的錯誤言論的規則他們改寫爲與前綴ERR_根符號的AST,所以在import語句的例子中,人工根符號是ERR_IMPORT。

可以使用更多不同的根符號來編碼關於分析錯誤的更詳細的信息。

我的語法分析器現在可以像我所需要的那樣容錯了,並且在我需要的時候添加新的錯誤輸入規則非常簡單。不過,你必須小心,不要在你的語法中引入任何含糊之處。

0

我沒有用ANTLR多,但通常你處理這種類型的錯誤的方法是添加規則匹配錯誤的語法,使他們產生錯誤的節點,並嘗試錯誤後,修復起來,這樣就可以保持解析。之後解決問題是因爲您不希望一個錯誤爲每個新的令牌觸發越來越多的錯誤直到結束。