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). ___
2
Antworten

Best Practices von Python: Abstrakte Syntaxbäume

Ändern abstrakter Syntaxbäume Ich möchte in der Lage sein, ein ast zu erstellen und zu modifizieren und es dann optional als Python-Byte-Code zur späteren Ausführung ohne Overhead auszugeben. Ich habe mit ast docs für python3.0 und...
26.05.2009, 18:02
1
Antwort

Manipulieren des V8 ast

Ich beabsichtige, eine js-Codeabdeckung direkt im v8-Code zu implementieren. Mein anfängliches Ziel besteht darin, für jede Anweisung im abstrakten Syntaxbaum einen einfachen Ausdruck hinzuzufügen. Ich habe gesehen, dass es eine Klasse AstVisit...
03.04.2013, 11:01
2
Antworten

Ruby-Variablendefinition [duplizieren]

     Diese Frage hat hier schon eine Antwort:                   Verwechslung mit der Zuweisungsoperation innerhalb eines Falschen 'if' block [duplizieren ]                                      3 Antworten                              ...
27.02.2015, 12:35
1
Antwort

Wie erkennen Sie den Unterschied zwischen einer Enum- und einer Bereichs-Enumeration mit libclang?

Ich habe einen C ++ AST-Parser mit der ausgezeichneten C-Schnittstelle libclang ( Ссылка ) geschrieben. Unglücklicherweise scheint es keine Disambiguierung zwischen C ++ 11-Bereichsaufzählungen und altmodischen Aufzählungen zu geben: beide haben...
02.10.2014, 19:25
2
Antworten

Einen Compiler schreiben: Wie man einfache Vorlagen zum Laufen bringt?

Ich habe eine Sprache mit einer sehr C ++ - ähnlichen Syntax. Der Lexer und der Parser sind vorhanden und erzeugen den korrekten AST. Zum größten Teil ist auch das Backend erledigt. Das Basissystem, das der Compiler zum Erstellen von Typen ve...
08.12.2011, 14:23
3
Antworten

Wie kann man AST aus dem Objective-C-Code extrahieren?

Ich muss statischen Objective-C-Code analysieren, hauptsächlich AST, nachdem ich in den möglichen Werkzeugen nachgesehen habe, dass das Clang-Tool von LLVM den AST ablegen kann, also benutzte ich das Terminal, um es mit diesem Befehl zu testen:...
18.05.2012, 08:56
0
Antworten

ASTs: bevorzugen Vererbung oder Varianten? [geschlossen]

In objektorientierten Sprachen ist es üblich, ASTs (Abstract Syntax Trees) mit einfachen Hierarchien (dem Composite-Muster) zu implementieren und sie über Besucher zu durchlaufen. In funktionalen Programmiersprachen ist die Verwendung von Var...
06.10.2014, 12:56
1
Antwort

AST für mehrere Quelldateien mit Clang

Ich mache interprozedurale Datenflussanalyse mit Clang. Momentan benutze ich libtooling, um Quelldateien zu analysieren und AST-Besucher anzurufen. Die Frage ist, wie erstelle ich einen einzelnen AST für mehrere .c-Dateien? Ich habe versucht,...
15.02.2013, 11:50
3
Antworten

___ qstntxt ___

Ich habe einen Datentyp wie folgt mit einer entsprechenden %code% -Instanz gesehen:

%Vor%

Sie können den vollständigen Code in einem Gist auf Github finden.

So kann %code% verwendet werden:

%Vor%

%code% endet als ein Baum, der folgendermaßen aussieht:

%Vor%

%code% kann verwendet werden, um Sequenzen von %code% Operationen ( %code% und %code% ) in eine AST umzuwandeln. Dieser AST kann dann in andere %code% interpretiert werden.

Hier ist zum Beispiel eine Übersetzung von %code% in eine %code% , die sicherstellt, dass die angehängte Zeichenfolge optimal geschieht:

%Vor%

Das ist wirklich nett. Es ist bequem, dass wir sicher sein können, dass %code% anhängen in der richtigen Reihenfolge geschieht. Wir müssen uns nicht um das links-assoziierte %code% s kümmern.

Was mich jedoch beunruhigt, ist, dass die %code% -Instanz für %code% keine legale %code% -Instanz ist.

Nehmen Sie zum Beispiel das erste %code% Gesetz:

%Vor%

Wenn wir %code% be %code% zulassen, erhalten wir Folgendes:

%Vor%

