2012-07-02 9 views
14

現在、テキストエディタが組み込まれているプログラムを作成しています。ユーザーはエディタにjavaコードを入力することになっています。エディタに入力されたコードは、文字列になります。私はちょうど括弧が欠落しているかどうかをチェックするか、キャッチなしで試してみたいと思っています。コンパイルする必要はありません。私はかなり見てきましたが、私はまだプログラミングが初めてで、より難しいものを実装することはできません。構文Javaでのチェック

これを短縮するには:構文エラーのコードを解析するJavaパッケージを探しています。

+2

Eclipseを開始するのに最適な場所は次のとおりです。http://www.eclipse.org – paulsm4

+2

NetBeansは最適な場所です。http://platform.netbeans.org/tutorials/nbm-javacc-lexer.html –

+0

@Steven Morad:答えを選んで、まだ何を探しているのかをお聞かせください – orangepips

答えて

15

Java 6以降では、JavaCompilerを使用してテキストをコンパイルし、ファイルに何らかの問題がある場合はそれを示すDiagnosticオブジェクトを取得できます。したがって、あなたの例では、エディタの内容をJavaCompilerに渡して実行し、問題を報告する必要があります。以下の例では、ファイルに書き出されたエディタテキストを想定しています。

例コード:

ファイル

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

出力

public class HelloBuggyWorld { 
    String test // missing a semicolon 

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

チェッカーをチェックします

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 
] 
0

おそらく、プログラムにEclipseの構文チェッカーを埋め込むことができます。

+2

どうすればそのことをやりますか? –

+0

悲しいことに、私はEclipse Appのその部分の専門家ではありませんが、ここはすばらしいスタートです。 http://www.eclipse.org/articles/article.php?file=Article-JavaCodeManipulation_AST/index.html – Matt

1

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

かっこでチェックして素敵な、簡単なエディタが必要な場合は、Sublime textに投票します。

+1

Sublime TextはStevenの質問に応答するAPIを提供していますか?そうであれば、より具体的。 – Manu

1

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

1

ユーザーが正しい構文で入力されたJavaコードを持っていることを確認したいと仮定した場合、プログラム内から直接javacコンパイラを呼び出すことができます。

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

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

1

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を持っています()。詳細な問題報告のリストを返します。

0

私は、1)CheckSyntax「プログラマーがコーディング標準に準拠したJavaコードを書くための開発ツール」を提案します。それには多くのものがありますstandard checksと2)FindBugs "Javaコードのバグを探すために静的解析を使用するプログラム。"