2011-04-21 98 views
1

我使用ANTLR3與C運行時阻塞。有沒有辦法來處理規則捕獲所有ANTLR異常類型[...]

我想要做一些自定義的錯誤處理。我真正追求的是,​​如果在子規則中存在任何類型的antlr匹配異常,我想告訴ANTLR跳過嘗試處理它,讓它滲透到更全局的規則。

在這條規則,我會記錄它,然後嘗試重新開始。

我設置像這樣的規則捕獲方法,使所有的規則將不會嘗試恢復。

@rulecatch 
{ 
    if (HASEXCEPTION()) 
    { 
    PREPORTERROR(); 
    } 
} 

這使我可以在我想要的規則中插入catch處理程序。

在我感興趣的規則,我可以再使用捕捉語法像這樣:

catch [ANTLR3_RECOGNITION_EXCEPTION] 
{ 
    PREPORTERROR(); 
    RECOGNIZER->consumeUntil(RECOGNIZER,RCURLY); 
    CONSUME(); 
    PSRSTATE->error = ANTLR3_FALSE; 
    PSRSTATE->failed = ANTLR3_FALSE; 
    } 

的問題是,這種語法似乎只能讓我趕上一個類型的異常。我希望能夠捕獲所有異常類型。

有沒有辦法做到這一點?

我以爲我可以重載所有的恢復功能,但隨後一些代碼生成的異常,像這樣:

    CONSTRUCTEX(); 
        EXCEPTION->type   = ANTLR3_NO_VIABLE_ALT_EXCEPTION; 
        EXCEPTION->message  = (void *)""; 
        EXCEPTION->decisionNum = 23; 
        EXCEPTION->state  = 0; 


        goto rulewhenEx; 

,這意味着我需要捕獲所有可能的異常。

任何想法??

回答

2

我已經結束了嘗試此兩種解決方案。

方法1)

重載rulecatch設置爲例外類型設置爲一個特定類型的

@rulecatch 
{ 
    if (HASEXCEPTION()) 
    { 

    // This is ugly. We set the exception type to ANTLR3_RECOGNITION_EXCEPTION so we can always 
    // catch them. 
    PREPORTERROR(); 
    EXCEPTION->type = ANTLR3_RECOGNITION_EXCEPTION; 
    } 
} 

這讓我用一個catch塊,因爲所有的異常將是此類型。

方法2)

我只是用多個catch塊,他們都派遣一個共同的功能來處理錯誤

catch [ANTLR3_RECOGNITION_EXCEPTION] 
{ 
    handleException(); 
} 
catch [ANTLR3_MISMATCHED_TOKEN_EXCEPTION] 
{ 
    handleException(); 
} 
.... 
相關問題