abstract-syntax-tree

___ qstntxt ___

Es scheint, als sollte es einfach sein, aber ich kann die Antwort nirgendwo finden - und auch nicht in der Lage, eine selbst abzuleiten. Wie verwandelst du eine nicht notierte Python-Funktion / Lambda in eine AST?

Hier ist, was ich gerne tun könnte.

%Vor%     
___ qstnhdr ___ Wie wandelst du eine nicht angegebene Python-Funktion / Lambda in AST? 2.6 ___ answer12204014 ___

Die Meta-Bibliothek ermöglicht es Ihnen, die Quelle in vielen Fällen wiederherzustellen, mit einigen Ausnahmen wie Comprehensions und Lambdas.

> %Vor%     
___ answer1468652 ___

Ihr Lambda-Ausdruck ist eine Funktion, die viele Informationen enthält, aber ich glaube nicht, dass ihr Quellcode zugeordnet ist. Ich bin mir nicht sicher, ob du das bekommst, was du willst.

    
___ answer1469053 ___

Sie können AST nicht aus kompiliertem Bytecode generieren. Sie benötigen den Quellcode.

    
___ answer1470481 ___

Wenn Sie nur auf die Funktion / Lambda zugreifen, haben Sie nur den kompilierten Python-Bytecode. Der genaue Python-AST kann nicht aus dem Bytecode rekonstruiert werden, da Informationsverlust im Kompilierungsprozess vorliegt. Aber Sie können den Bytecode analysieren und dafür ASTs erstellen. Es gibt einen solchen Analysator in GeniuSQL. Ich habe auch einen kleinen Proof of Concept, der Bytecode analysiert und daraus SQLAlchemy-Klauselelemente erstellt.

Der Prozess, den ich für die Analyse verwendet habe, ist folgender:

  1. Teilen Sie den Code in eine Liste von Opcodes mit möglichen Argumenten auf.
  2. Finden Sie die grundlegenden Blöcke im Code, indem Sie die Opcodes durchlaufen und für jeden Sprung eine Basisblockgrenze nach dem Sprung und vor dem Sprungziel erstellen
  3. Erstellen Sie ein Kontrollflussdiagramm aus den Basisblöcken.
  4. Gehen Sie durch alle grundlegenden Blöcke mit abstrakten Interpretationsverfolgungsstapel- und Variablenzuweisungen in SSA-Form.
  5. Um den Ausgabeausdruck zu erstellen, rufen Sie einfach den berechneten SSA-Rückgabewert ab.

Ich habe meinen Proof of Concept und Beispiel eingefügt Code verwendet . Dies ist ein nicht sauberer, schnell gehackter Code, aber Sie können darauf aufbauen, wenn Sie möchten. Hinterlassen Sie eine Notiz, wenn Sie etwas Nützliches daraus machen möchten.

    
___ answer1468770 ___

Im Allgemeinen können Sie nicht. Zum Beispiel ist %code% ein Ausdruck - wenn Sie ihn jedoch an eine Funktion oder Methode übergeben, ist das übergebene Argument nur die Zahl %code% , also keine Möglichkeit, den berechneten Ausdruck wiederherzustellen. Der Funktionsquellcode kann manchmal wiederhergestellt werden (allerdings nicht für %code% ), aber "ein nicht angeführter Python-Ausdruck" wird evaluiert , also erhält man nur das Objekt, das den Wert des Ausdrucks hat.

Welches Problem versuchen Sie zu lösen? Es kann andere, tragfähige Ansätze geben.

Bearbeiten : tx an das OP zur Klärung. Es gibt keine Möglichkeit, dies für %code% oder einige andere Fälle zu tun, aber wie ich bereits erwähnt habe, kann der Quellcode manchmal wiederhergestellt werden ...:

%Vor%

%code% hebt %code% an, wenn es den Quellcode für das Objekt, an das Sie es übergeben, nicht erhalten kann. Ich schlage vor, dass Sie den Parsing- und Getsouce-Aufruf in eine Hilfsfunktion umwandeln, die eine Zeichenkette akzeptiert (und sie einfach analysiert) oder eine Funktion (und versucht, Quelltext darauf zu geben, was möglicherweise bessere Fehler in %code% ergibt).

    
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ tag123abstractsyntaretre ___ Abstrakte Syntaxbäume (ASTs) repräsentieren die rekursive Struktur eines formalen Dokuments (Programmquellcode). ___
3
Antworten

