ANTLR4:包含完整违规源代码行的错误消息

时间:2016-01-26 17:26:32

标签: antlr4 error-reporting

如果出现错误,我想在我的编译器中生成一条错误消息,例如: clang,包含完整的违规源代码行。

示例:

{{1}}

我扩展了ANTLR BaseErrorListener,但我不知道 如何将违规的源代码行(除了行号)作为字符串。

2 个答案:

答案 0 :(得分:1)

这是一件简单的事情。您在错误信息中获得行号和字符位置。用它来定位输入中的位置。然后向后和向前扫描换行符。这些换行符之间的文本是您的源代码行。

答案 1 :(得分:1)

我在BaseErrorListener的扩展中创建了2个方法。一个获取源代码行,另一个获取“ ^”符号:

private String getSourceLine(String src, int line) {
    String currentLine = "";
    try (Scanner fileScanner = new Scanner(new File(src))) {
        int currentLineNumber = 1;
        while (fileScanner.hasNextLine()) {

            currentLine = fileScanner.nextLine();
            if (currentLineNumber == line) {
                return currentLine + "\n";
            }
            currentLineNumber++;
        }        
    } catch (Exception e) {
        currentLine = "\n";
    }

    return currentLine;
}

private String getPointer(int charPosition) {
    return StringUtils.repeat(' ', charPosition) + '^';
}

致电给他们

    String source = recognizer.getInputStream().getSourceName();

    errorMessage += this.getSourceLine(source, line);
    errorMessage += this.getPointer(charPositionInLine);