2012-04-03 8 views
1

Ich versuche Java-Code-Struktur zu analysieren.Wie konnte ich Java CFG (Control Flow Graph) mithilfe von antlr generieren?

So erzielte ich einen Java-Parser und Lexer durch ANTLRv3 und Java-Grammatik Code ...

aber ich weiß nicht, wie könnte ich Context Flussgraph unter Verwendung der erzeugten Parser und Lexer erzeugen.

Ich habe versucht, zu lernen, wie man dies tutorial Seite, aber die Tutorial-Seite ist bereits verschwunden.

Können Sie mir einen Weg geben, wie man das macht? oder Tutorial-Seite?

Vielen Dank.

Antwort

3

AFAIK, ANTLR bietet keine spezifische Hilfe beim Erstellen eines Kontrollflussdiagramms.

Sie können einen selbst erstellen, indem Sie den AST durchlaufen und Wissen über Aktionen (unbedingte Anweisungen) und Bedingungen (Ausdrucksknoten steuern Bedingungen) sammeln und den Graphen aus diesen Informationen zusammenstellen. Beachten Sie, dass switch-Anweisungen eine Art zusammengesetzte Bedingung sind und als eine Menge von Entscheidungen oder als spezielle N-way-Bedingung behandelt werden müssen.

Die Ausnahmebehandlung kann das ändern, was Sie für "unbedingte Aktionen" halten. Jeder Methodenaufruf hat das Potenzial, den Steuerungsfluss an den Ausnahmebehandler (oder an den Exit der Funktion) umzuleiten, und Sie müssen entscheiden, ob Sie diese in Ihr Steuerungsflussdiagramm aufnehmen möchten. Wenn Sie darüber nachdenken wollen, was das Programm leistet (insbesondere Datenfluss), müssen Sie diese modellieren.

Sie müssen Kontrollflussknoten (nur eine Art Klasse) erstellen, die sich auf Teile des AST beziehen können ("das ist die Aktion") und auf zwei andere Kontrollflussknoten (um if-then-else zu behandeln)); Diese Ausgänge enden als "wahrer Ausgang" und "falscher Ausgang" oder alternativ "weiter zu" und "abfangen zu". Unterklassen davon stellen reine Berechnungen, IF-Anweisungen, TRY-Blöcke usw. dar.

Die Tatsache, dass Java eine reine "strukturierte" Sprache ist, bedeutet, dass Sie das Kontrollflussdiagramm "von unten nach oben" erstellen können; Sie können Bits des Kontrollflussdiagramms erstellen, während Sie Blatt aufwärts durchqueren, und Kontrollflussdiagramme von Kindern kombinieren, während Sie den Baum erklimmen. Was Sie tun müssen, ist ein so weit zusammengesetztes Kontrollflussdiagramm (anfänglich leer an den Blättern) in der Struktur mit einem Verweis auf eine Liste von Kontrollflussknoten in diesem Diagramm, die die Kontrolle an einen Ausnahmebehandler übergeben möchten, zu übergeben. Wenn Sie den Baum erklimmen, erweitern Sie den Kontrollflussgraphen.

Der Großteil der Arbeit geschieht an einem bedingten Knoten, z. B. einem IF-THEN-ELSE-Knoten; In diesem Fall werden zwei Kontrollfluss-Untergraphen mit zwei Gruppen von Ausnahmen an diesen Knoten übergeben. Sie erstellen dann einen Kontrollflussknoten, um die Bedingung darzustellen, setzen ihre Aktion so, dass sie auf den bedingten Ausdruck zeigt, setzen ihre zwei untergeordneten Elemente auf die beiden übergebenen Untergraphen und legen ihre Ausnahmebedingung auf die Vereinigung der Ausnahmebedingung fest.

Unterroutineaufrufe erhalten Ablaufknoten, deren Aktion der Methodenaufruf ist, mit einem Exit zur folgenden Anweisung/Unterausdruck und einem anderen Exit (nicht gefüllt), der schließlich auf die Catch-Klausel zeigt. Fügen Sie den Subroutinenaufrufknoten zur Liste der übermittelten Ausnahmen hinzu.

Behandeln Sie THROW statment ähnlich, obwohl sie keine "nächste" Aktion haben.

Wenn Sie auf ein TRY-Konstrukt stoßen, generieren Sie einen bedingten Knoten, wobei die Aktion auf den try body zeigt, ein Exit auf das Ende von try oder auf einen finally-Subroutinenaufruf. Packen Sie anschließend alle Knoten des Kontrollflusses in der Ausnahmeliste so, dass sie auf die catch-Klausel zeigen.

Sie müssen die Fangklauseln als eine Folge von if-Anweisungen verketten.

Sie müssen "finally" als Unterroutinenaufruf behandeln, der aus der try-Klausel und den verschiedenen catch-Klauseln aufgerufen wird.

+0

Vor allem, vielen Dank für Ihre ausführliche Antwort. Eigentlich habe ich versucht, diesen generierten Parser für mein experimentelles Projekt zu verwenden. Ich brauchte das Kontrollflussdiagramm des Ziel-Quellcodes in JAVA geschrieben. Inzwischen habe ich versucht, dies zu tun, fand ich ein anderes Werkzeug "SOOT" Framework. Wie Sie vielleicht wissen, hat es sehr verschiedene Funktionen für die Code-Analyse. Deshalb habe ich dieses Werkzeug nur für improvisierte Methode verwendet. (Es musste mehr Details erfahren) Aber ich versuche zu lernen, wie man diese "ANTLR" auch verwendet. – RushMan

+0

Es scheint, dass "ANTLR" wirklich nützlich ist, um Computersprache zu manipulieren. (z. B. zum Generieren von Parser anderer kontextfreier Sprache.) Nochmals vielen Dank. – RushMan

+0

ANTLR ist wirklich gut zum * Analysieren * einer Computersprache. Es bietet Standard-Mittel für die Manipulation von ihnen (z. B. AST Walking und manuelle Baumzertrümmerung), aber ich würde nicht diese * gute * Unterstützung für * manipulieren * langauges nennen. Wenn du sehen willst, was ich als gute Unterstützung ansehe, schau dir meine Bio an. –

0

Heute habe ich ein Eclipse-Plug-in gefunden, das Java Control Flow Graph erzeugt: Control Flow Graph Factory. Dieses Plug-In generiert CFG perfekt und speichert es per XML-Datei.

Verwandte Themen