Java中的语法检查

Java中的语法检查,java,syntax-checking,Java,Syntax Checking,我目前正在开发一个具有嵌入式文本编辑器的程序。用户应该在编辑器中键入java代码。然后,在编辑器中键入的代码被制成字符串。我只想要一些可以检查缺少括号或是不带catch的try,等等。它不需要编译。我已经环顾了很多地方,但我对编程还是新手,不能实现一些更难的东西 因此,为了缩短时间:我正在寻找一些java软件包来分析代码的语法错误。您可能可以将eclipse语法检查器嵌入到您的程序中。这在和中是相当标准的 public int com.sun.tools.javac.Main.compile(S

我目前正在开发一个具有嵌入式文本编辑器的程序。用户应该在编辑器中键入java代码。然后,在编辑器中键入的代码被制成字符串。我只想要一些可以检查缺少括号或是不带catch的try,等等。它不需要编译。我已经环顾了很多地方,但我对编程还是新手,不能实现一些更难的东西


因此,为了缩短时间:我正在寻找一些java软件包来分析代码的语法错误。

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

这在和中是相当标准的

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

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

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

假设您想验证用户输入的Java代码是否具有正确的语法,那么您可以从程序中直接调用javac编译器

public int com.sun.tools.javac.Main.compile(String[] args);
您的类路径中需要tools.jar。

从Java 6开始,您可以使用它编译文本并返回对象,这些对象告诉您文件有什么问题(如果有)。因此,对于您的示例,您需要获取编辑器的内容并将其传递给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;
    }
}
您可以使用来解析和分析源代码

这就是一个例子。使用java也很容易做到这一点:


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

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

Eclipse是您最好的起点:NetBeans是您最好的起点:@Steven Morad:请选择一个答案或评论您仍在寻找的内容。我将如何着手做?遗憾的是,我不是Eclipse api这一部分的专家,但这里有一个快速的起点。你应该能够适应它。升华文本是否提供了回答Steven问题的API?如果是的话,请更具体一些。
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]