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:
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.
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.
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: Ссылка
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.
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?
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.
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.
Tags und Links algorithm java parsing compiler-construction logic