Sie können sehen, dass %code% nicht gleich %code% ist. Die anderen %code% -Gesetze gelten auch aus ähnlichen Gründen nicht.

Hascellers sind in der Regel gegen unrechtmäßige Instanzen. Aber ich denke, das ist ein besonderer Fall. Wir versuchen nur, eine Struktur aufzubauen, die in ein anderes %code% interpretiert werden kann. Im Fall von %code% können wir sicherstellen, dass die %code% -Gesetze für %code% in der Funktion %code% gelten.

  1. Ist es jemals in Ordnung, diese Arten von nicht-rechtmäßigen Instanzen zu verwenden, um einen AST aufzubauen?
  2. Gibt es bestimmte Probleme, auf die bei der Verwendung dieser Arten von nicht-rechtmäßigen Instanzen geachtet werden muss?
  3. Gibt es eine alternative Möglichkeit, Code zu schreiben, der so etwas wie %code% verwendet? Eine Möglichkeit, die Interpretation einer monoidalen Struktur zu ermöglichen, anstatt %code% direkt auf einem Typ zu verwenden?
___ tag123haskell ___ Haskell ist eine funktionale Programmiersprache mit starker statischer Typisierung, verzögerungsfreier Auswertung, umfangreicher Parallelitäts- und Parallelitätsunterstützung und einzigartigen Abstraktionsfunktionen. ___ answer45885875 ___
  

Ist es jemals in Ordnung, diese Arten von nicht-rechtmäßigen Instanzen zu verwenden, um einen AST aufzubauen?

Dies ist eine Frage der Meinung. (Ich bin fest im 'Niemals' Camp.)

  

Gibt es bestimmte Probleme, auf die bei der Verwendung dieser Arten von nicht-rechtmäßigen Instanzen geachtet werden muss?

  • kognitive Belastung für potenzielle Benutzer und zukünftige Betreuer
  • potentielle Fehler, weil wir den Typ an einem Ort verwenden, der Annahmen auf der Basis des (der) gebrochenen Gesetzes (n) macht

Bearbeiten, um Fragen in Kommentaren zu beantworten:

  

Wären Sie in der Lage, konkrete Beispiele dafür zu finden, wie sie die kognitive Belastung der Benutzer erhöhen?

Stellen Sie sich vor, wie verärgert Sie wären, wenn jemand das in C machen würde:

%Vor%

Jetzt müssen wir den Umfang dieser Pseudo-While-Definition und ihrer Implikationen verfolgen. Es ist ein Nicht-Haskell-Beispiel, aber ich denke, das Prinzip ist das gleiche. Wir sollten nicht erwarten, dass die Semantik von %code% in einer bestimmten Quelldatei anders ist, genauso wie wir nicht erwarten sollten, dass die Semantik von %code% für einen bestimmten Datentyp unterschiedlich ist.

Wenn wir sagen, dass etwas ein X ist, dann sollte es ein X sein, weil Leute die Semantik von X verstehen. Das Prinzip hier ist erzeugt keine Ausnahmen zu gut verstandenen Konzepten .

Ich denke, dass der Gebrauch von rechtmäßigen Abstraktionen (wie Monoid) in erster Linie dazu dient, die Notwendigkeit zu verringern, dass Programmierer eine Vielzahl unterschiedlicher Semantiken lernen und sich daran erinnern müssen. Jede von uns geschaffene Ausnahme untergräbt dieses Ziel. In der Tat macht es es noch schlimmer; wir müssen uns an die Abstraktion erinnern und darüber hinaus alle Ausnahmen beachten. (Nebenbei, ich bewundere aber diejenigen, die Englisch als Zweitsprache gelernt haben.)

  

Oder wie kann es zu möglichen Fehlern führen?

einige Bibliothek:

%Vor%

mein Code:

%Vor%

ein anderer Programmierer (oder ich in ein paar Monaten):

%Vor%
  

Gibt es eine alternative Möglichkeit, Code zu schreiben, der so etwas wie Foo verwendet?

Ich würde wahrscheinlich nur den Konstruktor verwenden, um zu konstruieren:

%Vor%

oder machen Sie einen Operator:

%Vor%     
___ answer45887133 ___

