Java中的语法检查

15

我目前正在处理一个带有嵌入文本编辑器的程序。用户应该在编辑器中键入java代码。然后将输入到编辑器中的代码变成字符串。我只想要一个可以检查缺少括号或没有catch的try的工具。它不需要被编译。我已经找了很多资源,但我还是编程新手,无法实现一些较难的功能。

所以简而言之:我正在寻找一个Java包,可以分析代码的语法错误。


2
Eclipse是你开始的最佳选择:http://www.eclipse.org - paulsm4
2
NetBeans是您最好的起点:http://platform.netbeans.org/tutorials/nbm-javacc-lexer.html - user330315
@Steven Morad:请选择一个答案或评论您仍在寻找什么。 - orangepips
5个回答

19
截至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(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
]

2
您可以使用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()的方法。它返回详细问题报告的列表。

1

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


1
假设您想验证用户输入的Java代码是否具有正确的语法,那么您可以直接从程序中调用javac编译器。
public int com.sun.tools.javac.Main.compile(String[] args);

你需要在类路径中添加tools.jar。


0

这在EclipseNetbeans中非常标准。

如果你想要一个带有括号检查的漂亮简洁的编辑器,我会推荐Sublime text

1
Sublime Text提供响应Steven问题的API吗?如果是这样,请更具体地说明。 - Manu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接