2017-03-12 53 views
0

時,我有下面的C函數來捕獲由ANTLR拋出識別錯誤:ANTLR:得到錯誤行號解析多行文本

void recognition(pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_UINT8 *list) 
{ 
    pANTLR3_PARSER parser; 
    pANTLR3_EXCEPTION exception; 


    parser = (pANTLR3_PARSER) (recognizer->super); 
    exception = recognizer->state->exception; 

    printf("%d\n", exception->line); // ALWAYS PRINTS 1 (WHICH IS WRONG) 
} 

如果一個解析(帶ANTLR)多行文本在第一行有一個錯字,recognition函數將打印「1」(這是正確的)。但是,如果錯字發生在第一行後(即> = 2),則recognition函數始終打印「1」(這是錯誤的)。

問題是:如何在打印解析錯誤的地方打印正確的行號(建議:每次解析新行標記時,是否必須更新語法以增加特定的ANTLR計數器)?

+0

調試解析器以查看發生了什麼。行信息通常來自導致分析錯誤的標記。這是你期望的標誌嗎?它是否有正確的線路信息? –

回答

0

一個可能的原因是你的問題的根源所在可能是從解析器的不同看法 - 認爲這種語法:

start : rule1 | rule2; 
rule1 : 'A' 'B'; 
rule2 : 'A' 'C'; 

,並輸入:

A 
A 

從我們的角度來看,它可能看起來問題是在第2行,因爲第一行的A對於這兩種選擇都是正確的。但解析器需要決定在第一行上已經選擇了哪種替代方法,並且如果兩種替代方式都不匹配,那麼將在輸入中的那一點拋出異常,該輸入仍處於第一行。

左分解語法可能有幫助:現在

start : 'A' (rule1 | rule2); 
rule1 : 'B'; 
rule2 : 'C'; 

,「A」將匹配才把NoViableAlt異常將在第二行拋出輸入。