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
异常。
我有以下 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
异常。