我目前正在开发一个具有嵌入式文本编辑器的程序。用户应该在编辑器中键入java代码。然后将编入编辑器的代码转换为字符串。我只想要一些能够检查缺失括号或没有捕获的尝试等等。它不需要编译。我已经看了很多,但我仍然是编程的新手,无法实现一些更难的东西。
所以为了缩短它:我正在寻找一些可以分析代码以解决语法错误的java包。
答案 0 :(得分:17)
从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
]
答案 1 :(得分:1)
如果你想要一个带括号检查的漂亮,简单的编辑器,我会投票给Sublime text。
答案 2 :(得分:1)
您可以查看Beanshell翻译。它可以解释Java代码(完整的源文件和代码片段)并报告语法错误。
答案 3 :(得分:1)
假设您要验证用户是否输入了具有正确语法的java代码,那么您可以直接从程序中调用javac编译器。
public int com.sun.tools.javac.Main.compile(String[] args);
你的班级路径中需要tools.jar。
答案 4 :(得分:1)
您可以使用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()。它返回详细的问题报告列表。
答案 5 :(得分:0)
你可以将eclipse语法检查器嵌入你的程序中。
答案 6 :(得分:0)
我建议1)CheckSyntax,&#34;一种开发工具,帮助程序员编写符合编码标准的Java代码。&#34;它有许多standard checks和2)FindBugs,&#34;一个程序,它使用静态分析来查找Java代码中的错误。&#34;