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

ANTLR: get error line number when parsing a multi-line text

我有以下 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)解析第一行有拼写错误的多行文本,recognition 函数将打印“1”(这是正确的)。然而,如果错字出现在第一行之后(即 >= 2),recognition 函数总是打印“1”(这是错误的)。

问题是:如何在解析错误所在的位置打印正确的行号(建议:每次解析换行标记时,我是否必须更新语法以增加特定的 ANTLR 计数器)?

一个可能的原因是您对问题所在的看法可能与解析器的看法不同 - 考虑以下语法:

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

并输入:

A
A

从我们的角度来看,问题似乎出在第 2 行,因为第一行的 A 对于两种备选方案都是正确的。但是解析器需要在第一行决定选择哪个选项,如果两个选项都不匹配,NoViableAlt 异常将在输入的那个点被抛出——它仍然在第 1 行。

左分解语法可能有帮助:

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

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