Проверка синтаксиса в Java
В настоящее время я работаю над программой, которая имеет встроенный текстовый редактор. Пользователи должны вводить код Java в редакторе. Код, напечатанный в редакторе, затем превращается в строку. Я просто хочу что-то, что проверило бы отсутствие пропущенных скобок или попытку без перехвата и т. Д. Его не нужно компилировать. Я немного осмотрелся, но я все еще новичок в программировании и не могу реализовать некоторые более сложные вещи.
Итак, чтобы сделать его короче: я ищу какой-то пакет Java, который будет анализировать код на наличие синтаксических ошибок.
7 ответов
Начиная с 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<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
]
Вы можете использовать JDT для анализа и анализа источника.
Это пример скалы. Это легко сделать то же самое с 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(). Возвращает список подробных отчетов о проблемах.
Вы можете посмотреть на переводчика Beanshell. Он может интерпретировать код Java (как полный исходный файл, так и фрагменты кода) и сообщать об ошибках по синтаксису.
Это довольно стандартно в Eclipse и Netbeans.
Если вам нужен хороший, простой редактор с проверкой скобок, я бы проголосовал за Sublime text.
Предполагая, что вы хотите проверить, что у пользователя есть входной код Java с правильным синтаксисом, вы можете вызывать компилятор java c непосредственно из вашей программы.
public int com.sun.tools.javac.Main.compile(String[] args);
Вам нужен tools.jar в вашем пути к классам.
Вы, вероятно, можете встроить проверку синтаксиса eclipse в вашу программу.
Я предлагаю 1) CheckSyntax, "инструмент разработки, помогающий программистам писать код Java, соответствующий стандарту кодирования". Он имеет много стандартных проверок и 2) FindBugs, "программу, которая использует статический анализ для поиска ошибок в коде Java".