2017-03-12 47 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异常将在第二行抛出输入。