15

私は現在、テキストエディタが埋め込まれたプログラムに取り組んでいます。ユーザーは、エディターでJavaコードを入力することになっています。次に、エディターに入力されたコードが文字列になります。括弧の欠落やキャッチなしの試行などをチェックするものが欲しいだけです。コンパイルする必要はありません。私はかなり見回しましたが、私はまだプログラミングに不慣れで、難しいもののいくつかを実装することができません。

短くするために:構文エラーについてコードを分析するJavaパッケージを探しています。

4

5 に答える 5

19

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
]
于 2012-07-02T19:01:03.980 に答える
1

Beanshellインタープリターを見ることができます。Javaコード(完全なソースファイルとコードフラグメントの両方)を解釈し、構文に関するエラーを報告できます。

于 2012-07-02T18:38:41.977 に答える
1

ユーザーが正しい構文でJavaコードを入力したことを検証したい場合は、プログラム内から直接javacコンパイラーを呼び出すことができます。

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

クラスパスにtools.jarが必要です。

于 2012-07-02T18:59:17.823 に答える
1

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]

ReplicationUnitにはgetProblems()メソッドがあります。詳細な問題レポートのリストを返します。

于 2012-07-27T13:00:29.717 に答える
0

これは、 EclipseNetbeansではかなり標準的です。

かっこ付きの素晴らしくシンプルなエディタが必要な場合は、Sublimetextに投票してください。

于 2012-07-02T18:14:18.417 に答える