2012-07-02 14 views
14

Attualmente sto lavorando su un programma che ha un editor di testo incorporato. Gli utenti dovrebbero digitare il codice java nell'editor. Il codice digitato nell'editor viene quindi trasformato in una stringa. Voglio solo qualcosa che controlli la mancanza di parentesi o una prova senza cattura, ecc. Non ha bisogno di essere compilato. Mi sono guardato intorno un po ', ma sono ancora nuovo nella programmazione e non posso implementare alcune delle cose più difficili.Sintassi Controllo in Java

Quindi per accorciare: sto cercando un pacchetto java che analizzerà il codice per gli errori di sintassi.

+2

Eclipse è il tuo miglior punto di partenza: http://www.eclipse.org – paulsm4

+2

NetBeans è il tuo miglior punto di partenza: http://platform.netbeans.org/tutorials/nbm-javacc-lexer.html –

+0

@Steven Morad: per favore scegli una risposta o commenta quello che stai ancora cercando. – orangepips

risposta

15

A partire da Java 6 è possibile utilizzare JavaCompiler per compilare il testo e recuperare Diagnostic oggetti che indicano quali problemi ha il file (se presente). Quindi per il tuo esempio dovresti prendere il contenuto dell'editor e passarlo a JavaCompiler, eseguirlo e segnalare eventuali problemi. L'esempio che segue presuppone che il testo dell'editor sia scritto su un file.

codice Esempio:

file da verificare

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

uscita

Da eseguire il metodo 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

è possibile incorporare il correttore di sintassi di eclissi nel programma.

+2

Come potrei fare? –

+0

Purtroppo non sono un esperto in quella parte dell'eclissi di eclipse, ma ecco un rapido inizio. dovrebbe essere in grado di andare avanti con esso http://www.eclipse.org/articles/article.php?file=Article-JavaCodeManipulation_AST/index.html – Matt

1

Questo è piuttosto standard in Eclipse e Netbeans.

Se si desidera un editor semplice e semplice con parentesi, si vota per Sublime text.

+1

Does Sublime Text fornisce API che rispondono alla domanda di Steven? più specifico. – Manu

1

È possibile consultare l'interprete Beanshell. Può interpretare il codice Java (sia il file full source che i frammenti di codice) e segnalare errori di sintassi.

1

Supponendo che si desideri convalidare che l'utente abbia inserito il codice java con la sintassi corretta, è possibile richiamare il compilatore javac direttamente dal proprio programma.

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

È necessario tools.jar nel percorso di classe.

1

È possibile utilizzare JDT per analizzare e analizzare la fonte.

Questo è scala esempio. E 'facile da fare lo stesso con 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 ha metodo getProblems(). Restituisce un elenco di report dettagliati sui problemi.

0

Suggerisco 1) CheckSyntax, "uno strumento di sviluppo per aiutare i programmatori a scrivere codice Java conforme a uno standard di codifica". Ha molti standard checks e 2) FindBugs, "un programma che utilizza l'analisi statica per cercare bug nel codice Java."

Problemi correlati