Dies wird für meisten nicht-trivialen Datenstrukturen angezeigt. Die einzigen Ausnahmen, die mir von oben in den Sinn kommen, sind (einige) Trie-ähnliche Strukturen.

  1. Ausbalancierte Baumdatenstrukturen erlauben mehrere Ausbalancierungen der meisten Werte. Dies gilt für AVL-Bäume, rot-schwarze Bäume, B-Bäume, 2-3 Finger-Bäume, etc.

  2. Datenstrukturen, die um das "Umbauen" herum entworfen wurden, wie Hood-Melville-Warteschlangen, ermöglichen variable Mengen an Duplizierung innerhalb von Strukturen, die die meisten Werte repräsentieren.

  3. Datenstrukturen, die effiziente Prioritätswarteschlangen implementieren, ermöglichen Mehrfachanordnungen von Elementen.

  4. Hash-Tabellen ordnen Elemente unterschiedlich an, je nachdem, wann Kollisionen auftreten.

Keine dieser Strukturen kann ohne diese Flexibilität asymptotisch so effizient sein. Die Flexibilität bricht jedoch immer Gesetze unter strengster Interpretation. In Haskell ist der einzige gute Weg, dies zu bewältigen, indem man das Modulsystem verwendet, um sicherzustellen, dass niemand das Problem erkennen kann. In experimentell abhängigen Sprachen haben Forscher an Dingen wie der Beobachtungstyptheorie und der Homotopietypentheorie gearbeitet, um bessere Wege zu finden, über "Gleichheit" zu sprechen, aber diese Forschung ist weit davon entfernt, praktisch zu werden.

    
___ tag123interpreter ___ Ein Interpreter ist ein Programm, das in einer Programmiersprache geschriebene Anweisungen ausführt, d. h. ausführt. Der Tag [Dolmetscher] sollte bei Fragen zur Programmierung von Dolmetschern oder für Fragen zum detaillierten Innenleben von Dolmetschern angewendet werden. Verwenden Sie [interpreter-pattern] (möglicherweise mit diesem Tag) für Fragen zum Entwurfsmuster der Gang of Four. ___ answer45886102 ___

Zitieren diese Antwort zu einer ähnlichen Frage :

  

Man kann sich das von diesem alternativen Standpunkt aus vorstellen: das Gesetz (a & lt; & gt; b) & lt; & gt; c = a & lt; & gt; (b & lt; & gt; c) spezifiziert nicht, welche Gleichheit verwendet werden sollte, d. h. welche spezifische Beziehung das = bezeichnet. Es ist naheliegend, es im Hinblick auf die strukturelle Gleichheit zu betrachten, aber beachten Sie, dass sehr wenige Typklassengesetze tatsächlich der strukturellen Gleichheit gerecht werden (zB versuchen, fmap id = id für [] im Gegensatz zu forall x zu beweisen. Fmap id x = id x) .

Zum Beispiel ist es meistens in Ordnung, wenn Sie die Konstruktoren von %code% nicht exportieren und nur Funktionen exportieren, die sich aus Sicht der Benutzer so verhalten, als wäre %code% ein Monoid. Aber die meiste Zeit ist es möglich, eine Repräsentation zu finden, die strukturell ein Monoid ist, in der Praxis gut genug, aber vielleicht nicht so allgemein (unten kann man sich nicht beliebig nach der Tatsache neu zuordnen, weil Interpretation mit Konstruktion vermischt ist). p> %Vor%

( %code% )

Hier ist eine weitere SO-Frage, wo eine nicht-strukturelle Struktur ( %code% ) ) wird zuerst betrachtet.

    
___ tag123abstractsyntaretre ___ Abstrakte Syntaxbäume (ASTs) repräsentieren die rekursive Struktur eines formalen Dokuments (Programmquellcode). ___ tag123monoids ___ Ein Monoid ist eine Menge, die unter einer assoziativen binären Operation geschlossen wird und ein Identitätselement I ∈ hat, so dass für alle a ∈ S, Ia = aI = a gilt. Beachten Sie, dass seine Elemente im Gegensatz zu einer Gruppe keine Inversen aufweisen müssen. Es kann auch als eine Halbgruppe mit einem Identitätselement betrachtet werden. ___ tag123typeclass ___ Type-Klassen in Haskell sind ein Sprachmechanismus zur Unterstützung von Ad-hoc-Polymorphismen. Sie existieren auch in Scala, Coq und Isabelle. ___

Ich habe einen Datentyp wie folgt mit einer entsprechenden Monoid -Instanz gesehen: %Vor% Sie können den vollständigen Code in einem Gist auf Github finden. So kann Foo verwendet werden: %Vor% exampleFoo endet als ein Baum,...
25.08.2017, 15:26
5
Antworten

Wie wandelst du eine nicht angegebene Python-Funktion / Lambda in AST? 2.6

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...
23.09.2009, 21:34