Java中的语法检查

我目前正在开发一个具有嵌入式文本编辑器的程序。 用户应该在编辑器中键入java代码。 然后将编入编辑器的代码转换为字符串。 我只想要一些能够检查缺失括号或没有捕获的尝试等等。它不需要编译。 我已经看了很多,但我仍然是编程的新手,无法实现一些更难的东西。

所以为了缩短它:我正在寻找一些可以分析代码中的语法错误的java包。

从Java 6开始,您可以使用JavaCompiler编译文本并返回诊断对象,告诉您文件有什么问题(如果有的话)。 因此,对于您的示例,您需要获取编辑器的内容并将其传递给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 check(String file) { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); Iterable compilationUnits = fileManager.getJavaFileObjectsFromStrings(Arrays.asList(file)); DiagnosticCollector diagnostics = new DiagnosticCollector(); compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits).call(); List messages = new ArrayList(); 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 ] 

这在Eclipse和Netbeans中非常标准。

如果你想要一个带括号检查的漂亮,简单的编辑器,我会投票给Sublime文本 。

你可以看看Beanshell解释器。 它可以解释Java代码(完整的源文件和代码片段)并报告语法错误。

假设您要validation用户是否输入了具有正确语法的java代码,那么您可以直接从程序中调用javac编译器。

 public int com.sun.tools.javac.Main.compile(String[] args); 

您需要在类路径中使用tools.jar。

您可以使用JDT来解析和分析源代码。

这是scala的例子。 用java做同样的事情也很容易:

 val str = "..." // Checking source code val parser : ASTParser = ASTParser.newParser(org.eclipse.jdt.core.dom.AST.JLS3) val options = JavaCore.getOptions.asInstanceOf[java.util.Map[Object, Object]] options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_7) options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_7) options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_7) parser.setCompilerOptions(options) parser.setSource(str.toCharArray) val cu: CompilationUnit = parser.createAST(null).asInstanceOf[CompilationUnit] 

CompilationUnit有方法getProblems()。 它返回详细问题报告的列表。

您可以将eclipse语法检查器嵌入到您的程序中。

我建议1) CheckSyntax ,“一种帮助程序员编写符合编码标准的Java代码的开发工具。” 它有许多标准检查 ,以及2) FindBugs ,“一个使用静态分析来查找Java代码中的错误的程序。”