2015-04-23 4 views
6

Was ist der richtige Weg zu überprüfen, ob die angegebene Zeile Java-Code ist?Wie überprüft man, ob die angegebene Codezeile in Java geschrieben ist?

Eingang: LogSupport.java:44 com/sun/Aktivierung/Register/LogSupport log (Ljava/lang/String;) V

Erwartete Ausgabe: false.

Eingabe: Scanner ein = neuer Scanner (System.in);

Erwartete Ausgabe: wahr.

Ich habe versucht Eclipse JDT ASTParser zu überprüfen, ob wir einen AST erstellen können. Hier ist der Code:

public static boolean isJava(String line) { 
    boolean isJava = false; 
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setSource(line.toCharArray()); 
    parser.setResolveBindings(false); 
    ASTNode node = null; 

    parser.setKind(ASTParser.K_STATEMENTS); 
    try { 
     node = parser.createAST(null); 
     if (node == null) return false; 
     isJava = true; 
    } catch (Exception e) { 
     return false; 
    } 
    return isJava; 
} 

Aber das funktioniert nicht. Irgendwelche Ideen? Vielen Dank!

+2

Was bedeutet "das geht nicht"? Erhalten Sie einen Fehler? Ist die Ausgabe anders als erwartet? Möglicherweise erwartet der Parser eine vollständige Java-Quelldatei und nicht nur eine einzelne Zeile (was keine gültige, vollständige Java-Quelldatei ist). – Jesper

+0

Tatsächlich ist Java keine Sprache, die Zeile für Zeile kompiliert und/oder interpretiert wird. Nehmen wir zum Beispiel eine Variablendeklaration, die Sie nicht einfach in eine AST einbauen können, da die Regeln nicht bestimmen könnten, ob es sich um eine lokale Methodenvariable oder ein Klassenattribut handelt. – Gimby

+0

Welche Aussage analysieren Sie? Was ist in 'line.toCharArray()' enthalten? – LittlePanda

Antwort

4

Versuchen Beanshell

http://www.beanshell.org/intro.html

Java Auswertung Features:

auswerten vollständige Java-Source-Klassen dynamisch sowie isoliert Java-Methoden, Anweisungen und Ausdrücke.

Zusammenfassung der Funktionen

Dynamische Ausführung der vollständigen Java-Syntax, Codefragmente Java sowie lose typisierte Java und zusätzliche Scripting-Annehmlichkeiten.

Transparenter Zugriff auf alle Java-Objekte und APIs.

Ausführung in vier Modi: Befehlszeile, Konsole, Applet, Remotesitzungsserver. Kann in Sicherheitsumgebungen ohne Classloader oder Bytecode-Generierung für die meisten Funktionen arbeiten.

Der Interpreter ist klein ~ 150K Jar-Datei.

Reine Java.

Es ist kostenlos !!

Der Link unten ist eine andere Option, die Sie könnten versuchen,

Syntax Checking in Java

1

Was Sie wollen, apparantly wenn eine Zeichenfolge, die Sie sich entscheiden müssen, ist eine gültige Teilkette von der Java-Sprache ist.

Um dies zu tun, benötigen Sie natürlich einen vollständigen Java-Parser als Grundlage. Einige Analysemaschinen können Sie versuchen, die Zeichenfolge als Nichtterminal in der Sprache zu analysieren. Dies ist relativ einfach mit einem rekursiven Descent-Parser zu tun. (Es scheint, dass das Eclipse-Parser das anbietet, basierend auf dem Beispiel von OP).

Wenn Sie jedoch einen Teilstring (e.g,

 57).x=2; foo[15].bar(abc>= 

ist ein gültiges Java-Fragment, Sie benötigen Parsing-Maschinen, die darauf spezialisiert sind.

Unser DMS Software Reengineering Toolkit mit seiner Java Front End wird dies tun. Die Parser-APIs bieten Funktionen zum "Parsen einer vollständigen Kompilierungseinheit", "Parsen eines Nichtterminals" und "Parsen einer Teilzeichenfolge". Die ersten beiden Rückkehrbäume; Letzterer gibt eine Sequenz von Bäumen zurück. Es ist nicht eine beliebige Teilzeichenfolge; Sie können nicht in der Mitte von Token starten oder enden (z. B. ein Zeichenfolgenliteral). Ansonsten parsen sie beliebige Teilstrings.