java - Java 中的语法检查

标签 java syntax-checking

<分区>

我目前正在开发一个具有嵌入式文本编辑器的程序。用户应该在编辑器中键入 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(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 - Java 中的语法检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11298856/

相关文章:

Java找不到类

php - phpMyAdmin 有查询语法检查功能吗?

php 编译器或语法检查器

Java EE 登录页面问题

java:使用缓冲阅读器并检查字符串是否为空

mysql - 关闭 MySQL Workbench 中的错误检查

c# - 除了早期的 .NET Framework 版本之外,Visual Studio 能否针对早期的 C# 语法?

用 JavaScript 检查 JavaScript 语法?

android - JAVA_HOME 不工作

java - Eclipse:无法执行dex:多个dex文件定义Landroid/support/v4/