【发布时间】:2016-05-03 09:05:47
【问题描述】:
如果出现错误,我想在我的编译器中生成一条错误消息,例如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 的扩展中创建了 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);
【讨论】:
这很简单。您会在错误信息中获得行号和字符位置。使用它来定位输入中的位置。然后前后扫描换行。这些换行符之间的文本是您的源代码行。
【讨论】: