2016-07-29 3 views
2

Für eine gegebene Java-Datei möchte ich prüfen, ob sie syntaktisch korrekt ist. dh. Wenn es an den richtigen Stellen Semikolons hat, passende Klammern usw. Wichtig, ich muss die Datei isoliert von all ihren Abhängigkeiten überprüfen.Syntaxüberprüfung einer Java-Datei

This other answer ist vielversprechend, aber es ist wirklich eine semantische Prüfung statt einer syntaktischen Prüfung. Es tut was ein Compiler tun würde - überprüfen Sie alle Imports-Anweisungen und überprüfen Sie auch externe Klassen, auf die im Code verwiesen wird.

Gibt es eine Möglichkeit, eine echte Syntaxprüfung durchzuführen? (Eine Prüfung, die nur den Rohtext auf die formale Grammatik von Java überprüft)

+0

Ja wir eine IDE verwenden. Es gibt eine große Liste von Legacy-Dateien, die ich analysieren muss, viele ohne die Bibliotheken, die sie benötigen – Fidel

+0

Versuchen Sie, es mit javac zu kompilieren – Jens

+0

Die Antwort, die Sie verlinkt, schlägt vor, Eclipse JDT Parser-Modul, das eine abstrakte Syntax Baum zurückgibt. Das sollte es tun, denke ich. – Thilo

Antwort

2

Erstellen oder verwenden Sie einen Java-Quellcode-Parser. Für einige Parser-Generatoren sind öffentliche Java-Grammatiken verfügbar - Sie könnten damit den Parser erzeugen.

z. Java 8 grammar für ANTLR (keine Ahnung über die Qualität dieser Grammatik, aber Sie müssten Ihre Auswertung machen - aber die Grammatik wurde vom Autor von ANTLR geschrieben, sollte also OK sein, denke ich).

0

Wie Jiri vorgeschlagen hat, verwenden Sie die ANTLR-Bibliothek, um einen Syntax-Checker zu erstellen.

  1. herunterladen und entpacken Sie die ANTLR Grammatiken von here

  2. Laden Sie die ANTLR4 jar von here

  3. Führen Sie den folgenden Befehl Klassen zu erzeugen, aus der Java 8 Grammatik:

    java -jar antlr-4.5.3-complete.jar ~/Downloads/Grammatik-v4-Master/Java8/Java8.g4

  4. Kopieren Sie die .java-Dateien, die in Ihrem Projekt erstellt wurden

Dann können Sie Ihre Syntaxprüfung schreiben:

public static void main(String[] args) throws SAXException, IOException { 

    ANTLRInputStream input = new ANTLRFileStream(args[0]); 
    Java8Lexer lexer = new Java8Lexer(input); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    Java8Parser parser = new Java8Parser(tokens); 

    final StringBuilder errorMessages = new StringBuilder(); 
    parser.addErrorListener(new BaseErrorListener() { 
     @Override 
     public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { 
      String err = String.format("Failed to parse at line %d:%d due to %s", line, charPositionInLine + 1, msg); 
      errorMessages.append(err); 
      errorMessages.append(System.lineSeparator()); 
     } 
    }); 

    parser.compilationUnit(); 
    int syntaxErrors = parser.getNumberOfSyntaxErrors(); 

    if (syntaxErrors == 0) { 
     System.out.println(args[0] + ": PASS"); 
    } else { 
     System.out.println(args[0] + ": FAILED (" + syntaxErrors + " syntax errors"); 
    } 
} 
Verwandte Themen