2016-06-27 10 views
0

Ich arbeite gerade an einem Projekt, um Variablenabhängigkeiten in einer bestimmten Funktion für I/O zu finden, und habe gewählt, mit Pycparser zu arbeiten. Mein Code ist im Moment meist nur eine Besucherklasse und ein paar Knoten-Klassen. Was es tut ist, es durchläuft die AST und erstellt Knoten für jede Variable Zuweisung, Deklaration, Eingabe, Ausgabe und If-Anweisungen. Diese Knoten haben list-Attribut, wo ihre Abhängigkeiten gespeichert werden, zum Beispiel:Variablenabhängigkeit mit Pycparser analysieren

a = b + c/2; 

schaffen würde einen Knoten mit dem Namen ‚a‘, und verbinden Sie es mit dem jüngsten Knoten von ‚b‘ und ‚c‘.

Meine Frage ist von hier: Gibt es eine allgemeine Vorstellung davon, wie ich eine Ausgangsvariable verbinden würde?

Dieser Code gibt uns keine Informationen darüber, welche Abhängigkeiten er abgesehen von den letzten Instanzen von 'b' hat. Alle Lösungen, die ich entwickeln könnte, würden jedoch auch die vorherigen Knoten von 'b' hinzufügen. Beispiel:

b = 3; 
b = b + 4; 

Ich möchte nicht beide dieser 'b' Knoten für meine Ausgabeabhängigkeit. Aber ich würde mehrere Knoten wollen, wenn es mehrere Pfade von If-Anweisungen gibt, aber nur die jüngsten in jedem Pfad. Wenn Sie die Frage vage finden, gibt es Methoden oder Quellen zum Finden von Variablenabhängigkeiten, die Sie empfehlen können? Kurz gesagt, was dieses Projekt erreichen soll, ist für die Ausgabe x (es könnte mehrere Ausgaben geben) Ich möchte in der Lage sein herauszufinden, auf welche Eingaben es angewiesen ist. Dies könnte wiederum mehrere Szenarien in Abhängigkeit von anderen Variablen sein. Beispiel für verschiedene Abhängigkeiten:

int function(int a, int b, int c, int d, bool z){ 
    int x; 
    if(z){ 
     x = a + b; 
    } 
    else{ 
     x = c + d; 
    } 

    return x; 

Antwort

0

Ich habe gerade herausgefunden, dass das, was ich versucht habe, mit der Methode, die ich verwendet habe, unmöglich ist. Was der AST und Pycparser mir zur Verfügung stellen kann, sind alle Variablen, die den Wert einer Variablen bestimmen.

Um mit meinem Problem fortzufahren, müssten Sie beim Erstellen eines CFG (Control Flow Graph) sowie Datenfluss suchen. Dies ist jedoch eine andere Methode und ein Ergebnis vollständig.