ANTLR:得到错误行号解析多行文本
问题描述:
时,我有下面的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计数器)?
答
一个可能的原因是你的问题的根源所在可能是从解析器的不同看法 - 认为这种语法:
start : rule1 | rule2;
rule1 : 'A' 'B';
rule2 : 'A' 'C';
,并输入:
A
A
从我们的角度来看,它可能看起来问题是在第2行,因为第一行的A
对于这两种选择都是正确的。但解析器需要决定在第一行上已经选择了哪种替代方法,并且如果两种替代方式都不匹配,那么将在输入中的那一点抛出异常,该输入仍处于第一行。
左分解语法可能有帮助:现在
start : 'A' (rule1 | rule2);
rule1 : 'B';
rule2 : 'C';
,“A”将匹配才把NoViableAlt
异常将在第二行抛出输入。
调试解析器以查看发生了什么。行信息通常来自导致分析错误的标记。这是你期望的标志吗?它是否有正确的线路信息? –