Wie extrahiere ich die Namen aus einer einfachen Funktion?

Ich habe dieses Stück Code: %Vor% Von Funktion 'func' möchte ich extrahieren: %Vor% oder so ähnlich: %Vor% bearbeitet Etwas Hintergrund, um zu erklären, warum ich denke, dass ich das tun muss Ich möchte den Code einer trivial...
09.07.2010, 13:09
2
Antworten

Wählen Sie eine AST-Repräsentation in Haskell

Ich arbeite zur Zeit an einem Compiler für funktionale Compiler mit dem Ziel, typbezogene Dinge und leicht fortgeschrittene Techniken in Haskell zu lernen. Ich glaube, ich muss an jeden Knoten in meinem Baum Informationen anhängen, wie Positi...
12.11.2015, 19:20
1
Antwort

Wie erzeuge ich einen AST aus einer Zeichenkette von C ++ mit Clang?

Ich versuche, Clang zu verwenden, um C ++ Quellcode zu bearbeiten, aber ich habe Probleme, die API zu entdecken. Ich möchte eine Zeichenfolge von C ++ Quellcode nehmen und daraus einen AST generieren; etwas wie: %Vor% Gibt es ein minimale...
17.05.2016, 12:19
1
Antwort

Kompiliere python AST zur Methode

Ich habe mit ASTs in Python experimentiert. Ich möchte Methoden ändern, indem ich die ASTs zur Laufzeit transformiere. Ich kann die Quelle einer vorkompilierten Methode mit inspect.getsource() und Ich kann den AST nach Bedarf ändern, indem...
15.08.2011, 02:34
1
Antwort

OCLint ASTMatcher-Regel. Passende NS_ENUM

Ich versuche, eine OCLint-Regel zu erstellen, die den beiden Deklarationen typedef enum und typedef NS_ENUM entspricht, mit wenig Erfolg. Ich habe eine Objective-C-Datei (TestClass.m) mit folgenden enum-Deklarationen: %Vor% Dumping der...
20.04.2015, 17:29
3
Antworten

Gibt es Unterschiede zwischen den Begriffen Bäume und Ableitungsbäume?

Die Begriffe AST (Abstract Syntax Tree), Syntaxbaum und Ableitungsbaum werden von verschiedenen Personen beschrieben, wenn sie sich auf das Ergebnis der Analyse von Texten beziehen, die einer Grammatik entsprechen. Angenommen, wir sprechen über...
20.04.2011, 12:07
2
Antworten

Besuch von Knoten in einem Syntaxbaum mit Python ast-Modul

Ich spiele mit Python ast (abstrakter Syntaxbaum). Ich schrieb folgendes und es besuchte alle Knoten des AST. %Vor% Dann wurden der Py2Neko-Klasse einige Methoden hinzugefügt %Vor% Aber wenn es dann auf eine "print" -Aussage oder eine...
09.02.2011, 16:38
1
Antwort

Wie drucke ich Produktionen und Zeilennummern mit ANTLR4?

Ich versuche, einen Code zu schreiben, der einen ANTLR4-Parser verwendet und damit ASTs für Eingaben erzeugt, die denen der Option -tree in grun ( misc.TestRig ) ähneln. Ich möchte aber zusätzlich, dass die Ausgabe alle Zeilennummern / Offset-...
13.10.2013, 21:52
3
Antworten

Greifen Sie auf den Abstract Syntax Tree der V8 Engine zu

Ist es möglich, für einen bestimmten JavaScript-Code auf den AST der v8-Engine zuzugreifen? Ich arbeite an einem JavaScript Static Analyzer mit V8-Engine.     
26.02.2012, 06:24
4
Antworten

Wie macht man ein Python 'eval' nur innerhalb eines Objektkontextes?

Ist es möglich, etwas wie zu tun? %Vor% in Python..i.e. Haben func1 () und func2 () im Rahmen des Objekts 'c' ausgewertet (wenn sie Mitgliedfunktionen innerhalb dieser Klassendefinition waren)? Ich kann kein einfaches Parsing machen, da die...
17.12.2012, 22:10