ANTLR:解析多行文本时获取错误行号

ANTLR:解析多行文本时获取错误行号,antlr,antlr3,Antlr,Antlr3,我使用以下C函数来捕获ANTLR引发的识别错误: void recognition(pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_UINT8 *list) { pANTLR3_PARSER parser; pANTLR3_EXCEPTION exception; parser = (pANTLR3_PARSER) (recognizer->super); exception = recognizer->st

我使用以下C函数来捕获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)第一行有打字错误的多行文本,则
识别
功能将打印“1”(这是正确的)。但是,如果输入错误出现在第一行之后(即>=2),则
识别
函数始终打印“1”(这是错误的)


问题是:如何打印解析错误所在的正确行号(建议:每次解析新行标记时,是否必须更新语法以增加特定的ANTLR计数器)一个可能的原因是你对问题的理解可能与解析器不同的地方-考虑这个语法:

start : rule1 | rule2;
rule1 : 'A' 'B';
rule2 : 'A' 'C';
和输入:

A
A
从我们的观点来看,问题似乎出在第2行,因为第一行的
A
对两种选择都是正确的。但是解析器需要决定在第一行中已经选择了哪个选项,如果两个选项都不匹配,那么将在输入中的该点(仍然在第1行)抛出
NoViableAlt
exception

对语法进行左分解可能会有所帮助:

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

现在,“A”将被匹配,只有在第二行输入时才会抛出
noviablelt
异常。

调试解析器以查看发生了什么。行信息通常取自导致分析错误的标记。这是你想要的代币吗?它有正确的线路信息吗?