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 erklärt man den abstrakten Syntaxbaum von verketteten Vergleichsoperationen?

Vergleichsoperatoren können in Python verkettet werden, so dass zB x < y < z das Ergebnis von (x < y) and (y < z) angibt, außer dass y garantiert nur einmal ausgewertet wird. Der abstrakte Syntaxbaum dieser Operation sieh...
04.11.2016, 20:46
3
Antworten

Pretty Printing AST mit minimalen Klammern

Ich implementiere einen Pretty-Drucker für einen JavaScript-AST und ich wollte fragen, ob jemand einen "richtigen" Algorithmus kennt, um Ausdrücke mit minimalen Klammern automatisch zu klammern basierend auf der Operator-Priorität und Assoziativ...
04.12.2012, 17:46
3
Antworten

Baumtransformationen mithilfe des Besuchermusters

(Disclaimer: Diese Beispiele werden im Zusammenhang mit dem Aufbau eines Compilers gegeben, aber diese Frage dreht sich alles um das Besuchermuster und erfordert keine Kenntnisse der Compilertheorie.) Ich gehe durch Andrew Appels Modern Compiler...
14.12.2009, 04:41
4
Antworten

Was nützen abstrakte Syntaxbäume?

Ich lerne selbst über das Schreiben eines Interpreters für eine Programmiersprache, und ich habe über abstrakte Syntaxbäume gelesen. Ich habe eine Vorstellung davon, was sie sind, aber ich sehe ihre Verwendung nicht. Warum sind AST nützlich?...
05.10.2010, 00:38
5
Antworten

Einen mathematischen Ausdruck (Funktion) für eine große Anzahl von Eingabewerten schnell auswerten

Die folgenden Fragen Auswerten eines mathematischen Ausdrucks in einer Zeichenfolge Gleichungsanalyse in Python Sicherer Weg zum Analysieren von benutzerdefinierten mathematischen Formeln in Python mathematische Gleichungen a...
05.12.2015, 14:15
2
Antworten

Wie arbeite ich jetzt mit dem AST in Irony?

Ich habe eine Grammatik, die in der Irony-Konsole funktioniert und analysiert, aber ich bekomme nichts in der AST-Baumansicht. Ich folgte dem BASIC- & gt; Javascript-Artikel, der hier gefunden wurde: Ссылка , aber es scheint, dass das Ast-Zeug...
21.02.2013, 21:47
1
Antwort

Python: tief in den Knotenbaum kopieren

Ich versuche, deepcopy (aus dem copy -Modul) zu verwenden, um einen Knotenbaum aus dem ast -Modul zu kopieren. Das scheint nicht zu funktionieren. Ich bekomme seltsame Fehler wie TypeError: required field "name" missing from Functio...
21.07.2011, 14:34
1
Antwort

Wie kann ich einen AST mit ANTLR4 erstellen? [Duplikat]

Ich habe eine ANTLR3-Grammatik, die einen abstrakten Syntaxbaum erstellt. Ich überarbeite ein Upgrade auf ANTLR4. Es scheint jedoch, dass ANTLR4 nur Syntaxbäume und keine abstrakten Syntaxbäume erstellt. Zum Beispiel wird die Option output=AS...
04.04.2013, 23:15
1
Antwort

Zuordnung von ANTLR-Syntaxregeln zu benutzerdefinierten Java AST-Klassen für die Codegenerierung

Ich scheine mit der AST- & gt; StringTemplate Seite der Dinge zu kämpfen, wahrscheinlich weil ich komme, Parser von Hand zu schreiben - & gt; LLVM. Was ich suche, ist eine Möglichkeit, eine Parsing-Regel automatisch mit einer AST-Klasse abzug...
27.11.2012, 04:18
2
Antworten

Wie konstruiere ich manuell einen AST?

Ich lerne gerade über Parsing, aber ich bin ein wenig verwirrt, wie man einen AST erzeugt. Ich habe einen Parser geschrieben, der korrekt überprüft, ob ein Ausdruck einer Grammatik entspricht (er ist stumm, wenn der Ausdruck konform ist, und lös...
12.04.2012, 10:04