Java中的语法检查

我目前正在开发一个带有嵌入式文本编辑器的程序。用户应该在编辑器中键入Java代码。然后,将输入编辑器中的代码制成字符串。我只想要一些可以检查缺少括号的内容或不带钩子的尝试,等等。它不需要编译。我已经看了很多遍,但是我还是编程新手,无法实现一些较难的东西。

因此,使其更简短:我正在寻找一些Java软件包,该软件包将分析代码中的语法错误。

回答:

从Java

6开始,您可以使用JavaCompiler编译文本并取回Diagnostic对象,这些对象将告诉您文件有什么问题(如果有)。因此,对于您的示例,您需要获取编辑器的内容并将其传递给JavaCompiler,运行它,并报告所有问题。以下示例假定将编辑器文本写到文件中。

示例代码:

public class HelloBuggyWorld {

String test // missing a semicolon

public static void main (String [] args) {

System.out.println('Hello World!'); // should be double quoted

}

}

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Formatter;

import java.util.List;

import java.util.Locale;

import javax.tools.Diagnostic;

import javax.tools.DiagnosticCollector;

import javax.tools.JavaCompiler;

import javax.tools.JavaFileObject;

import javax.tools.StandardJavaFileManager;

import javax.tools.ToolProvider;

public class JavaSyntaxChecker {

public static void main(String[] args) {

System.out.println(JavaSyntaxChecker.check("/path/to/HelloBuggyWorld.java"));

}

public static List<String> check(String file) {

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);

Iterable<? extends JavaFileObject> compilationUnits =

fileManager.getJavaFileObjectsFromStrings(Arrays.asList(file));

DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();

compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits).call();

List<String> messages = new ArrayList<String>();

Formatter formatter = new Formatter();

for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {

messages.add(diagnostic.getKind() + ":\t Line [" + diagnostic.getLineNumber() + "] \t Position [" + diagnostic.getPosition() + "]\t" + diagnostic.getMessage(Locale.ROOT) + "\n");

}

return messages;

}

}

从运行main方法。

[ERROR:  Line [5]    Position [124] HelloBuggyWorld.java:5: unclosed character literal

, ERROR: Line [5] Position [126] HelloBuggyWorld.java:5: ';' expected

, ERROR: Line [5] Position [131] HelloBuggyWorld.java:5: not a statement

, ERROR: Line [5] Position [136] HelloBuggyWorld.java:5: ';' expected

, ERROR: Line [5] Position [137] HelloBuggyWorld.java:5: unclosed character literal

]

以上是 Java中的语法检查 的全部内容, 来源链接: utcz.com/qa/406255.html

回到顶部