Parsen des Java-Quellcodes

8

Ich werde gebeten, eine Software zu entwickeln, die Flow-Chart / Control-Flow des Eingabe-Java-Quellcodes erstellen kann. Also fing ich an, darüber zu forschen und kam zu folgenden Lösungen:

Um Flow-Chart / Control-Flow zu erstellen, muss ich Controlling-Anweisungen und Funktionsaufrufe im angegebenen Source-Code erkennen. Nun habe ich zwei Möglichkeiten zu erkennen:

  1. Parsen Sie den Quellcode, indem Sie meine eigenen Grammatiken schreiben (eine komplexe Lösung, denke ich). Ich denke daran, Antlr dafür zu benutzen.
  2. Lesen Sie Quellcodedateien als Text ein und suchen Sie nach den spezifischen Mustern (kann ineffizient werden)

Bin ich hier richtig? Oder ich vermisse etwas sehr grundlegendes und einfaches? Welcher Ansatz würde weniger Zeit in Anspruch nehmen und effizient arbeiten? Alle anderen Vorschläge in diesem Zusammenhang sind ebenfalls willkommen. Jeder andere effiziente Ansatz würde helfen, da der Eingabequellcode mehrere Dateien umfassen kann und ziemlich komplex sein kann.

Ich bin in .NET Sprachen gut, aber das ist mein erstes großes Projekt in Java. Ich habe Grundkenntnisse im Compiler-Design, daher sollte das Schreiben von Grammatiken für mich nicht unmöglich sein.

Tut mir leid, wenn ich unklar bin. Bitte fragen Sie nach Erklärungen.

    
Sudh 31.03.2011, 08:39
quelle

10 Antworten

7

Ich würde mit Antlr gehen und eine bestehende Java-Grammatik verwenden: Ссылка

    
Peter Knego 31.03.2011, 08:46
quelle
3

In der Regel entscheiden alle Werkzeuge, die Java-Code verarbeiten, zuerst, ob sie die Sprache Java- oder Java-Byte-Code-Dateien verarbeiten wollen. Das ist eine strategische Entscheidung und hängt von Ihrem Anwendungsfall ab. Ich könnte beides für die Flow-Chart-Generierung abbilden. Wenn Sie diese Frage entschieden haben. Es gibt bereits einige Frameworks oder Bibliotheken, die Ihnen dabei helfen könnten. Für das Byte-Code-Engineering gibt es: ASM , JavaAssist , Ruß und BCEL , das scheint tot zu sein. Für das Parsen und Analysieren von Java-Sprachen gibt es: Polyglot , den Eclipse-Compiler und javac. Alle diese beinhalten ein komplettes Compiler-Frontend für Java und sind Open Source.

Ich würde versuchen, meinen eigenen Parser für Java zu schreiben. Ich habe das einmal gemacht. Java hat eine ziemlich komplexe Grammatik, die aber anderswo zu finden ist. Die eigentliche Arbeit beginnt mit der Auflösung von Name und Typ. Und Sie würden beide benötigen, wenn Sie Graphen erstellen möchten, die mehr als einen Methodenkörper abdecken.

    
jmg 31.03.2011 10:09
quelle
2

Eclipse verfügt über eine Bibliothek zum Parsen des Quellcodes und zum Erstellen eines abstrakten Syntaxbaums, mit dem Sie extrahieren können, was Sie wollen.

Siehe hier für ein Tutorial Ссылка

Siehe hier für api Ссылка

    
user1309411 03.04.2012 02:46
quelle
1

Wenn Ihre Anforderungen und die Projektgröße nicht so groß sind, versuchen Sie nicht, Parser zu schreiben, um Ihr eigenes DSL zu erstellen. Für solch eine einfache Aufgabe (Ablaufsteuerung usw.) ist das Codieren von kundenspezifischen Implementierungen eine zeitverschwendende Aufgabe. Sie sollten Ihre Anwendung in die Skriptbibliothek integrieren. MVEL könnte für die Auswertung von Ausdrücken und den Kontrollfluss verwendet werden. Wahrscheinlich, wenn Sie nicht neu in der Programmierung sind und Erfahrung mit .NET innerhalb von ein paar Tagen haben, können Sie Ihr System leicht konstruieren. Wenn die Ausführungszeit und die Kompilierung ein wichtiges Thema für das Projekt sind, ersetzen Sie MVEL durch janino , das bessere Ergebnisse liefert.

