您必须从stdout
和 from解析结果stderr
。在您链接的问题中,您可以找到如何访问它们的解决方案。
您还提到您希望有一个编译器错误的侦听器。
public interface CompilerErrorListener {
public void onSyntaxError(String filename, String functionName,
int lineNumber, int position, String message);
public void invalidOutputLine(String line);
}
您可以使用任何实现来实现这一点:
public class CompilerErrorProcessor implements CompilerErrorListener {
public void onSyntaxError(String filename, String functionName,
int lineNumber, int position, String message) {
....
// your code here to process the errors, e.g. put them into an ArrayList
}
public void invalidOutputLine(String line) {
// your error handling here
}
}
所以,让我们解析编译器输出!(请注意,这取决于您的编译器输出,并且您只提供了 2 行输出)
BufferedReader stdError = ...
String line;
CompilerErrorListener listener = new CompilerErrorProcessor(...);
String fileName = "";
String functionName = "";
int lineNumber = -1;
int position = -1;
String message = null;
while ((line = stdError.readLine()) != null) {
// the line always starts with "filename.c:"
String[] a1 = line.split(":", 2);
if (a1.length == 2) {
// a1[0] is the filename, a1[1] is the rest
if (! a1[0].equals(fileName)) {
// on new file
fileName = a1[0];
functionName = "";
}
// here is the compiler message
String msg = a1[1];
if (msg.startsWith("In ")) {
// "In function 'main':" - we cut the text between '-s
String[] a2 = msg.split("'");
if (a2.length == 3) {
functionName = a2[1];
} else {
listener.invalidOutputLine(line);
}
} else {
// "9:1: error: expected ';' before '}' token"
String[] a2 = msg.split(":", 3);
if (a2.length == 3) {
lineNumber = Integer.parseInt(a2[0]);
position = Integer.parseInt(a2[1]);
message = a2[2];
// Notify the listener about the error:
listener.onSyntaxError(filename, functionName, lineNumber, position, message);
} else {
listener.invalidOutputLine(line);
}
}
} else {
listener.invalidOutputLine(line);
}
}
这不是一个完整的例子,当然,可能还有更多的可能性,但希望你明白了。不要忘记记录无效/未处理的分支。
由于您使用特定的编译器,因此您必须适应其输出。此外,编译器版本的更改可能会导致解析代码的更改。要特别注意发现输出的结构,当你想解析它时它会付出代价。