Проверка синтаксиса в Java [закрыто]

В настоящее время я работаю над программой, которая имеет встроенный текстовый редактор. Пользователи должны вводить код Java в редакторе. Код, введенный в редактор, затем превращается в строку. Я просто хочу что-то, что проверило бы отсутствие пропущенных скобок или попытку без перехвата и т. Д. Его не нужно компилировать. Я немного осмотрелся, но я все еще новичок в программировании и не могу реализовать некоторые из более сложных вещей.

Итак, чтобы сделать его короче: я ищу какой-то пакет Java, который будет анализировать код на наличие синтаксических ошибок.

 paulsm402 июл. 2012 г., 20:08
Eclipse - ваше лучшее место для старта:eclipse.org
 a_horse_with_no_name02 июл. 2012 г., 20:11
NetBeans - это лучшее место для начала:platform.netbeans.org/tutorials/nbm-javacc-lexer.html
 orangepips14 июл. 2012 г., 19:08
@ Стивен Морад: пожалуйста, выберите ответ или комментарий, что вы все еще ищете.

Ответы на вопрос(7)

Решение Вопроса

Начиная с Java 6 вы можете использоватьJavaCompiler скомпилировать текст и вернутьсядиагностика объекты, которые сообщают вам о проблемах файла (если есть). Поэтому для вашего примера вам нужно взять содержимое редактора и передать его JavaCompiler, запустить его и сообщить о любых проблемах. В следующем примере предполагается, что текст редактора записан в файл.

Пример кода:

File to Check

public class HelloBuggyWorld {
    String test // missing a semicolon

    public static void main (String [] args) {
        System.out.println('Hello World!');  // should be double quoted
    }
}

Checker

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;
    }
}

Output

От запуска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
]

Beanshell переводчик. Он может интерпретировать код Java (как полный исходный файл, так и фрагменты кода) и сообщать об ошибках по синтаксису.

вероятно, можете встроить проверку синтаксиса затмения в вашу программу.

 03 июл. 2012 г., 02:54
К сожалению, я не эксперт в этой части apl затмения, но здесь быстрое начало. Вы должны быть в состоянии начать с этим.eclipse.org/articles/…
 Steven Morad02 июл. 2012 г., 20:15
Как бы я поступил так?

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 (). Возвращает список подробных отчетов о проблемах.

что вы хотите проверить, что пользователь имеет входной код Java с правильным синтаксисом, вы можете вызывать компилятор javac непосредственно из вашей программы.

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

Вам нужен tools.jar в вашем пути к классам.

Я предлагаю 1)CheckSyntax& quot; средство разработки, помогающее программистам писать код Java, соответствующий стандарту кодирования. & quot; Это имеет многостандартные чекии 2)FindBugs, & quot; программа, которая использует статический анализ для поиска ошибок в коде Java. & quot;

Затмение а такжеNetbeans.

Если вам нужен хороший, простой редактор с проверкой скобок, я бы за него проголосовалВозвышенный текст.

 27 апр. 2015 г., 12:18
Предоставляет ли Sublime Text API, отвечающий на вопрос Стивена? Если так, будьте более конкретны.

Ваш ответ на вопрос