2016-05-04 10 views
3

Ich möchte in der Lage sein, einen Syntaxbaum für Python-Quellcode zu generieren. Dieser Code muss nicht kompilierbar sein, z.Erhalten Sie Parse-Struktur für Python-Code

if x == 5: 

sollte eine Art Baumdarstellung gedreht werden. Ich kann das Python-Compiler-Paket verwenden, um einen Baum zu erstellen, aber dies funktioniert nur für Code, der kompilierbar ist, z.

if x == 5: print True 
+5

Wie würde der Syntaxbaum dieses Teilcodes aussehen?Wie stellst du einen Baum dar, der ein Loch hat? – Kevin

+1

Sie können ['pyparsing'] (https://pypi.python.org/pypi/pyparsing/2.1.1) verwenden, um Ihren eigenen Parser zu schreiben, wenn nichts anderes funktioniert. –

+0

Ich versuche, dieses NLP-Forschungspapier zu replizieren, das eine baumbasierte Struktur für die maschinelle Übersetzung verwendet. Die Struktur des Syntaxbaums ist auf Seite 5 dargestellt. Http://www.phontron.com/paper/oda15ase.pdf – user1879926

Antwort

0

Das Papier, das Sie verknüpft sagt, dass das ast Modul in der Python-Standardbibliothek verwendet. Es sagt auch, dass sie einen Dummy-Körper für den Körper der if Aussage verwendet haben. Verwenden Sie eine Anweisung, die leicht als Dummy-Körper erkannt werden kann, z. B. pass oder einen Funktionsaufruf wie dummy().

0

Unser DMS Software Reengineering Toolkit mit seiner Python front end kann dies tun.

DMS bietet eine Infrastruktur zum Parsen von Code, parametrisiert durch eine Sprachdefinition (z. B. eine Python-Grammatik usw.) und automatisch Erstellen von ASTs sowie die Möglichkeit, diese ASTs zu prüfen/zu navigieren/zu ändern und die resultierende modifizierte Ausgabe zu drucken Bäume.

Die AST-Parsing Maschinen können eine Vielzahl von Sonderfällen behandeln:

  • Parsen von Dateien oder Zeichenkette ("Streams") als (Python) volles Programm. Syntaxfehler in einem Stream werden gemeldet, und wenn sie durch Einfügen oder Löschen einzelner Token reparierbar sind, werden sie repariert.
  • Parsen eines Streams nach einer beliebigen Sprache ohne Terminal.
  • Parsen eines pattern, das einem benannten Grammatik-Nonterminal mit benannten Platzhaltern für die fehlenden Teilbäume entspricht. Ein Musterübereinstimmungs-Ergebnis kann verwendet werden, um mit konkreten ASTs übereinzustimmen, um zu entscheiden, ob sie übereinstimmen oder nicht, und wenn es übereinstimmt, um Bindungen für die Mustervariablen bereitzustellen.
  • Parsen einer gültigen beliebigen Teilzeichenkette. Dies gibt einen Baum mit möglichen fehlenden linken oder rechten Kindern zurück, die das linke und rechte Ende der Teilkette definieren.

Zum Beispiel OP könnten das folgende Muster schreiben, sein Beispiel zu handhaben:

pattern if_x_is_5(s: statement):statement 
    = " if x==5: \s "; 

DMS wird das Muster lesen und den entsprechenden Musterbaum bauen.

Das Papier, das OP verweist, möchte, dass Operatoren und Schlüsselwörter als explizite Artefakte im AST bleiben. Eine Möglichkeit, das zu interpretieren, ist, dass sie wirklich einen konkreten Syntaxbaum wollen. DMS produziert tatsächlich "AST"s which are concrete syntax trees with the constant terminals removed; dies hat den Effekt, dass es sehr nah an dem ist, was ein perfekter AST sein sollte, aber man kann leicht für jeden Blattknoten bestimmen, wo konstante Anschlüsse eingefügt werden sollen (oder man kann DMS konfigurieren, um einfach die unkomprimierten CSTs zu erzeugen).

Persönlich sehe ich nicht, wie das Ziel des Papiers von OPs Interesse wirklich erfolgreich sein kann, nützlichen Pseudo-Code zur Verfügung zu stellen (trotz seiner Ansprüche). Das Verstehen eines Algorithmus erfordert ein Verständnis der entsprechenden Datenstrukturen und der abstrakten und konkreten Algorithmen, die auf diese Datenstrukturen angewendet werden. Das Papier konzentriert sich auf nur auf roher Sprache Syntax; Es gibt keinen Hinweis darauf, die abstrakteren Ideen zu verstehen.

Verwandte Themen