如果出现错误,我想在我的编译器中生成一条错误消息,例如: clang,包含完整的违规源代码行。
示例:
{{1}}
我扩展了ANTLR BaseErrorListener,但我不知道 如何将违规的源代码行(除了行号)作为字符串。
答案 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);