ANTLR4:错误消息,包含完整的有问题的源代码行

ANTLR4:错误消息,包含完整的有问题的源代码行,antlr4,error-reporting,Antlr4,Error Reporting,如果出现错误,我想在我的编译器中生成一条错误消息,如clang,其中包含完整的有问题的源代码行 例如: 1.c:3:7: error: use of undeclared identifier 'x' if ( x== y) { ^ 我已经扩展了ANTLR BaseErrorListener,但我不知道 如何将有问题的源代码行(除了行号)作为字符串获取。这是一件简单的事情。您可以在错误信息中获得行号和字符位置。使用它来定位输入中的位置。然后前后扫描换行符。这些换行符

如果出现错误,我想在我的编译器中生成一条错误消息,如clang,其中包含完整的有问题的源代码行

例如:

1.c:3:7: error: use of undeclared identifier 'x'
    if ( x== y) { 
         ^
我已经扩展了ANTLR BaseErrorListener,但我不知道
如何将有问题的源代码行(除了行号)作为字符串获取。

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

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

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);