Ihre Quelldatei sollte eine einfache Nur-Text-Datei sein und nur if / else / switch-Ausdrücke enthalten. Versuchen Sie nicht, Java oder anwendungsspezifische Klassen oder Methoden zu implementieren, damit Unternehmen oder Betreuer den Code leicht verstehen können. Wenn Ihr Geschäft eine Methodenausführung erfordert, erstellen Sie eine verwandte Klasse und injizieren Sie diese Methoden in MVEL oder JANINO.

MVEL Tutorial: Ссылка

Janino Tutorial: Ссылка

    
ozhan 31.03.2011 09:15
quelle
1
  

Jetzt habe ich zwei Möglichkeiten zu erkennen:

Sie haben viel mehr Möglichkeiten als das. JavaCC wird bereits mit einer Java 1.5-Grammatik ausgeliefert. Ich bin sicher, andere Parser Generatoren dito. Es gibt keinen Grund für Sie, entweder Ihre eigene Grammatik zu schreiben oder Ihren eigenen Parser zu konstruieren.

Und vor allem 'Quellcode-Dateien als Text zu lesen und nach den spezifischen Mustern zu suchen' ist überhaupt keine praktikable Wahl, da sie nicht syntaktisch analysiert wird und daher Java-Programme möglicherweise nicht korrekt erkennen kann.

    
EJP 31.03.2011 09:54
quelle
0

Ihre Eingabedateien sind in Java geschrieben und die Software sollte in Java geschrieben sein, aber dies ist Ihr erstes Projekt in Java? Vor allem würde ich vorschlagen, die Sprache mit kleineren Projekten zu lernen. Außerdem müssen Sie lernen, Grafiken in Java zu verwenden (es gibt verschiedene Bibliotheken). Dann sollten Sie sich darauf konzentrieren, was Sie in Ihren Diagrammen anzeigen möchten. Oder ist Text ausreichend?

    
michelemarcon 31.03.2011 08:48
quelle
0

So würde ich kompilierten Code analysieren. Dies würde Ihnen erlauben, Gläser ohne Quelle zu lesen und zu vermeiden, den Code selbst zu analysieren. Ich würde Objectwebs ASM verwenden, um die Klassendateien zu lesen.

    
Peter Lawrey 31.03.2011 08:48
quelle
0

Die intelligentere Lösung besteht darin, den Java-Parser von Eclipse zu verwenden. Lesen Sie hier mehr: Ссылка

    
nanda 31.03.2011 08:55
quelle
0

Oder noch einfacher: Verwenden Sie Reflektion. Sie sollten in der Lage sein, die Quellen zu kompilieren, die Klassen mit Java Classloader zu laden und sie von dort aus zu analysieren. Ich denke, das ist viel einfacher als jedes Parsing.

    
SACO 31.03.2011 08:52
quelle
0

Unser DMS-Software-Reengineering-Toolkit ist eine Allzweck-Programmanalyse- und -transformationsmaschinerie mit integrierten Funktionen für Parsen, Erstellen von ASTs, Konstruieren von Symboltabellen, Extrahieren von Steuerungs- und Datenflüssen, Umwandeln der ASTs, Zurückschreiben von ASTs in Text usw.

DMS ist durch eine explizite Sprachdefinition parametrisiert und verfügt über eine große Anzahl bereits existierender Definitionen .

DMS Java Front End berechnet bereits Kontroll- und Datenflussdiagramme , so dass Ihr Problem auf das Exportieren reduziert würde.

EDIT 19.7.2014: Behandelt jetzt Java 8.

    
Ira Baxter 31.03.2011 20:31
quelle