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